
    <|h[                        d dl mZ d dlmZ dZ ee       dj                  d ej                  d      D              Z	dj                  d ej                  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jH                               Z$e G d dejJ                               Z%e G d dejJ                               Z&e G d dejN                               Z'e G d dejJ                               Z(e G d  d!ejR                               Z)e G d" d#ejT                               Z*e G d$ d%ejV                               Z+e,d&k(  r ejZ                          yy)'    )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    yw)z            %sN .0lines     ]/var/www/html/test/engine/venv/lib/python3.12/site-packages/gevent/tests/test__threading_2.py	<genexpr>r      s     K$t+K   c              #   &   K   | ]	  }d |z    yw)z                %sNr   r   s     r
   r   r      s     OD(4/Or   )support)
lock_testsF)patchc                 z     t        j                  t        j                  xr t        j                  d      |       S )Nz#SKIPPED: Timeout on PyPy3 on Travis)unittestskipIf	greentestPYPY3RUNNING_ON_CI)clss    r
   skipDueToHangr   3   s6    8??3I33- 
     c                   $    e Zd Zd Zd Zd Zd Zy)Counterc                     d| _         y )Nr   valueselfs    r
   __init__zCounter.__init__;   s	    
r   c                 .    | xj                   dz  c_         y N   r   r   s    r
   inczCounter.inc>       

a
r   c                 .    | xj                   dz  c_         y r#   r   r   s    r
   deczCounter.decA   r&   r   c                     | j                   S Nr   r   s    r
   getzCounter.getD   s    zzr   N)__name__
__module____qualname__r!   r%   r(   r+   r   r   r
   r   r   9   s    r   r   c                       e Zd Zd Zd Zy)
TestThreadc                 ~    t         j                  j                  | |       || _        || _        || _        || _        y )N)name)	threadingThreadr!   testcasesemamutexnrunning)r    r2   r5   r6   r7   r8   s         r
   r!   zTestThread.__init__I   s7    !!$T!2 	
 r   c                    t        j                          dz  }t        rt        d| j                  |dz  fz         | j                  5  | j
                  5  | j                  j                          t        r$t        | j                  j                         d       | j                  j                  | j                  j                         d       d d d        t        j                  |       t        rt        d| j                  d       | j
                  5  | j                  j                          | j                  j                  | j                  j                         d       t        r2t        d	| j                  | j                  j                         fz         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)
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printr2   r6   r7   r8   r%   r+   r5   assertLessEqualtimesleepr(   assertGreaterEqual)r    delays     r
   runzTestThread.runQ   sc   ')2		53;6( ( ) YY 	9 F!!#$--++-/BC--dmm.?.?.A1E	F JJufdii0 9!!#001B1B1DaH@		4==#4#4#6D8 8 9	9	9 	9F F9 9	9 	9s?   GA9F+AGBF7G+F4	0G7G 	<GGN)r,   r-   r.   r!   rE   r   r   r
   r0   r0   H   s    !9r   r0   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yy)ThreadTestsNc           	         d}t        j                  d      }t        j                         }t               }g }d}t        j
                  d d dk  rd}t        |      D ]  }t        d|z  | |||      }|j                  |       d	|_	        | j                  |j                         | j                  |j                         | j                  t        j                  |t!        |            t!        |             |j#                           t$        rt'        d
       |D ]  }|j)                  |       | j                  |j+                         |j,                         t/        |d      sK| j1                  |j                  d       | j                  |j                  d u        | j                  t        j                  dt!        |                    t$        rt'        d       | j3                  |j5                         d       y )N
   r:   r   z<TestThread\(.*, stopped\)>   )r:      z<TestThread\(.*, initial\)>z<thread %d>Fz!waiting for all tasks to completeidentr   z<TestThread\(.*, \w+ -?\d+\)>zall tasks done)r3   BoundedSemaphoreRLockr   sysversion_inforanger0   appenddaemonassertIsNonerL   assertFalse
assertTruerematchreprstartr>   r?   joinis_alive__dict__hasattrassertNotEqualassertEqualr+   )	r    NUMTASKSr6   r7   
numrunningthreadsinitial_regexits	            r
   test_various_opszThreadTests.test_various_opso   s     ))2!Y
