
    wiN                        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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skip_if_freethreadingnt   ci  c                 `    |D ]*}t          dt          z             t                      | |<   +d S )N
   )sleepsleep_factorPyThread_get_thread_identaindicesidxs      d/root/.openclaw/workspace/chatterbox_venv_py311/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ed             Zd Z	d Z
d Zd	 Ze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   )r6   r	   )r;   setassertEquallen)r$   r5   r8   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$   r5   r6   r8   rA   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   rB   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rM   nogilNr   rO   r   rJ   rP   s     r   test_gil_releasedz TestGILRelease.test_gil_releasedx   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forceobjrU   N)r   rO   r   rJ   rP   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.
        TrL   rT   c                       | |           d S N r   r9   
compiled_fs     r   callerz:TestGILRelease.test_gil_released_by_caller.<locals>.caller       Jq!r   NrV   r$   rb   ra   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.
        TrT   c                       | |           d S r^   r_   r`   s     r   rb   zETestGILRelease.test_gil_released_by_caller_and_callee.<locals>.caller   rc   r   NrV   rd   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.
        TrT   rL   c                       | |           d S r^   r_   r`   s     r   rb   z9TestGILRelease.test_gil_ignored_by_callee.<locals>.caller   rc   r   NrN   rd   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alwaysrY   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   rq   r   rO   r   
assertTrueanyr;   )r$   wlistrQ   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;   rB   rJ   r   rR   rW   r[   re   rh   rk   r~   r_   r   r   r   r   C   s        4 4 4  (5 5 5
   # # #' ' '' ' '	( 	( 	(( ( ( $ $ $& & & & &r   r   __main__))ctypesctypes.utilossysr0   rx   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   rO   r   r   r   r   mainr_   r   r   <module>r      s        				 



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