
    i\                     >   d dl mZ d dlmZ dZ ee           d                    d e                    d          D                       Z	d                    d e                    d          D                       Z
d dlmZ ej        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Zd dlmZ d	Zd d
lmZ d Z G d de          Z G d dej                  Ze G d dej                               Z!e G d dej                               Z"e G d dej                               Z#e G d dej$                              Z$e G d dej%                              Z%e G d dej%                              Z&e G d dej'                              Z'e G d dej%                              Z(e G d  d!ej)                              Z)e G d" d#ej*                              Z*e G d$ d%ej+                              Z+e,d&k    r ej-                     dS dS )'    )xrangeNa  from gevent import monkey; monkey.patch_all()
from gevent.event import Event
from gevent.lock import RLock, Semaphore, BoundedSemaphore
from gevent.thread import allocate_lock as Lock
import threading
threading.Event = Event
threading.Lock = Lock
# NOTE: We're completely patching around the allocate_lock
# patch we try to do with RLock; our monkey patch doesn't
# behave this way, but we do it in tests to make sure that
# our RLock implementation behaves correctly by itself.
# However, we must test the patched version too, so make it
# available.
threading.NativeRLock = threading.RLock
threading.RLock = RLock
threading.Semaphore = Semaphore
threading.BoundedSemaphore = BoundedSemaphore

c              #       K   | ]	}d |z  V  
dS )z            %sN .0lines     I/usr/local/lib/python3.11/dist-packages/gevent/tests/test__threading_2.py	<genexpr>r      s(      KK$t+KKKKKK    c              #       K   | ]	}d |z  V  
dS )z                %sNr   r   s     r
   r   r      s(      OOD(4/OOOOOOr   )support)
lock_testsF)patchc                 j     t          j        t          j        ot          j        d          |           S )Nz#SKIPPED: Timeout on PyPy3 on Travis)unittestskipIf	greentestPYPY3RUNNING_ON_CI)clss    r
   skipDueToHangr   3   s9    8?3I3-  
  r   c                   &    e Zd Zd Zd Zd Zd ZdS )Counterc                     d| _         d S )Nr   valueselfs    r
   __init__zCounter.__init__;   s    


r   c                 &    | xj         dz  c_         d S N   r   r   s    r
   inczCounter.inc>       

a



r   c                 &    | xj         dz  c_         d S r"   r   r   s    r
   deczCounter.decA   r%   r   c                     | j         S Nr   r   s    r
   getzCounter.getD   s
    zr   N)__name__
__module____qualname__r    r$   r'   r*   r   r   r
   r   r   9   sP                  r   r   c                       e Zd Zd Zd ZdS )
TestThreadc                     t           j                            | |           || _        || _        || _        || _        d S )N)name)	threadingThreadr    testcasesemamutexnrunning)r   r1   r4   r5   r6   r7   s         r
   r    zTestThread.__init__I   s>    !!$T!222 	
 r   c                    t          j                     dz  }t          rt          d| j        |dz  fz             | j        5  | j        5  | j                                         t          r't          | j                                        d           | j	        
                    | j                                        d           d d d            n# 1 swxY w Y   t          j        |           t          rt          d| j        d           | j        5  | j                                         | j	                            | j                                        d           t          r0t          d	| j        | j                                        fz             d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )
