
    J/Ph                        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
 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    r(e j        j        j        Ze j        ge_        de_        dZnH e j        e j                            d                    j        Ze j        ge_        e j         e_        dZd	 Z!d
Z"d Z#d Z$ G d de          Z%e&dk    r ej'                     dS dS )    N)jit)errors)TestCasetagnt   ci  c                 `    |D ]*}t          dt          z             t                      | |<   +d S )N
   )sleepsleep_factorPyThread_get_thread_identaindicesidxs      T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/tests/test_gil.pyfr   "   sA    
  - -b<   *,,#- -    zvoid(int64[:], intp[:])c                 |    t                       |D ]*}t          dt          z             t                      | |<   +dS )z/
    Same as f(), but inside a lifted loop
    r   N)objectr   r   r   r   s      r   lifted_fr   .   sJ     HHH - -b<   *,,#- -r   c                 |    |D ]8}t          dt          z             t                       t                      | |<   9dS )z)
    Same as f(), but in object mode
    r   N)r   r   r   r   r   s      r   object_fr   8   sJ      - -b<   *,,#	- -r   c                   P    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )TestGILReleasec                 B    t          j        |t           j                  S )Ndtype)nparangeint64)self	n_memberss     r   make_test_arrayzTestGILRelease.make_test_arrayE   s    y"(3333r   c                    g } ||                      d          t          j        dt          j                             |                      d          }t	          |          D ]s}t          j        |j        t          j                  }t          j                            |           t          j	        |||f          }|
                    |           t|D ]}|                                 |D ]}|                                 |S )Nr   r   2   )targetargs)r%   r    r!   intprangesizerandomshuffle	threadingThreadappendstartjoin)r#   func	n_threadsthreadsarrir   ts           r   run_in_threadszTestGILRelease.run_in_threadsH   s    	T!!!$$bi&A&A&ABBB""2&&y!! 	 	A i888GIg&&& C>BBBANN1 	 	AGGIIII 	 	AFFHHHH
r   c                     |                      |d          }t          |          }|                     t          |          d|           d S )N   )r5   r   )r:   setassertEquallen)r#   r4   r7   distincts       r   check_gil_heldzTestGILRelease.check_gil_held\   sI    !!$!!44s88X844444r   c                     dD ]g}|                      ||          }t          |          }	 |                     t          |          d|            d S # t          $ r}|}Y d }~`d }~ww xY w|)N)r<          r   )r:   r=   assertGreaterr?   AssertionError)r#   r4   r5   r7   r@   efailures          r   check_gil_releasedz!TestGILRelease.check_gil_releaseda   s    $ 
	 
	I %%dI66C3xxH""3x==!X>>>  "    s   $A
A(A##A(c                 x     t          t          d          t                    }|                     |           dS )zu
        Test the GIL is held by default, by checking serialized runs
        produce deterministic results.
        TnopythonNr   f_sigr   rA   r#   cfuncs     r   test_gil_heldzTestGILRelease.test_gil_heldo   s:    
 *ED)))!,,E"""""r   c                 z     t          t          dd          t                    }|                     |           dS )zj
        Test releasing the GIL, by checking parallel runs produce
        unpredictable results.
        TrL   nogilNr   rN   r   rI   rO   s     r   test_gil_releasedz TestGILRelease.test_gil_releasedw   s<    
 6ED555a88&&&&&r   c                 z     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forceobjrT   N)r   rN   r   rI   rO   s     r   $test_gil_released_inside_lifted_loopz3TestGILRelease.test_gil_released_inside_lifted_loop   s<    
 6ED555h??&&&&&r   c                      t          t          d          t                    t          t          dd          fd            }|                     |           dS )zh
        Releasing the GIL in the caller is sufficient to have it
        released in a callee.
        TrK   rS   c                       | |           d S N r   r8   
compiled_fs     r   callerz:TestGILRelease.test_gil_released_by_caller.<locals>.caller       Jq!r   NrU   r#   ra   r`   s     @r   test_gil_released_by_callerz*TestGILRelease.test_gil_released_by_caller   sn    
 /S...q11
	UT	.	.	.	 	 	 	 
/	.	'''''r   c                      t          t          dd          t                    t          t          dd          fd            }|                     |           dS )zR
        Same, but with both caller and callee asking to release the GIL.
        TrS   c                       | |           d S r]   r^   r_   s     r   ra   zETestGILRelease.test_gil_released_by_caller_and_callee.<locals>.caller   rb   r   NrU   rc   s     @r   &test_gil_released_by_caller_and_calleez5TestGILRelease.test_gil_released_by_caller_and_callee   sp     ;ST:::1==
	UT	.	.	.	 	 	 	 
/	.	'''''r   c                      t          t          dd          t                    t          t          d          fd            }|                     |           dS )zP
        When only the callee asks to release the GIL, it gets ignored.
        TrS   rK   c                       | |           d S r]   r^   r_   s     r   ra   z9TestGILRelease.test_gil_ignored_by_callee.<locals>.caller   rb   r   NrM   rc   s     @r   test_gil_ignored_by_calleez)TestGILRelease.test_gil_ignored_by_callee   sn     ;ST:::1==
	UT	"	"	"	 	 	 	 
#	"	F#####r   c                 n   t          j        d          5 }t          j        dt          j                    t          t          dd          t                    }ddd           n# 1 swxY w Y   |                     t          d |D                       |           | 
                    |d           dS )za
        When the function is compiled in object mode, a warning is
        printed out.
        T)recordalwaysrX   Nc              3   h   K   | ]-}|j         t          j        u od t          |j                  v V  .dS )z:Code running in object mode won't allow parallel executionN)categoryr   NumbaWarningstrmessage).0ws     r   	<genexpr>z2TestGILRelease.test_object_mode.<locals>.<genexpr>   s[       , , ! J&*== o \`cdedm`n`n n, , , , , ,r      )warningscatch_warningssimplefilterr   rp   r   rN   r   
assertTrueanyr:   )r#   wlistrP   s      r   test_object_modezTestGILRelease.test_object_mode   s   
 $D111 	DU!(F,?@@@9CD999(CCE	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	 , ,%*, , , , ,-2	4 	4 	4 	E1%%%%%s   AA''A+.A+N)__name__
__module____qualname__r%   r:   rA   rI   rQ   rV   rZ   rd   rg   rj   r}   r^   r   r   r   r   C   s        4 4 4  (5 5 5
  # # #' ' '' ' '	( 	( 	(( ( ($ $ $& & & & &r   r   __main__)(ctypesctypes.utilossysr/   rw   numpyr    unittestnumbar   
numba.corer   numba.tests.supportr   r   	pythonapir   c_longrestypeargtypesnamewindllkernel32Sleepr   c_uintr   CDLLutilfind_libraryusleepc_intr   rN   r   r   r   r~   mainr^   r   r   <module>r      s        				 



                       - - - - - - - - #,F $*M  !%'  " 7d??M"(Em_ENEMLLFK005566=Em_ENLEML- - - 	"- - -- - -o& o& o& o& o&X o& o& o&d zHMOOOOO r   