
    sh                     p   S SK r S SKr S SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJr  S SKJrJr  \ R                   R"                  r\ R$                  \l        / \l        \R*                  S:X  a<  \ R,                  R.                  R0                  r\ R4                  /\l        S\l        SrOZ\ R8                  " \ R:                  R=                  S5      5      R>                  r\ R4                  /\l        \ R@                  \l        SrS	 r!S
r"S r#S r$ " S S\5      r%\&S:X  a  \RN                  " 5         gg)    N)jit)errors)TestCasetagnt   ci  c                 R    U H!  n[        S[        -  5        [        5       X'   M#     g )N
   )sleepsleep_factorPyThread_get_thread_identaindicesidxs      h/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/tests/test_gil.pyfr   "   s%    
 b< *,     zvoid(int64[:], intp[:])c                 f    [        5         U H!  n[        S[        -  5        [        5       X'   M#     g)z'
Same as f(), but inside a lifted loop
r   N)objectr   r   r   r   s      r   lifted_fr   .   s*     Hb< *, r   c                 f    U H+  n[        S[        -  5        [        5         [        5       X'   M-     g)z!
Same as f(), but in object mode
r   N)r   r   r   r   r   s      r   object_fr   8   s*     b< *,	 r   c                   V    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)TestGILReleaseC   c                 H    [         R                  " U[         R                  S9$ )Ndtype)nparangeint64)self	n_memberss     r   make_test_arrayTestGILRelease.make_test_arrayE   s    yy"((33r   c                    / nU" U R                  S5      [        R                  " S[        R                  S95        U R                  S5      n[	        U5       Hv  n[        R                  " UR
                  [        R                  S9n[        R                  R                  U5        [        R                  " XU4S9nUR                  U5        Mx     U H  nUR                  5         M     U H  nUR                  5         M     U$ )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_threadsTestGILRelease.run_in_threadsH   s     	T!!!$bii&AB""2&y!A ii8GIIg&  >BANN1 " AGGI AFFH 
r   c                 r    U R                  USS9n[        U5      nU R                  [        U5      SU5        g )N   )r7   r   )r<   setassertEquallen)r$   r6   r9   distincts       r   check_gil_heldTestGILRelease.check_gil_held\   s6    !!$!!4s8X84r   c                     S H<  nU R                  X5      n[        U5      n U R                  [        U5      SU5          g    We! [         a  nUn S nAMT  S nAff = f)N)r?          r   )r<   r@   assertGreaterrB   AssertionError)r$   r6   r7   r9   rC   efailures          r   check_gil_released!TestGILRelease.check_gil_releaseda   se    $I %%d6C3xH""3x=!X>  % 	 " s   A
AAAc                 V    [        [        SS9" [        5      nU R                  U5        g)z]
Test the GIL is held by default, by checking serialized runs
produce deterministic results.
TnopythonNr   f_sigr   rD   r$   cfuncs     r   test_gil_heldTestGILRelease.test_gil_heldo   s#    
 ED)!,E"r   c                 X    [        [        SSS9" [        5      nU R                  U5        g)zR
Test releasing the GIL, by checking parallel runs produce
unpredictable results.
TrQ   nogilNr   rS   r   rM   rT   s     r   test_gil_released TestGILRelease.test_gil_releasedw   s%    
 ED5a8&r   c                 X    [        [        SSS9" [        5      nU R                  U5        g)zb
Test the GIL can by released by a lifted loop even though the
surrounding code uses object mode.
TforceobjrZ   N)r   rS   r   rM   rT   s     r   $test_gil_released_inside_lifted_loop3TestGILRelease.test_gil_released_inside_lifted_loop   s%    
 ED5h?&r   c                    ^ [        [        SS9" [        5      m[        [        SSS9U4S j5       nU R                  U5        g)zP
Releasing the GIL in the caller is sufficient to have it
released in a callee.
TrP   rY   c                    > T" X5        g N r   r:   
compiled_fs     r   caller:TestGILRelease.test_gil_released_by_caller.<locals>.caller       qr   Nr[   r$   ri   rh   s     @r   test_gil_released_by_caller*TestGILRelease.test_gil_released_by_caller   s?    
 .q1
	UT	.	 
/	'r   c                    ^ [        [        SSS9" [        5      m[        [        SSS9U4S j5       nU R                  U5        g)zB
Same, but with both caller and callee asking to release the GIL.
TrY   c                    > T" X5        g re   rf   rg   s     r   ri   ETestGILRelease.test_gil_released_by_caller_and_callee.<locals>.caller   rk   r   Nr[   rl   s     @r   &test_gil_released_by_caller_and_callee5TestGILRelease.test_gil_released_by_caller_and_callee   sA     T:1=
	UT	.	 
/	'r   c                    ^ [        [        SSS9" [        5      m[        [        SS9U4S j5       nU R                  U5        g)z@
When only the callee asks to release the GIL, it gets ignored.
TrY   rP   c                    > T" X5        g re   rf   rg   s     r   ri   9TestGILRelease.test_gil_ignored_by_callee.<locals>.caller   rk   r   NrR   rl   s     @r   test_gil_ignored_by_callee)TestGILRelease.test_gil_ignored_by_callee   s?     T:1=
	UT	"	 
#	F#r   c                 D   [         R                  " SS9 n[         R                  " S[        R                  5        [        [        SSS9" [        5      nSSS5        U R                  [        S W 5       5      U5        U R                  WS5        g! , (       d  f       NC= f)zI
When the function is compiled in object mode, a warning is
printed out.
T)recordalwaysr_   Nc              3      #    U  H@  nUR                   [        R                  L =(       a    S [        UR                  5      ;   v   MB     g7f)z:Code running in object mode won't allow parallel executionN)categoryr   NumbaWarningstrmessage).0ws     r   	<genexpr>2TestGILRelease.test_object_mode.<locals>.<genexpr>   sG      ,%* JJ&*=*== o \`cdedmdm`n no%*s   AA
   )warningscatch_warningssimplefilterr   r~   r   rS   r   
assertTrueanyr<   )r$   wlistrU   s      r   test_object_modeTestGILRelease.test_object_mode   s    
 $$D1U!!(F,?,?@D9(CE 2 	 ,%*, ,-2	4 	E1% 21s   ?B
Brf   N)__name__
__module____qualname____firstlineno__r&   r<   rD   rM   rV   r\   ra   rm   rr   rw   r   __static_attributes__rf   r   r   r   r   C   s9    4(5
#''	(($&r   r   __main__)(ctypesctypes.utilossysr1   r   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   rS   r   r   r   r   mainrf   r   r   <module>r      s     	 
       - #,,FF $*MM  !%'  " 77d?MM""((Emm_ENEMLKK0056==Emm_ENLLEML- 	"--o&X o&d zMMO r   