Ng     @ztask %s will run for %.1f usecg    .Aztasks are running   taskdoner   z$%s is finished. %d tasks are running)randomverboseprintr1   r5   r6   r7   r$   r*   r4   assertLessEqualtimesleepr'   assertGreaterEqual)r   delays     r
   runzTestThread.runQ   s   ') 	)2	53;6( ( ) ) ) Y 	9 	9 F F!!### D$-++--/BCCC--dm.?.?.A.A1EEE	F F F F F F F F F F F F F F F Ju 1fdi000 9 9!!###001B1B1D1DaHHH 9@	4=#4#4#6#6D8 8 9 9 9	9 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s\   F9	A:CF9C	F9C	;F9BF!F9!F%	%F9(F%	)F99F= F=N)r+   r,   r-   r    rD   r   r   r
   r/   r/   H   s2        ! ! !9 9 9 9 9r   r/   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z ej        d
          d             Z ej         eed           d          d             Z eed          sd ZdS dS )ThreadTestsNc           	      ~   d}t          j        d          }t          j                    }t                      }g }d}t          j        d d         dk     rd}t          |          D ]}t          d|z  | |||          }|                    |           d	|_	        | 
                    |j                   |                     |j	                   |                     t          j        |t!          |                    t!          |                     |                                 t$          rt'          d
           |D ]}|                    |           |                     |                                |j                   t/          |d          rl|                     |j        d           |                     |j        d u            |                     t          j        dt!          |                               t$          rt'          d           |                     |                                d           d S )N
   r9   r   z<TestThread\(.*, stopped\)>   )r9      z<TestThread\(.*, initial\)>z<thread %d>Fz!waiting for all tasks to completeidentr   z<TestThread\(.*, \w+ -?\d+\)>zall tasks done)r2   BoundedSemaphoreRLockr   sysversion_inforanger/   appenddaemonassertIsNonerK   assertFalse
assertTruerematchreprstartr=   r>   joinis_alive__dict__hasattrassertNotEqualassertEqualr*   )	r   NUMTASKSr5   r6   
numrunningthreadsinitial_regexits	            r
   test_various_opszThreadTests.test_various_opso   s     )222!!YY
6BQB')) ;Mx 		 		A=1,dD%LLANN1AHag&&&QX&&&OOBH]DGG<< GG% % %GGIIII 	75666 	U 	UAFF8QZZ\\1:666q'"" U##AGQ///  D111)I4PQ77 S STTT 	$"###))1-----r   c                    t          j                    }|                     |j        d u            t	          |           t          |           fd}t          j                    g t          j        |d           	                                 |                     d         d u            t           j
        d         = d S )Nc                      t          j                    }                     | j                   t	          |            t          |                                             d S r)   )r2   current_threadrQ   rK   strrX   set)re   r;   rK   s    r
   fz9ThreadTests.test_ident_of_no_threading_threads.<locals>.f   sL    (**ALL!!!FFFGGGHHJJJJJr   r   r   )r2   ri   rT   rK   rj   rX   Eventthreadstart_new_threadwait_active)r   re   rl   r;   rK   s      @@r
   "test_ident_of_no_threading_threadsz.ThreadTests.test_ident_of_no_threading_threads   s     $&&D)))AQ	 	 	 	 	 	   2&&&		qT)***eAh'''r   c                    t           rt          d           	 t          j        d           n,# t          j        $ r t           rt          d           Y d S w xY w|                                  t          j        d           d S )Nzwith 256kB thread stack size...i   4platform does not support changing thread stack sizer   r=   r>   r2   
