
     iN                     t   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Jr  \ R"                  R$                  r\ R&                  \l        / \l        \R,                  S:X  a<  \ R.                  R0                  R2                  r\ R6                  /\l        S\l        SrOZ\ R:                  " \ R<                  R?                  S5      5      R@                  r\ R6                  /\l        \ RB                  \l        SrS	 r"S
r#S r$S r% " S S\5      r&\'S:X  a  \RP                  " 5         gg)    N)jit)errors)TestCasetagskip_if_freethreadingnt   ci  c                 R    U H!  n[        S[        -  5        [        5       X'   M#     g )N
   )sleepsleep_factorPyThread_get_thread_identaindicesidxs      K/mnt/rpi/venvs/whisper/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                   j    \ rS rSrS rS rS rS r\S 5       r	S r
S rS	 rS
 r\S 5       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   )r8   r	   )r=   setassertEquallen)r%   r7   r:   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=   rA   assertGreaterrC   AssertionError)r%   r7   r8   r:   rD   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   rE   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rR   nogilNr   rT   r   rN   rU   s     r   test_gil_released TestGILRelease.test_gil_releasedx   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forceobjr[   N)r   rT   r   rN   rU   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.
TrQ   rZ   c                    > T" X5        g N r   r;   
compiled_fs     r   caller:TestGILRelease.test_gil_released_by_caller.<locals>.caller       qr   Nr\   r%   rj   ri   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.
TrZ   c                    > T" X5        g rf   rg   rh   s     r   rj   ETestGILRelease.test_gil_released_by_caller_and_callee.<locals>.caller   rl   r   Nr\   rm   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.
TrZ   rQ   c                    > T" X5        g rf   rg   rh   s     r   rj   9TestGILRelease.test_gil_ignored_by_callee.<locals>.caller   rl   r   NrS   rm   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   rT   r   
assertTrueanyr=   )r%   wlistrV   s      r   test_object_modeTestGILRelease.test_object_mode   s    
 $$D1U!!(F,?,?@D9(CE 2 	 ,%*, ,-2	4 	E1% 21s   ?B
Brg   N)__name__
__module____qualname____firstlineno__r'   r=   rE   rN   r   rW   r]   rb   rn   rs   rx   r   __static_attributes__rg   r   r   r   r   C   sW    4(5
 # #''	(( $ $&r   r   __main__))ctypesctypes.utilossysr2   r   numpyr"   unittestnumbar   
numba.corer   numba.tests.supportr   r   r   	pythonapir   c_longrestypeargtypesnamewindllkernel32Sleepr   c_uintr   CDLLutilfind_libraryusleepc_intr   rT   r   r   r   r   mainrg   r   r   <module>r      s     	 
       D D #,,FF $*MM  !%'  " 77d?MM""((Emm_ENEMLKK0056==Emm_ENLLEML- 	"--q&X q&h zMMO r   