a
    .;b                     @   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	   Nlib/python3.9/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 d   n1 s0    Y  |	 }	|
  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   r+   zBTestParUfuncIssues.test_gil_reacquire_deadlock.<locals>.<listcomp>c                    s   g | ]} |d   qS r,   r	   r/   r   r	   r   r1   G   r+   r   )ctypes	CFUNCTYPEc_int32r   r   r   int32copyr   getvalueclosesortedmap
splitlinesrangeassertEqualr   r   r   protor   r$   Znelemr
   ZacopyZbufZ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   rB   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 d   n1 s0    Y  |	 }	|
  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   r+   zCTestParGUfuncIssues.test_gil_reacquire_deadlock.<locals>.<listcomp>c                    s   g | ]} |d   qS r,   r	   r/   r   r	   r   r1   x   r+   r   )r2   r3   r4   r   r   r   r5   r6   r   r7   r8   r9   r:   r;   r<   r=   r   r   r>   r	   rA   r   rB   S   s*    &z/TestParGUfuncIssues.test_gil_reacquire_deadlockN)rC   rD   rE   rF   rB   r	   r	   r	   r   rG   O   s   rG   __main__)r   r2   Znumpyr   Znumba.tests.supportr   Znumbar   r   ZunittestZTestCaser   rG   rC   mainr	   r	   r	   r   <module>   s   D0