stack_sizern   errorrf   r   s    r
   test_various_ops_small_stackz(ThreadTests.test_various_ops_small_stack   s     	53444	 ((((| 	 	 	 NLMMMFF	 	Q   - %AAc                    t           rt          d           	 t          j        d           n,# t          j        $ r t           rt          d           Y d S w xY w|                                  t          j        d           d S )Nzwith 1MB thread stack size...i   rt   r   ru   r   s    r
   test_various_ops_large_stackz(ThreadTests.test_various_ops_large_stack   s     	31222	 ****| 	 	 	 NLMMMFF	 	Qry   c                 h   d }t          j                    }|                                 t          j        ||f          }|                                 |                     |t           j                   |                     t           j        |         t           j                   t           j        |= d S )Nc                 T    t          j                     |                                  d S r)   )r2   ri   release)r6   s    r
   rl   z*ThreadTests.test_foreign_thread.<locals>.f   s$     $&&&MMOOOOOr   )	r2   Lockacquirern   ro   assertInrq   assertIsInstance_DummyThread)r   rl   r6   tids       r
   test_foreign_threadzThreadTests.test_foreign_thread   s    	 	 	   %a%22c9,---i/4'4	6 	6 	6c"""r   c                   	 	 dd l }n'# t          $ r t          rt          d           Y d S w xY w|j        j        } G d dt                    |                              }t          j	                    	t          j	                     G 	fddt          j
                  } |            }d|_        |                                 t          rt          d           t          rt          d	            ||                    d
          |          }|                     |d           t          rt          d           	                                 t          rt          d           |                     |j                   t          rt          d            ||                    |j                  |          }|                     |d           t          rt          d                               d           |                     |j                   t          rt          d           |j        r|                                 d S d S )Nr   z2test_PyThreadState_SetAsyncExc can't import ctypesc                       e Zd ZdS )AThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.AsyncExcN)r+   r,   r-   r   r   r
   AsyncExcr      s        Dr   r   c                   &    e Zd ZdZdZ fdZdS )?ThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.WorkerNFc                     t          j                    | _        d| _        	 	                                  t          j        d           )# $ r d| _                                         Y d S w xY w)NFTg?)rn   	get_identidfinishedrk   r@   rA   )r   r   worker_saw_exceptionworker_starteds    r
   rD   zCThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.Worker.run   s     *,, %/(&**,,,
3(   / / /$(DM(,,....../s   *A  A0/A0)r+   r,   r-   r   r   rD   )r   r   r   s   r
   Workerr      sB        BH
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/r   r   Tz    started worker threadz     trying nonsensical thread idz,    waiting for worker thread to get startedz"    verifying worker hasn't exitedz2    attempting to raise asynch exception in workerr#   z5    waiting for worker to say it caught the exceptionrH   )timeoutz    all OK -- joining worker)ctypesImportErrorr=   r>   	pythonapiPyThreadState_SetAsyncExc	Exception	py_objectr2   rm   r3   rR   rY   c_longr_   rp   rT   r   r   rU   rZ   )
r   r   set_async_exc	exceptionr   re   resultr   r   r   s
          @@@r
   #SKIP_test_PyThreadState_SetAsyncExcz/ThreadTests.SKIP_test_PyThreadState_SetAsyncExc   s   	MMMM 	 	 	 LJKKKFF	
 (B	 	 	 	 	y 	 	 	 $$X..	 #**(00	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/Y% 	/ 	/ 	/  FHH				 	/-...  	64555v}}R00)<<###  	B@AAA 	86777$$$ 	HFGGGv}}QT22I>>### 	KIJJJ!!"!---
### 	20111: 	FFHHHHH	 	s   
  ..c                    d }t          t          d          rt          j        t          d|          }nt          j        t          d|          }|                     |j                   |                                 t          j        d           }|                     t          j
        |j                   |                     |t          j        v d           d S )Nc                  (    t          j                    r)   )rn   rw   )_args_kws     r
   fail_new_threadz7ThreadTests.test_limbo_cleanup.<locals>.fail_new_thread*  s    ,.. r   _start_new_thread)new_start_joinable_threadc                      d S r)   r   r   r   r
   <lambda>z0ThreadTests.test_limbo_cleanup.<locals>.<lambda>5  s    D r   targetz:Failed to cleanup _limbo map on failure of Thread.start().)r]   r2   Patchobject
addCleanupstoprY   r3   assertRaisesrn   rw   rT   _limbo)r   r   patcherre   s       r
   test_limbo_cleanupzThreadTests.test_limbo_cleanup(  s    	! 	! 	!9122 	]l9.AWWWGG l9.FO\\\G%%%LL111&,000!!H	J 	J 	J 	J 	Jr   c                 F   	 dd l }t          |d           t          |j        d           n.# t          t          f$ r t
          rt          d           Y d S w xY w~dd l}|                    t          j
        ddddt          z  g          }|                     |d	           d S )