6BQ') ;Mx 		A=1,dD%LANN1AHagg&QXX&OOBHH]DG< G%GGI		 56 	UAFF8QZZ\1::6q'"##AGGQ/  D1)I4PQ7 ST	U "#)1-r   c                 n   t        j                         }| j                  |j                  d u        t	        |       t        |       fd}t        j                         g t        j                  |d       j                          | j                  d   d u        t         j                  d   = y )Nc                      t        j                         } j                  | j                         t	        |        t        |        j                          y r*   )r3   current_threadrR   rL   strrY   set)rf   r<   rL   s    r
   fz9ThreadTests.test_ident_of_no_threading_threads.<locals>.f   s8    ((*ALL!FGHHJr   r   r   )r3   rj   rU   rL   rk   rY   Eventthreadstart_new_threadwait_active)r    rf   rm   r<   rL   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       | j                          t        j                  d       y # t        j
                  $ r t         rt        d       Y y w xY w)Nzwith 256kB thread stack size...i   4platform does not support changing thread stack sizer   r>   r?   r3   
stack_sizero   errorrg   r   s    r
   test_various_ops_small_stackz(ThreadTests.test_various_ops_small_stack   sa    34	  (
 	Q || 	LM	   A $A54A5c                     t         rt        d       	 t        j                  d       | j                          t        j                  d       y # t        j
                  $ r t         rt        d       Y y w xY w)Nzwith 1MB thread stack size...i   ru   r   rv   r   s    r
   test_various_ops_large_stackz(ThreadTests.test_various_ops_large_stack   sa    12	  *
 	Q || 	LM	rz   c                 d   d }t        j                         }|j                          t        j                  ||f      }|j                          | j                  |t         j                         | j                  t         j                  |   t         j                         t         j                  |= y )Nc                 L    t        j                          | j                          y r*   )r3   rj   release)r7   s    r
   rm   z*ThreadTests.test_foreign_thread.<locals>.f   s     $$&MMOr   )	r3   Lockacquirero   rp   assertInrr   assertIsInstance_DummyThread)r    rm   r7   tids       r
   test_foreign_threadzThreadTests.test_foreign_thread   s    	  %%a%2c9,,-i//4'44	6c"r   c                   	 	 dd l }|j                  j
                  } G d dt              |j                        }t        j                         	t        j                          G 	fddt        j                        } |       }d|_        |j                          t        rt        d       t        rt        d	        ||j                  d
      |      }| j                  |d       t        rt        d       	j                          t        rt        d       | j!                  |j"                         t        rt        d        ||j                  |j$                        |      }| j                  |d       t        rt        d       j                  d       | j'                  |j"                         t        rt        d       |j"                  r|j)                          y y # t        $ r t        rt        d       Y y w xY w)Nr   z2test_PyThreadState_SetAsyncExc can't import ctypesc                       e Zd Zy)AThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.AsyncExcN)r,   r-   r.   r   r   r
   AsyncExcr      s    r   r   c                   $    e Zd ZdZdZ fdZy)?ThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.WorkerNFc                     t        j                         | _        d| _        	 	 j	                          t        j                  d       &# $ r d| _        j	                          Y y w xY w)NFTg?)ro   	get_identidfinishedrl   rA   rB   )r    r   worker_saw_exceptionworker_starteds    r
   rE   zCThreadTests.SKIP_test_PyThreadState_SetAsyncExc.<locals>.Worker.run   sb     **, %/&**,

