a
    .;b                     @   s$  d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZ e jjZe je_g e_ejdkre jjjZe jge_de_dZn*e e j !dj"Ze jge_e j#e_d	Zd
d Z$dZ%dd Z&dd Z'G dd deZ(e)dkr e*  dS )    N)compile_isolatedFlags)jit)errors)TestCasetagnt   ci  c                 C   s$   |D ]}t dt  t | |< qd S )N
   )sleepsleep_factorPyThread_get_thread_identaindicesidx r   3lib/python3.9/site-packages/numba/tests/test_gil.pyf#   s    r   zvoid(int64[:], intp[:])c                 C   s*   t   |D ]}tdt  t | |< q
dS )z/
    Same as f(), but inside a lifted loop
    r   N)objectr   r   r   r   r   r   r   lifted_f/   s    r   c                 C   s*   |D ] }t dt  t  t | |< qdS )z)
    Same as f(), but in object mode
    r   N)r   r   r   r   r   r   r   r   object_f9   s    r   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestGILReleasec                 C   s   t j|t jdS )NZdtype)nparangeZint64)selfZ	n_membersr   r   r   make_test_arrayF   s    zTestGILRelease.make_test_arrayc                 C   s   g }||  dtjdtjd |  d}t|D ]>}tj|jtjd}tj| tj	|||fd}|
| q2|D ]}|  qv|D ]}|  q|S )Nr	   r   2   )targetargs)r   r   r   ZintprangesizeZrandomZshuffle	threadingZThreadappendstartjoin)r   func	n_threadsZthreadsarrir   tr   r   r   run_in_threadsI   s    


zTestGILRelease.run_in_threadsc                 C   s,   | j |dd}t|}| t|d| d S )N   )r)   r	   )r-   setZassertEquallen)r   r(   r*   distinctr   r   r   check_gil_held]   s    zTestGILRelease.check_gil_heldc                 C   sl   dD ]^}|  ||}t|}z| t|d| W n( tyZ } z|}W Y d }~qd }~0 0  d S q|d S )N)r.          r	   )r-   r/   ZassertGreaterr0   AssertionError)r   r(   r)   r*   r1   eZfailurer   r   r   check_gil_releasedb   s    z!TestGILRelease.check_gil_releasedc                 C   s   t tddt}| | dS )zu
        Test the GIL is held by default, by checking serialized runs
        produce deterministic results.
        TnopythonNr   f_sigr   r2   r   cfuncr   r   r   test_gil_heldp   s    zTestGILRelease.test_gil_heldc                 C   s    t tdddt}| | dS )zj
        Test releasing the GIL, by checking parallel runs produce
        unpredictable results.
        Tr9   nogilNr   r;   r   r7   r<   r   r   r   test_gil_releasedx   s    z TestGILRelease.test_gil_releasedc                 C   s   t tddt}| | dS )zz
        Test the GIL can by released by a lifted loop even though the
        surrounding code uses object mode.
        Tr@   N)r   r;   r   r7   r<   r   r   r   $test_gil_released_inside_lifted_loop   s    z3TestGILRelease.test_gil_released_inside_lifted_loopc                    s8   t tddt t tddd fdd}| | dS )zh
        Releasing the GIL in the caller is sufficient to have it
        released in a callee.
        Tr8   r?   c                    s    | | d S Nr   r   r+   Z
compiled_fr   r   caller   s    z:TestGILRelease.test_gil_released_by_caller.<locals>.callerNrA   r   rH   r   rG   r   test_gil_released_by_caller   s    z*TestGILRelease.test_gil_released_by_callerc                    s:   t tdddt t tddd fdd}| | dS )zR
        Same, but with both caller and callee asking to release the GIL.
        Tr?   c                    s    | | d S rE   r   rF   rG   r   r   rH      s    zETestGILRelease.test_gil_released_by_caller_and_callee.<locals>.callerNrA   rI   r   rG   r   &test_gil_released_by_caller_and_callee   s    z5TestGILRelease.test_gil_released_by_caller_and_calleec                    s8   t tdddt t tdd fdd}| | dS )zP
        When only the callee asks to release the GIL, it gets ignored.
        Tr?   r8   c                    s    | | d S rE   r   rF   rG   r   r   rH      s    z9TestGILRelease.test_gil_ignored_by_callee.<locals>.callerNr:   rI   r   rG   r   test_gil_ignored_by_callee   s    
z)TestGILRelease.test_gil_ignored_by_calleec                 C   st   t jdd.}t dtj ttddt}W d   n1 s@0    Y  | t	dd |D | | 
|d dS )	za
        When the function is compiled in object mode, a warning is
        printed out.
        T)recordalwaysrC   Nc                 s   s(   | ] }|j tju od t|jv V  qdS )z:Code running in object mode won't allow parallel executionN)categoryr   NumbaWarningstrmessage).0wr   r   r   	<genexpr>   s   z2TestGILRelease.test_object_mode.<locals>.<genexpr>   )warningscatch_warningssimplefilterr   rP   r   r;   r   Z
assertTrueanyr-   )r   Zwlistr=   r   r   r   test_object_mode   s    .zTestGILRelease.test_object_modeN)__name__
__module____qualname__r   r-   r2   r7   r>   rB   rD   rJ   rK   rL   r[   r   r   r   r   r   D   s   

r   __main__)+ZctypesZctypes.utilossysr$   rW   Znumpyr   ZunittestZnumba.core.compilerr   r   Znumbar   Z
numba.corer   Znumba.tests.supportr   r   Z	pythonapir   Zc_longZrestypeargtypesnameZwindllZkernel32ZSleepr   Zc_uintr   ZCDLLutilZfind_libraryZusleepZc_intr   r;   r   r   r   r\   mainr   r   r   r   <module>   s<   





r