Nr   r   PyGILState_Ensurez6test_finalize_with_runnning_thread can't import ctypes-Wignore-ca  if 1:
%s
            import ctypes, sys, time
            try:
                import thread
            except ImportError:
                import _thread as thread # Py3

            # This lock is used as a simple event variable.
            ready = thread.allocate_lock()
            ready.acquire()

            # Module globals are cleared before __del__ is run
            # So we save the functions in class dict
            class C:
                ensure = ctypes.pythonapi.PyGILState_Ensure
                release = ctypes.pythonapi.PyGILState_Release
                def __del__(self):
                    state = self.ensure()
                    self.release(state)

            def waitingThread():
                x = C()
                ready.release()
                time.sleep(100)

            thread.start_new_thread(waitingThread, ())
            ready.acquire()  # Be sure the other thread is waiting.
            sys.exit(42)
            *   )r   getattrr   r   AttributeErrorr=   r>   
subprocesscallrN   
executablesetup_3r_   )r   r   r   rcs       r
   test_finalize_runnning_threadz)ThreadTests.test_finalize_runnning_thread;  s    	MMMFK(((F$&9::::^, 	 	 	 PNOOOFF	
 __cndHd E: ;E   < 	R     s   ), 'AAhangsc                 Z   dd l }dt          z  }|                    t          j        ddd|g|j        |j                  }|                                \  }}|                                }|                    d          }|                    d          }| 	                    d|           d S )	Nr   a  if 1:
%s
                import threading
                from time import sleep

                def child():
                    sleep(0.3)
                    # As a non-daemon thread we SHOULD wake up and nothing
                    # should be torn down yet
                    print("Woke up, sleep function is: %%s.%%s" %% (sleep.__module__, sleep.__name__))

                threading.Thread(target=child).start()
                raise SystemExit
        r   r   r   )stdoutstderrutf-8z,Woke up, sleep function is: gevent.hub.sleep)
r   setup_4PopenrN   r   PIPEcommunicatestripdecoder_   )r   r   scriptpr   r   s         r
   test_join_nondaemon_on_shutdownz+ThreadTests.test_join_nondaemon_on_shutdownk  s     	  cndHdFK$.O$.O  5 5 w''w'' 	:	 	 	 	 	r   getcheckintervalzNeeds sys.getcheckintervalc                 \   t           j        }dd l}|                                5  |                    dt
                     t          j                    }	 t          dd          D ]~}t          j	        |dz             t          j
        d           }|                                 |                                  |            }|                     ||v d||fz             	 t          j	        |           n# t          j	        |           w xY w	 d d d            d S # 1 swxY w Y   d S )	Nr   r   r#   d      c                      d S r)   r   r   r   r
   r   z7ThreadTests.test_enumerate_after_join.<locals>.<lambda>  s     r   r   z&#1703448 triggered after %d trials: %s)r2   	enumeratewarningscatch_warningssimplefilterDeprecationWarningrN   r   r   setcheckintervalr3   rY   rZ   rT   )r   enumr   old_intervalrd   re   ls          r
   test_enumerate_after_joinz%ThreadTests.test_enumerate_after_join  s    "$$&& 	3 	3!!(,>??? /11L33 	X 	XA (a000!(===AGGIIIFFHHHA$$Q!V%MQRTUPV%VX X X X	X $\2222$\22222#	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s*   /D!BC:%D!:DD!!D%(D%pypy_version_infoc                     G d dt                     } |d          }t          j        |          }|j                                         ~|                      |            dt          j         |                      z              |d          }t          j        |          }|j                                         ~|                      |            dt          j         |                      z             d S )Nc                       e Zd Zd Zd ZdS )DThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunctionc                     || _         t          j        | j        | fd| i          | _        | j                                         d S )N_yet_another)r   argskwargs)should_raiser2   r3   _runrn   rY   )r   r   s     r
   r    zMThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction.__init__  sU     )5D%"+"2$)9=;I4:P#R #R #RDK K%%'''''r   c                 "    | j         rt          d S r)   )r   