3    /$(DM(,,./s   'A
 
A)(A))r,   r-   r.   r   r   rE   )r   r   r   s   r
   Workerr      s    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 exceptionrI   )timeoutz    all OK -- joining worker)ctypesImportErrorr>   r?   	pythonapiPyThreadState_SetAsyncExc	Exception	py_objectr3   rn   r4   rS   rZ   c_longr`   rq   rU   r   r   rV   r[   )
r    r   set_async_exc	exceptionr   rf   resultr   r   r   s
          @@@r
   #SKIP_test_PyThreadState_SetAsyncExcz/ThreadTests.SKIP_test_PyThreadState_SetAsyncExc   s   	 ((BB	y 	 $$X.	 #*(0	/ 	/Y%% 	/  H		-. 45v}}R0)<# @A67$FGv}}QTT2I>#IJ!!"!-

#01::FFH C  	JK	s   G- -H
	H
c                    d }t        t        d      rt        j                  t        d|      }nt        j                  t        d|      }| j	                  |j
                         |j                          t        j                  d       }| j                  t        j                  |j                         | j                  |t        j                  v d       y )Nc                  *    t        j                         r*   )ro   rx   )_args_kws     r
   fail_new_threadz7ThreadTests.test_limbo_cleanup.<locals>.fail_new_thread*  s    ,,. r   _start_new_thread)new_start_joinable_threadc                       y r*   r   r   r   r
   <lambda>z0ThreadTests.test_limbo_cleanup.<locals>.<lambda>5      r   targetz:Failed to cleanup _limbo map on failure of Thread.start().)r^   r3   Patchobject
addCleanupstoprZ   r4   assertRaisesro   rx   rU   _limbo)r    r   patcherrf   s       r
   test_limbo_cleanupzThreadTests.test_limbo_cleanup(  s    	!912ll9.AWG ll9.FO\G%L1&,,0!!!H	Jr   c                 "   	 dd l }t        |d       t        |j                  d       ~dd l}|j                  t        j                  ddddt        z  g      }| j                  |d	       y # t        t        f$ r t
        rt        d       Y y w xY w)
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callrO   
executablesetup_3r`   )r    r   r   rcs       r
   test_finalize_runnning_threadz)ThreadTests.test_finalize_runnning_thread;  s    	FK(F$$&9: __cnndHd E: ;E  < 	R M ^, 	NO	s   &A+ + BBhangsc                 B   dd l }dt        z  }|j                  t        j                  ddd|g|j
                  |j
                        }|j                         \  }}|j                         }|j                  d      }|j                  d      }| j                  d|       y )	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PopenrO   r   PIPEcommunicatestripdecoder`   )r    r   scriptpr   r   s         r
   test_join_nondaemon_on_shutdownz+ThreadTests.test_join_nondaemon_on_shutdownk  s     	  cnndHdFK$.OO$.OO  5 w'w' 	:	r   getcheckintervalzNeeds sys.getcheckintervalc                 .   t         j                  }dd l}|j                         5  |j	                  dt
               t        j                         }	 t        dd      D ]q  }t        j                  |dz         t        j                  d       }|j                          |j                           |       }| j                  ||v d||fz         s 	 t        j                  |       	 d d d        y # t        j                  |       w xY w# 1 sw Y   y xY w)	Nr   r   r$   d      c                       y r*   r   r   r   r
   r   z7ThreadTests.test_enumerate_after_join.<locals>.<lambda>  r   r   r   z&#1703448 triggered after %d trials: %s)r3   	enumeratewarningscatch_warningssimplefilterDeprecationWarningrO   r   r   setcheckintervalr4   rZ   r[   rU   )r    enumr   old_intervalre   rf   ls          r
   test_enumerate_after_joinz%ThreadTests.test_enumerate_after_join  s     ""$$& 	3!!(,>? //1L33 	XA ((a0!((=AGGIFFHA$$Q!V%MQRTUPV%VX	X $$\2#	3 	3" $$\2#	3 	3s$   +DB C1D1DDDpypy_version_infoc                     G d dt               } |d      }t        j                  |      }|j                  j	                          ~| j                   |       dt        j                   |             z          |d      }t        j                  |      }|j                  j	                          ~| j                   |       dt        j                   |             z         y )Nc                       e Zd Zd Zd Zy)DThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunctionc                     || _         t        j                  | j                  | fd| i      | _        | j                  j                          y )N_yet_another)r   argskwargs)should_raiser3   r4   _runro   rZ   )r    r   s     r
   r!   zMThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction.__init__  sD     )5D%"+"2"2$))9=;I4:P#RDK KK%%'r   c                 (    | j                   rt        y 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     s    ()r   r   F)r   z%d references still around)msgT)r   weakrefrefro   r[   rT   rO   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  s    )& ) ,?M!(]!;  %%'02#?#&??3E3G#H$I  K %4$F!)05J)K&!((--/%8:#?#&??3M3O#P$Q  Sr   )r,   r-   r.   maxDiffrg   rs   ry   r|   r   r   r   r   r   skipOnLibuvOnPyPyOnWinr   r   r^   rO   r   r   r   r   r
   rG   rG   i   s    G(.T(2
 
 #*EPJ&.!` &Y%%g. /H YC+,-$3	30 3+,	S -r   rG   c                   |    e Zd ZdZd Z ej                  d      d        Z ej                  d      d        Z	d Z
y)ThreadJoinOnShutdownNc                    dt         z  |z   }dd l}|j                  t        j                  ddd|g|j
                        }|j                         }|j                  j                         j                  dd      }|j                  j                          |j                  d	      }| j                  |d
       | j                  |dd       | j                  |dd       y )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
