
    <|h5                        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:                          yy)    )print_function)absolute_importN	SemaphoreBoundedSemaphore)timingc                   H    e Zd Zd Zd Zd Zej                  d        Zd Z	y)TestSemaphorec                 h    t        d      }|j                  d      }|du sJ t        |             y )Nr   )valueg{Gz?timeoutF)r   acquirereprselfsresults      [/var/www/html/test/engine/venv/lib/python3.12/site-packages/gevent/tests/test__semaphore.py(test_acquire_returns_false_after_timeoutz6TestSemaphore.test_acquire_returns_false_after_timeout   s1    A4(,V,    c                    t               }g |j                  fd       |j                          |j                  fd       |j                          t        j                  d       | j                  t              ddg       y )Nc                 &    j                  d      S )Naappendr   r   s    r   <lambda>z2TestSemaphore.test_release_twice.<locals>.<lambda>       FMM#. r   c                 &    j                  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_    K			./						./			U#s4r   c                 p    t               }t        j                  |      }| j                  | |              y N)r   weakrefrefr'   )r   r   rs      r   test_semaphore_weakrefz$TestSemaphore.test_semaphore_weakref'   s(    KKKNAC r   c                 x     G d dt               } |        dd l}|j                          |j                          y )Nc                       e Zd Zd Zd Zy)9TestSemaphore.test_semaphore_in_class_with_del.<locals>.Xc                 "    t               | _        y r+   )r   r   r   s    r   __init__zBTestSemaphore.test_semaphore_in_class_with_del.<locals>.X.__init__2   s    "r   c                 8    | j                   j                          y 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   s    %!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                 D    t               }t        j                  |g       y r+   )r   r%   wait)r   r   s     r   )test_rawlink_on_unacquired_runs_notifiersz7TestSemaphore.test_rawlink_on_unacquired_runs_notifiers>   s    
 KQCr   N)
r8   r9   r:   r   r)   r/   	greentestignores_leakcheckr@   rC   r;   r   r   r   r      s0    -
	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y)TestSemaphoreMultiThreadc                     t         S r+   r   r4   s    r   _getTargetClassz(TestSemaphoreMultiThread._getTargetClassN   s    r   c                 .     | j                         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                          	 j                   j                  di        	         } | "| j	                          | j                  d       j                          y #  j                         d d   xY w#         } | "| j	                          | j                  d       j                          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     &CKK8"78 ()?HHJKKTK2##%!lln')?HHJKKTK2##%s   !A1 1BB
 
=C)gevent._hub_localrO   rZ   )
r   r]   r\   rY   rX   rT   r[   r^   rO   rZ   s
    `````` @@r   _makeThreadMainz(TestSemaphoreMultiThread._makeThreadMainX   s     	8	& 	& r      c           	         ddl m} | j                  |j                  d             dd l}|j                         }|j                         }| j                         }|j                          g }	g }
|j                   | j                  ||||
|	fi |      }d|_
        |j                          |j                  d       |rr|j                          t        | j                        D ]7  }t        j                           |j                  t"        j$                        s7 n | j'                  |