SystemExit)r   
_other_refr   s      r
   r   zIThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction._run  s    ( )(() )r   N)r+   r,   r-   r    r   r   r   r
   RunSelfFunctionr     s2        ( ( () ) ) ) )r   r   F)r   z%d references still around)msgT)r   weakrefrefrn   rZ   rS   rN   getrefcount)r   r   cyclic_objectweak_cyclic_objectraising_cyclic_objectweak_raising_cyclic_objects         r
   test_no_refcycle_through_targetz+ThreadTests.test_no_refcycle_through_target  sJ   ) ) ) ) )& ) ) ) ,O???M!(]!;!; %%'''0022#?#&?3E3E3G3G#H#H$I  K K K %4O$F$F$F!)05J)K)K&!(--///%88::#?#&?3M3M3O3O#P#P$Q  S S S S Sr   )r+   r,   r-   maxDiffrf   rr   rx   r{   r   r   r   r   r   skipOnLibuvOnPyPyOnWinr   r   r]   rN   r   r   r   r   r
   rF   rF   i   s?       G(. (. (.T( ( (2
  
  
 
  
  
 # # #*E E EPJ J J&.! .! .!` &Y%g..  /.H YGC+,,-$ 3 3	 30 73+,, S	S 	S 	S 	S 	SS Sr   rF   c                       e Zd ZdZd Z ej        d          d             Z ej        d          d             Z	d Z
dS )ThreadJoinOnShutdownNc                    dt           z  |z   }dd l}|                    t          j        ddd|g|j                  }|                    d          }|j                                        	                    dd	          }|j        
                                 |                    d
          }|                     |d           |                     |dd           |                     |dd           d S )Nzif 1:
%s
            import sys, os, time, threading
            # a thread, which waits for the main program to terminate
            def joiningfunc(mainthread):
                mainthread.join()
                print('end of thread')
        
r   r   r   r   )r   <      r   r   zend of main
end of thread
rI   zinterpreter was blockedzUnexpected error)r   r   r   rN   r   r   rp   r   readreplacecloser   r_   r^   )r   r   r   r   r   datas         r
   _run_and_joinz"ThreadJoinOnShutdown._run_and_join  s      !! 	cndHdFKT^TcddVVBZZx}}&&uc22	{{7##=>>>B#<===Q 233333r   r   c                 4    d}|                      |           d S )Nzif 1:
            import os
            t = threading.Thread(target=joiningfunc,
                                 args=(threading.current_thread(),))
            t.start()
            time.sleep(0.2)
            print('end of main')
            )r  )r   r   s     r
   test_1_join_on_shutdownz,ThreadJoinOnShutdown.test_1_join_on_shutdown  s%     	6"""""r   zSometimes randomly times outc                 `    dd l }t          |d          sd S d}|                     |           d S )Nr   forkaG  if 1:
            childpid = os.fork()
            if childpid != 0:
                os.waitpid(childpid, 0)
                sys.exit(0)

            t = threading.Thread(target=joiningfunc,
                                 args=(threading.current_thread(),))
            t.start()
            print('end of main')
            osr]   r  r   r  r   s      r
   test_2_join_in_forked_processz2ThreadJoinOnShutdown.test_2_join_in_forked_process  sG     				r6"" 	F
 	6"""""r   c                 `    dd l }t          |d          sd S d}|                     |           d S )Nr   r  a  if 1:
            main_thread = threading.current_thread()
            def worker():
                childpid = os.fork()
                if childpid != 0:
                    os.waitpid(childpid, 0)
                    sys.exit(0)

                t = threading.Thread(target=joiningfunc,
                                     args=(main_thread,))
                print('end of main')
                t.start()
                # Should not block: main_thread object is already stopped
                # because we're running in a non-main thread of
                # the child process
                t.join(30)
                assert not t.is_alive()

            w = threading.Thread(target=worker)
            w.start()
            import sys
            if sys.version_info[:2] >= (3, 7) or (sys.version_info[:2] >= (3, 5) and hasattr(sys, 'pypy_version_info') and sys.platform != 'darwin'):
                w.join(45)
                if w.is_alive():
                     print('OH NO, failed to join worker')
            r  r  s      r
   !test_3_join_in_forked_from_threadz6ThreadJoinOnShutdown.test_3_join_in_forked_from_thread  sH     				r6"" 	F*F 	6"""""r   )r+   r,   r-   r   r  r   r   r  skipOnPyPy3OnCIr	  r  r   r   r
   r   r     s         G4 4 4( &Y%g..
# 
# /.
# Y=>># # ?>#$=# =# =# =# =#r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )ThreadingExceptionTestsc                     t          j                    }|                                 |                     t          |j                   d S r)   )r2   r3   rY   r   RuntimeErrorr   thread_s     r
   test_start_thread_againz/ThreadingExceptionTests.test_start_thread_againJ  s;    "$$,66666r   c                 l    t          j                    }|                     t          |j                   d S r)   )r2   ri   r   r  rZ   )r   ri   s     r
   test_joining_current_threadz3ThreadingExceptionTests.test_joining_current_threadO  s/    "133,(;<<<<<r   c                 l    t          j                    }|                     t          |j                   d S r)   )r2   r3   r   r  rZ   r  s     r
   test_joining_inactive_threadz4ThreadingExceptionTests.test_joining_inactive_threadS  s.    "$$,55555r   c                     t          j                    }|                                 |                     t          t
          |dd           d S )NrR   T)r2   r3   rY   r   r  setattrr  s     r
   test_daemonize_active_threadz4ThreadingExceptionTests.test_daemonize_active_threadW  s?    "$$,(DIIIIIr   N)r+   r,   r-   r  r  r  r  r   r   r
   r  r  E  sU        
7 7 7
= = =6 6 6J J J J Jr   r  c                   .    e Zd Z eej                  ZdS )	LockTestsN)r+   r,   r-   staticmethodr2   r   locktyper   r   r
   r  r  ]  s        |IN++HHHr   r  c                   .    e Zd Z eej                  ZdS )
RLockTestsN)r+   r,   r-   r  r2   rM   r  r   r   r
   r   r   a  s        |IO,,HHHr   r   c                   .    e Zd Z eej                  ZdS )NativeRLockTestsN)r+   r,   r-   r  r2   NativeRLockr  r   r   r
   r"  r"  e  s"         |I122HHHr   r"  c                   .    e Zd Z eej                  ZdS )
EventTestsN)r+   r,   r-   r  r2   rm   	eventtyper   r   r
   r%  r%  k  s        Y_--IIIr   r%  c                   .    e Zd Z eej                  ZdS )ConditionAsRLockTestsN)r+   r,   r-   r  r2   	Conditionr  r   r   r
   r(  r(  o  s"         |I/00HHHr   r(  c                   .    e Zd Z eej                  ZdS )ConditionTestsN)r+   r,   r-   r  r2   r)  condtyper   r   r
   r+  r+  t  s         |I/00HHHr   r+  c                   .    e Zd Z eej                  ZdS )SemaphoreTestsN)r+   r,   r-   r  r2   	Semaphoresemtyper   r   r
   r.  r.  x  s         l9.//GGGr   r.  c                   .    e Zd Z eej                  ZdS )BoundedSemaphoreTestsN)r+   r,   r-   r  r2   rL   r0  r   r   r
   r2  r2  |  s         l9566GGGr   r2  __main__).gevent.testing.sixr   gevent.testingtestingr   setup_execrZ   splitr   r   r   r=   r<   rV   rN   r2   _threadrn   r@   r   r   gevent.testsr   unittest.mockr   r   r   r   r   r3   r/   TestCaserF   r   r  r  r   r"  r%  r(  r+  r.  r2  r+   mainr   r   r
   <module>r?     sT   & % % % % % " " " " " "
& V
))KKT8J8JKKK
K
K
))OOFLL<N<NOOO
O
O " " " " " "
/  				 



            $ # # # # #
 ) ( ( ( ( (      f   9 9 9 9 9! 9 9 9B `S `S `S `S `S(# `S `S `SD u# u# u# u# u#8, u# u# u#p J J J J Jh/ J J J. , , , , ,
$ , , , - - - - -& - - - 3 3 3 3 3z, 3 3 3
 . . . . .& . . . 1 1 1 1 1J1 1 1 1 1 1 1 1 1Z. 1 1 1 0 0 0 0 0Z. 0 0 0 7 7 7 7 7J< 7 7 7 zIN r   