
    i5                        d dl mZ d dl m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 d dl	mZ  G d dej                  Z G d	 d
ej                  Z G d de          Z ej        d           G d dej                              Z G d de          Z G d dej                  Z G d de          Zd Zd Zd Z G d dej                  Zedk    r ej                     dS dS )    )print_function)absolute_importN	SemaphoreBoundedSemaphore)timingc                   F    e Zd Zd Zd Zd Zej        d             Zd Z	dS )TestSemaphorec                     t          d          }|                    d          }|du sJ t          |                      d S )Nr   )valueg{Gz?timeoutF)r   acquirereprselfsresults      G/usr/local/lib/python3.11/dist-packages/gevent/tests/test__semaphore.py(test_acquire_returns_false_after_timeoutz6TestSemaphore.test_acquire_returns_false_after_timeout   sB    A4((V    c                 J   t                      }g |                    fd           |                                 |                    fd           |                                 t          j        d           |                     t                    ddg           d S )Nc                 .                         d          S )Naappendr   r   s    r   <lambda>z2TestSemaphore.test_release_twice.<locals>.<lambda>       FMM#.. r   c                 .                         d          S )Nbr   r   s    r   r   z2TestSemaphore.test_release_twice.<locals>.<lambda>!   r    r   gMbP?r   r"   )r   rawlinkreleasegeventsleepassertEqualsortedr   s     @r   test_release_twicez TestSemaphore.test_release_twice   s    KK			....///						....///			U#s44444r   c                     t                      }t          j        |          }|                     | |                       d S N)r   weakrefrefr'   )r   r   rs      r   test_semaphore_weakrefz$TestSemaphore.test_semaphore_weakref'   s:    KKKNNAACC     r   c                      G d dt                     } |             dd l}|                                 |                                 d S )Nc                       e Zd Zd Zd ZdS )9TestSemaphore.test_semaphore_in_class_with_del.<locals>.Xc                 ,    t                      | _        d S r+   )r   r   r   s    r   __init__zBTestSemaphore.test_semaphore_in_class_with_del.<locals>.X.__init__2   s    "r   c                 8    | j                                          d S r+   )r   r   r4   s    r   __del__zATestSemaphore.test_semaphore_in_class_with_del.<locals>.X.__del__5   s         r   N)__name__
__module____qualname__r5   r7    r   r   Xr2   1   s2        % % %! ! ! ! !r   r<   r   )objectgccollect)r   r<   r>   s      r    test_semaphore_in_class_with_delz.TestSemaphore.test_semaphore_in_class_with_del,   s`    
	! 	! 	! 	! 	! 	! 	! 	! 	
			





r   c                 L    t                      }t          j        |g           d S r+   )r   r%   wait)r   r   s     r   )test_rawlink_on_unacquired_runs_notifiersz7TestSemaphore.test_rawlink_on_unacquired_runs_notifiers>   s%    
 KKQCr   N)
r8   r9   r:   r   r)   r/   	greentestignores_leakcheckr@   rC   r;   r   r   r   r      so        - - -
	5 	5 	5! ! !
    ! "    r   r   c                       e Zd Zd Zd Zd ZdZ	 	 ddZd Zd	 Z	d
 Z
d Z ej        d          dd            Zd Zd ZdS )TestSemaphoreMultiThreadc                     t           S r+   r   r4   s    r   _getTargetClassz(TestSemaphoreMultiThread._getTargetClassN   s    r   c                 <     |                                  d          S )N   )rI   r4   s    r   _makeOnez!TestSemaphoreMultiThread._makeOneQ   s     
 &t##%%a(((r   c                 B   	 ddl m dd l		fd}|S )Nr   get_hub_if_existsc                                                       	                      j        di            n#                                  d d <    xY w	              } | *|                                  |                     d                                             d S #              } | *|                                  |                     d                                             w xY w)NTdestroy_loopr;   )setr   r   exc_infojoindestroy)	hubacquiredrT   rO   semsysthread_acquire_kwargsthread_acquiredthread_runnings	    r   thread_mainz=TestSemaphoreMultiThread._makeThreadMain.<locals>.thread_main^   s      &CK88"788   !llnn ('))?HHJJJKKTK222##%%%%%	 ('))?HHJJJKKTK222##%%%%s    8 B$ AB$ $AC0)gevent._hub_localrO   rZ   )
r   r]   r\   rY   rX   rT   r[   r^   rO   rZ   s
    `````` @@r   _makeThreadMainz(TestSemaphoreMultiThread._makeThreadMainX   sk     	877777


	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& r      TFc           	      N   ddl m} |                     |                    d                     dd l}|                                }|                                }|                                 }|                                 g }	g }
|                     | j	        ||||
|	fi |          }d|_
        |                                 |                    d           |rv|                                 t          | j                  D ]6}t          j                     |                    t"          j                  r n7|                     |
dg           |s`|                    d          rKt          | j                  D ]6}t          j                     |                    t"          j                  r n7|                    t"          j        dz             |r'|                     |                                           	 |                     |	g            d }	n# d }	w xY w||
fS )	Nr   monkey	threadingtargetT
   r   ra   )r%   rd   assertFalseis_module_patchedre   EventrL   r   Threadr`   daemonstartrB   r$   rangeIDLE_ITERATIONSidler	   
LARGE_TICKr'   get
assertTrueis_set)r   r$   !require_thread_acquired_to_finishr[   rd   re   r]   r\   rY   rT   rX   t_s                r   $_do_test_acquire_in_one_then_anotherz=TestSemaphoreMultiThread._do_test_acquire_in_one_then_anotherq   sQ    	"!!!!!11+>>???"**#//++mmoo$8D$8OSh%
 %
 $%
 %
  
 				B 	/KKMMM 4/00  "''(9:: E Xv... 	044Y?? 	 4/00  "''(9:: EV.2333, 	6OOO2244555	Xr***HHtHOOOOH}s   H H c                 2    |                      d           d S )NT)r$   )ry   r4   s    r    test_acquire_in_one_then_anotherz9TestSemaphoreMultiThread.test_acquire_in_one_then_another   s    11$1?????r   c                     |                      ddt          j                  \  }}|                     dg|           |                                 t          |dd           }|                     |           d S )NFT)r$   rv   r   	_notifier)ry   r	   SMALLEST_RELIABLE_DELAYr'   r$   getattrassertIsNone)r   rY   acquired_in_threadnotifiers       r   &test_acquire_in_one_then_another_timedz?TestSemaphoreMultiThread.test_acquire_in_one_then_another_timed   s    "&"K"K.22 #L #4 #4 	%"4555 	3T22(#####r   c           
        	 ddl m} |                     |                    d                     dd l}|                                                                  	fd}g }g }t          j        |          }|                    | 	                    |
                                |
                                ||t          j                            	d	_        t          j                                                      |                                 t#          d          D ]4}t          j                     	                    t          j                   5|                     |j        d           |                     g |           |                     d	g|           |                     |j        |           d }d S )
Nr   rc   re   c                                                       }                                  t          j        t          j                   | S r+   )r   rn   r%   r&   r	   rr   )ackrY   threads    r   greenlet_onezeTestSemaphoreMultiThread.test_acquire_in_one_wait_greenlet_wait_thread_gives_up.<locals>.greenlet_one   s7    ++--C LLNNNL*+++Jr   r   rf   T   F)r%   rd   ri   rj   re   rL   r   spawnrl   r`   rk   r	   rr   rm   rq   r$   rU   ro   r'   r   rt   dead)
r   rd   re   r   rT   rX   gletrx   rY   r   s
           @@r   6test_acquire_in_one_wait_greenlet_wait_thread_gives_upzOTestSemaphoreMultiThread.test_acquire_in_one_wait_greenlet_wait_thread_gives_up   s    	"!!!!!11+>>???mmoo	 	 	 	 	 	 |L))!!)=)=OOy00h%	 *> *
 *