dg       |s`|j)                  d      rOt        | j                        D ]7  }t        j                           |j                  t"        j$                        s7 n |j                  t"        j$                  dz         |r| j+                  |j-                                	 | j'                  |	g        d }	||
fS # d }	w xY w)	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   s    	"11+>?"*#//+mmo$8D$8$8OSh%
 $%
 
 		BKKM 4//0 "''(9(9:
 Xv.044Y? 4//0 "''(9(9: 	V..23,OOO2245	Xr*HH} Hs   G0 0G4c                 (    | j                  d       y )NT)r$   )ry   r4   s    r    test_acquire_in_one_then_anotherz9TestSemaphoreMultiThread.test_acquire_in_one_then_another   s    11$1?r   c                     | j                  ddt        j                        \  }}| j                  dg|       |j	                          t        |dd       }| j                  |       y )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   si    "&"K"K.222 #L #4 	%"45 	3T2(#r   c           
      6  	 ddl m} | j                  |j                  d             dd l}| j                         j                          	fd}g }g }t        j                  |      }|j                  | j                  |j                         |j                         ||t        j                              	d	_        t        j                          j                          |j!                          t#        d      D ]5  }t        j                          	j!                  t        j                         7 | j%                  |j&                  d       | j%                  g |       | j%                  d	g|       | j)                  |j*                  |       d }y )
Nr   rc   re   c                      j                         } j                          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   s0    ++-C LLNLL**+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   sA    	"11+>?mmo	 ||L)!!)=)=OOy0h%%	 *> *
!  		q 	+AKKMKK))*	+ 	T*X&%(+		4(r   c                 <    | j                  |j                  |       y r+   )r   rW   )r   rY   s     r   assertOneHasNoHubz*TestSemaphoreMultiThread.assertOneHasNoHub   s    #''3'r   z&Flaky there; can't reproduce elsewhereNc           	         	
 ddl m} ddlm
  j	                  |j                  d             dd l}ddlm  j                          j                         d	ddgd	
 f	d	}|j                  |d
      }d|_        |j                  |d      }d|_        |j                          |j                          |j                  d       |j                  d       |j                         s|j                         rWt!              }|j                  d       |j                  d       |k(  rdn"|j                         rF|j                         rW j#                  	dz
  	dz
  g       y )Nr   rc   rN   re   )r&   i'  Tc                   	 rt        j                          	 t              D ]  }s n j                   }s|sJ |rj	                          || <   sj                   	        	       | |f       r,|dz  dk(  r$t        j                  t        j                         |dz  dk(  s 
t        j                           	       }|#|j                          |j                  d       y y # t        $ r.}dd l
}|j                          t        |      | <   d }Y d }~_d }~ww xY w#  	       }|#|j                          |j                  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  sG    3u EA*s{{L9H'833"#GBK%))-/.0"a8 "a"fkV%C%CDSA$V%C%CD%E0 ()?HHJKKTK2 #   )"5"5"7!"g
 ()?HHJKKTK2 #s0   BC4 /C4 4	D+=$D&!D. &D++D. ..E)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   s5    	"711+>?.mmos#r( 	3  	3D U6	U6	







kkmr{{}w-CGGAJGGAJg~ kkmr{{} 	519eai"89r   c                 &    | j                  d       y )N)T   r   r4   s    r   test_dueling_threads_timeoutz5TestSemaphoreMultiThread.test_dueling_threads_timeout<  s    !!),r   c                 (    | j                  d       y )NT)r   r   r4   s    r   test_dueling_threads_with_hubz6TestSemaphoreMultiThread.test_dueling_threads_with_hub?  s    !!T!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   sl    ). O 6:OT<|@
$.`( #Y""#KLH: MH:T-3r   rG   c                       e Zd Zd Zy)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y)TestCExtc                 D    | j                  t        j                  d       y )Nzgevent._gevent_c_semaphore)r'   r   r9   r4   s    r   test_c_extensionzTestCExt.test_c_extensionO  s    --5	7r   N)r8   r9   r:   r   r;   r   r   r   r   L  s    7r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)SwitchWithFixedHashc                 4    |j                   | _         || _        y r+   )switchhashcode)r   greenletr   s      r   r5   zSwitchWithFixedHash.__init__[  s    oo 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    DKK  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y)FirstGrh   c                     t        j                  j                  | g|i | t        | | j                        | _        y r+   )r%   Greenletr5   r   r   r   r   s      r   r5   zFirstG.__init__p  s0      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y)LastG   N)r8   r9   r:   r   r;   r   r   r   r   u  s    Hr   r   c                 F    | j                          |j                  d       y )NT)r   r   )rY   should_quits     r   acquire_then_exitr   z  s    KKMtr   c                     |ry | j                          t        j                  t        | |      }|j	                          y r+   )r   r   r   release_then_spawnrU   rY   r   gs      r   acquire_then_spawnr     s-    KKM'k:AFFHr   c                     | j                          |ry t        j                  t        | |      }|j	                          y r+   )r$   r   r   r   rU   r   s      r   r   r     s-    KKM'k:AFFHr   c                       e Zd Zd Zy)TestSemaphoreFairc                    t               }g }t        j                  t        ||      }t        j                  t        ||      }t        j                  t
        ||      }| j                  t        j                  j                        5  t        j                  |||g       d d d        | j                  |j                  |       | j                  |j                  |       | j                  |j                  |       |j                          |j                          |j                          |j                          t        j                           y # 1 sw Y   xY w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     kll#5sKHll#5sKH++/kBv0099: 	@NNKg>?	@ 	g.((+6));7	@ 	@s   EE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      s    & &    ! ( " !0I&& 0fy3y11 y3@ &>  
 /07y!! 7 17!& !.?V__ ?F 

	** 6 zINN r   