U
    ?h                     @   st   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	Z	G dd de	j
ZG dd de	j
Zedkrpe	  dS )	    N)captured_stdout)	vectorizeguvectorizec                   @   s    e Zd ZdZdd Zdd ZdS )TestParUfuncIssuesFc                 C   s^   t ddddd }d}|dkrZt| td }}tj|| ||| |d	 }qd
S )z
        Related to #89.
        This does not test #89 but tests the fix for it.
        We want to make sure the worker threads can be used multiple times
        and with different time gap between each execution.
        zfloat64(float64, float64)parallel)targetc                 S   s   | | S N )abr	   r	   a/var/www/html/venv/lib/python3.8/site-packages/numba/tests/npyufunc/test_parallel_ufunc_issues.pyfnv   s    z4TestParUfuncIssues.test_thread_response.<locals>.fnv   gh㈵>i    N)r   timesleepnparangetestingassert_equal)selfr   Z
sleep_timer
   r   r	   r	   r   test_thread_response   s    


z'TestParUfuncIssues.test_thread_responsec              
      s   t dt j}dfdd}|| tdgddd fd	d
}dD ]}tj|tjd}| }t }||}W 5 Q R X |	 }	|
  ttdd |	 }
dd t|D }|fddt|D 7 }t|}| |
| tj|d|  qFdS )z<
        Testing issue #1998 due to GIL reacquiring
        N
abcdefghijc                    s   t  |   d S r   printx
charactersr	   r   bar+   s    z;TestParUfuncIssues.test_gil_reacquire_deadlock.<locals>.barzint32(int32)r   Tr   Znopythonc                    s    t | d   | d  | d S )N
   r   r   r   cbarr	   r   foo1   s    z;TestParUfuncIssues.test_gil_reacquire_deadlock.<locals>.foor   r!   d   i  Zdtypec                 S   s   |   S r   stripr   r	   r	   r   <lambda>D       z@TestParUfuncIssues.test_gil_reacquire_deadlock.<locals>.<lambda>c                 S   s   g | ]}t |d  qS r!   str.0r   r	   r	   r   
<listcomp>F   s     zBTestParUfuncIssues.test_gil_reacquire_deadlock.<locals>.<listcomp>c                    s   g | ]} |d   qS r,   r	   r/   r   r	   r   r1   G   s     r   )ctypes	CFUNCTYPEc_int32r   r   r   int32copyr   getvalueclosesortedmap
splitlinesrangeassertEqualr   r   r   protor   r$   Znelemr
   ZacopybufgotstdoutZ
got_outputZexpected_outputr	   r#   r   r   test_gil_reacquire_deadlock#   s&    z.TestParUfuncIssues.test_gil_reacquire_deadlockN)__name__
__module____qualname___numba_parallel_test_r   rD   r	   r	   r	   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )TestParGUfuncIssuesFc              
      s   t dt j}dfdd}|| tdgdddd	 fd
d}dD ]}tj|tjd}| }t }||}W 5 Q R X |	 }	|
  ttdd |	 }
dd t|D }|fddt|D 7 }t|}| |
| tj|d|  qHdS )zR
        Testing similar issue to #1998 due to GIL reacquiring for Gufunc
        Nr   c                    s   t  |   d S r   r   r   r   r	   r   r   [   s    z<TestParGUfuncIssues.test_gil_reacquire_deadlock.<locals>.barz(int32, int32[:])z()->()r   Tr    c                    s(   t | d   | d  | d |d< d S )Nr!   r   r   r   )r   outr"   r	   r   r$   a   s    z<TestParGUfuncIssues.test_gil_reacquire_deadlock.<locals>.foor%   r'   c                 S   s   |   S r   r(   r   r	   r	   r   r*   u   r+   zATestParGUfuncIssues.test_gil_reacquire_deadlock.<locals>.<lambda>c                 S   s   g | ]}t |d  qS r,   r-   r/   r	   r	   r   r1   w   s     zCTestParGUfuncIssues.test_gil_reacquire_deadlock.<locals>.<listcomp>c                    s   g | ]} |d   qS r,   r	   r/   r   r	   r   r1   x   s     r   )r2   r3   r4   r   r   r   r5   r6   r   r7   r8   r9   r:   r;   r<   r=   r   r   r>   r	   rC   r   rD   S   s,     z/TestParGUfuncIssues.test_gil_reacquire_deadlockN)rE   rF   rG   rH   rD   r	   r	   r	   r   rI   O   s   rI   __main__)r   r2   numpyr   Znumba.tests.supportr   Znumbar   r   ZunittestZTestCaser   rI   rE   mainr	   r	   r	   r   <module>   s   D0