!   		q 	+ 	+AKMMMKK)****T***X&&&%(+++	4(((r   c                 <    |                      |j        |           d S r+   )r   rW   )r   rY   s     r   assertOneHasNoHubz*TestSemaphoreMultiThread.assertOneHasNoHub   s     #'3'''''r   z&Flaky there; can't reproduce elsewherer;   Nc           	         	
 ddl m} ddlm
                      |                    d                     dd l}ddlm  	                                 
                               d	ddgd	
 f	d	}|                    |d
          }d|_        |                    |d          }d|_        |                                 |                                 |                    d           |                    d           |                                s|                                rjt!                    }|                    d           |                    d           |k    rdn(|                                V|                                j                     	dz
  	dz
  g           d S )Nr   rc   rN   re   )r&   i'  Tc                   	 rt          j                     	 t                    D ]}s n j         }s|sJ |r                                 || <   s)                     	             	            | |f           r(|dz  dk    rt          j        t          j                   |dz  dk    r 
t          j                   nC# t          $ r6}dd l
}|                                 t          |          | <   d }Y d }~nd }~ww xY w 	            }|,|                                 |                    d           d S d S #  	            }|+|                                 |                    d           w w xY w)Nrh   r   d   TrQ   )r%   get_hubro   r   r$   r   r&   r	   r~   	Exception	traceback	print_excstrrU   rV   )ixirX   exr   rW   acquire_argscount
create_hubrO   native_sleepresultsrunr   rY   s         r   do_itz<TestSemaphoreMultiThread.test_dueling_threads.<locals>.do_it  s    !   3u E EA *s{L9H'38333 &"#GBK% ))--//..00"a8   " Ea"fkkV%CDDDDSA$V%CDDD       )"5"5"7"7"7!"gg
 ('))?HHJJJKKTK22222 #? ('))?HHJJJKKTK2222 #s0   B4C E
 