rJ   zinterpreter was blockedzUnexpected error)r   r   r   rO   r   r   rq   r   readreplacecloser   r`   r_   )r    r   r   r   r   datas         r
   _run_and_joinz"ThreadJoinOnShutdown._run_and_join  s      !! 	cnndHdFKT^TcTcdVVXxx}}&&uc2	{{7#=>B#<=Q 23r   r   c                 *    d}| j                  |       y )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                 L    dd l }t        |d      sy d}| j                  |       y )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  s+     	r6"
 	6"r   c                 L    dd l }t        |d      sy d}| j                  |       y )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()
                t.join() # Should not block: main_thread is already stopped

            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()
            r  r	  s      r
   !test_3_join_in_forked_from_threadz6ThreadJoinOnShutdown.test_3_join_in_forked_from_thread  s+     	r6"*: 	6"r   )r,   r-   r.   r   r  r   r   r  skipOnPyPy3OnCIr
  r  r   r   r
   r   r     sV     G4( &Y%%g.
# /
# Y=># ?#$7#r   r   c                   $    e Zd Zd Zd Zd Zd Zy)ThreadingExceptionTestsc                     t        j                         }|j                          | j                  t        |j                         y r*   )r3   r4   rZ   r   RuntimeErrorr    thread_s     r
   test_start_thread_againz/ThreadingExceptionTests.test_start_thread_againD  s-    ""$,6r   c                 l    t        j                         }| j                  t        |j                         y r*   )r3   rj   r   r  r[   )r    rj   s     r
   test_joining_current_threadz3ThreadingExceptionTests.test_joining_current_threadI  s&    "113,(;(;<r   c                 l    t        j                         }| j                  t        |j                         y r*   )r3   r4   r   r  r[   r  s     r
   test_joining_inactive_threadz4ThreadingExceptionTests.test_joining_inactive_threadM  s$    ""$,5r   c                     t        j                         }|j                          | j                  t        t
        |dd       y )NrS   T)r3   r4   rZ   r   r  setattrr  s     r
   test_daemonize_active_threadz4ThreadingExceptionTests.test_daemonize_active_threadQ  s/    ""$,(DIr   N)r,   r-   r.   r  r  r  r  r   r   r
   r  r  ?  s    
7
=6Jr   r  c                   0    e Zd Z eej
                        Zy)	LockTestsN)r,   r-   r.   staticmethodr3   r   locktyper   r   r
   r  r  W  s    INN+Hr   r  c                   0    e Zd Z eej
                        Zy)
RLockTestsN)r,   r-   r.   r  r3   rN   r  r   r   r
   r!  r!  [  s    IOO,Hr   r!  c                   0    e Zd Z eej
                        Zy)NativeRLockTestsN)r,   r-   r.   r  r3   NativeRLockr  r   r   r
   r#  r#  _  s     I112Hr   r#  c                   0    e Zd Z eej
                        Zy)
EventTestsN)r,   r-   r.   r  r3   rn   	eventtyper   r   r
   r&  r&  e  s    Y__-Ir   r&  c                   0    e Zd Z eej
                        Zy)ConditionAsRLockTestsN)r,   r-   r.   r  r3   	Conditionr  r   r   r
   r)  r)  i  s     I//0Hr   r)  c                   0    e Zd Z eej
                        Zy)ConditionTestsN)r,   r-   r.   r  r3   r*  condtyper   r   r
   r,  r,  n  s    I//0Hr   r,  c                   0    e Zd Z eej
                        Zy)SemaphoreTestsN)r,   r-   r.   r  r3   	Semaphoresemtyper   r   r
   r/  r/  r  s    9../Gr   r/  c                   0    e Zd Z eej
                        Zy)BoundedSemaphoreTestsN)r,   r-   r.   r  r3   rM   r1  r   r   r
   r3  r3  v  s    9556Gr   r3  __main__).gevent.testing.sixr   gevent.testingtestingr   setup_execr[   splitr   r   r   r>   r=   rW   rO   r3   _threadro   rA   r   r   gevent.testsr   unittest.mockr   r   r   r   r   r4   r0   TestCaserG   r   r  r  r!  r#  r&  r)  r,  r/  r3  r,   mainr   r   r
   <module>r@     sB   & "
& V
))KT8JK
K
))OFLL<NO
O "
//  	 
      $
 )f 9!! 9B `S(## `S `SD o#8,, o# o#d Jh// J J. ,
$$ , , -&& - - 3z,, 3 3
 .&& . . 1J11 1 1 1Z.. 1 1 0Z.. 0 0 7J<< 7 7 zINN r   