D,DE
 DE
 
9F)r   )rg   args)rK   rK      F)r%   rd   r_   rO   ri   rj   re   timer&   rL   r   rl   rm   rn   rU   is_alivelistr'   )r   r   r   rd   re   r   t1t2curr   rO   r   r   r   rY   s   ```      @@@@@@r   test_dueling_threadsz-TestSemaphoreMultiThread.test_dueling_threads   s    	"!!!!!77777711+>>???......mmoos###r( 	3  	3  	3  	3  	3  	3  	3  	3  	3  	3  	3  	3  	3D U66	U66	















kkmm 	r{{}} 	w--CGGAJJJGGAJJJg~~ kkmm 	r{{}} 	 	519eai"899999r   c                 0    |                      d           d S )N)T   r   r4   s    r   test_dueling_threads_timeoutz5TestSemaphoreMultiThread.test_dueling_threads_timeout<  s    !!),,,,,r   c                 2    |                      d           d S )NT)r   r   r4   s    r   test_dueling_threads_with_hubz6TestSemaphoreMultiThread.test_dueling_threads_with_hub?  s    !!T!22222r   )TF)r;   N)r8   r9   r:   rI   rL   r`   rp   ry   r{   r   r   r   rD   skipOnPyPyOnWindowsr   r   r   r;   r   r   rG   rG   G   s          ) ) )  . O 6:OT< < < <|@ @ @
$ 
$ 
$. . .`( ( ( #Y"#KLLH: H: H: MLH:T- - -3 3 3 3 3r   rG   c                       e Zd Zd ZdS )TestBoundedSemaphoreMultiThreadc                     t           S r+   r   r4   s    r   rI   z/TestBoundedSemaphoreMultiThread._getTargetClassI  s    r   N)r8   r9   r:   rI   r;   r   r   r   r   G  s#                 r   r   zNeeds C extensionc                       e Zd Zd ZdS )TestCExtc                 F    |                      t          j        d           d S )Nzgevent._gevent_c_semaphore)r'   r   r9   r4   s    r   test_c_extensionzTestCExt.test_c_extensionO  s,    -5	7 	7 	7 	7 	7r   N)r8   r9   r:   r   r;   r   r   r   r   L  s#        7 7 7 7 7r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )SwitchWithFixedHashc                 ,    |j         | _         || _        d S r+   )switchhashcode)r   greenletr   s      r   r5   zSwitchWithFixedHash.__init__[  s    o r   c                     t           r+   AssertionErrorr4   s    r   __hash__zSwitchWithFixedHash.__hash___      r   c                     t           r+   r   )r   others     r   __eq__zSwitchWithFixedHash.__eq__b  r   r   c                      | j         |i |S r+   )r   r   r   kwargss      r   __call__zSwitchWithFixedHash.__call__e  s    t{D+F+++r   c                 *    t          | j                  S r+   )r   r   r4   s    r   __repr__zSwitchWithFixedHash.__repr__h  s    DK   r   N)r8   r9   r:   r5   r   r   r   r   r;   r   r   r   r   T  s_        ! ! !    , , ,! ! ! ! !r   r   c                       e Zd ZdZd ZdS )FirstGrh   c                 n    t          j        j        | g|R i | t          | | j                  | _        d S r+   )r%   Greenletr5   r   r   r   r   s      r   r5   zFirstG.__init__p  s<     7777777)$>>r   N)r8   r9   r:   r   r5   r;   r   r   r   r   k  s*         H? ? ? ? ?r   r   c                       e Zd ZdZdS )LastG   N)r8   r9   r:   r   r;   r   r   r   r   u  s        HHHr   r   c                 X    |                                   |                    d           d S )NT)r   r   )rY   should_quits     r   acquire_then_exitr   z  s)    KKMMMtr   c                     |rd S |                                   t                              t          | |          }|                                 d S r+   )r   r   r   release_then_spawnrU   rY   r   gs      r   acquire_then_spawnr     sC     KKMMM'k::AFFHHHHHr   c                     |                                   |rd S t                              t          | |          }|                                 d S r+   )r$   r   r   r   rU   r   s      r   r   r     sC    KKMMM 'k::AFFHHHHHr   c                       e Zd Zd ZdS )TestSemaphoreFairc                    t                      }g }t                              t          ||          }t                              t          ||          }t                              t
          ||          }|                     t          j        j	                  5  t          j
        |||g           d d d            n# 1 swxY w Y   |                     |j        |           |                     |j        |           |                     |j        |           |                                 |                                 |                                 |                                 t          j                     d S r+   )r   r   r   r   r   r   assertRaisesr%   
exceptionsLoopExitjoinallrt   r   ri   r$   killrq   )r   rY   r   keep_going1keep_going2exitings         r   test_fair_or_hangsz$TestSemaphoreFair.test_fair_or_hangs  s    kkll#5sKHHll#5sKHH++/kBBv09:: 	@ 	@NKg>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	g...(+666);777s   B<<C C N)r8   r9   r:   r   r;   r   r   r   r     s#            r   r   __main__)
__future__r   r   r,   r%   gevent.exceptionsgevent.lockr   r   gevent.testingtestingrD   r	   TestCaser   rG   r   skipOnPurePythonr   r=   r   r   r   r   r   r   r   r   r8   mainr;   r   r   <module>r      sm   & % % % % % & & & & & &       ! ! ! ! ! ! ( ( ( ( ( ( " " " " " " ! ! ! ! ! !0 0 0 0 0I& 0 0 0fy3 y3 y3 y3 y3y1 y3 y3 y3@         &>      
 /007 7 7 7 7y! 7 7 107! ! ! ! !& ! ! !.? ? ? ? ?V_ ? ? ?    F   
  
        	*   6 zIN r   