
    ;e}                        d Z ddlZddlZddlZddlZddlmZmZ ddlZddl	Z	ddl
Z
ddlmZ ddlmZ  e	j        ej        d          Zd Z G d d	e          Z G d
 de	j                  Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z/
Various tests for synchronization primitives.
    N)start_new_threadTIMEOUT_MAX)support)threading_helperz9platform doesn't support fork (no _at_fork_reinit method)c                  .    t          j        d           d S )N{Gz?)timesleep     &/usr/lib/python3.11/test/lock_tests.py_waitr      s    Jtr   c                   ,    e Zd ZdZddZd Zd Zd ZdS )	Bunchz
    A bunch of threads.
    Fc                       _         | _        g  _        g  _        |  _        t          j                     _         j                                          fd}	 t          |          D ]}t          |d           dS #  d _         xY w)z
        Construct a bunch of `n` threads running the same function `f`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        c                  ^   t          j                    } j                            |            	               j                            |            j        st                       j        d S d S # j                            |            j        st                       j        w xY wN)	threading	get_identstartedappendfinished	_can_exitr   )tidfselfs    r   taskzBunch.__init__.<locals>.task-   s    %''CL$$$$$S))). GGG .      $$S))). GGG .     s   
A4 48B,r   TN)r   nr   r   r   r   wait_threads_exitwait_thread	__enter__ranger   )r   r   r   wait_before_exitr   is   ``    r   __init__zBunch.__init__   s     --+=??""$$$	 	 	 	 	 		1XX + + r****+ +	!DNs   "B 
Bc                     t          | j                  | j        k     r-t                       t          | j                  | j        k     +d S d S r   )lenr   r   r   r   s    r   wait_for_startedzBunch.wait_for_started>   sG    $,$&((GGG $,$&((((((r   c                     t          | j                  | j        k     r+t                       t          | j                  | j        k     +| j                            d d d            d S r   )r'   r   r   r   r    __exit__r(   s    r   wait_for_finishedzBunch.wait_for_finishedB   s^    $-  46))GGG $-  46)) 	!!$d33333r   c                     d| _         d S NT)r   r(   s    r   	do_finishzBunch.do_finishH   s    r   N)F)__name__
__module____qualname____doc__r%   r)   r,   r/   r   r   r   r   r      s_            >  4 4 4    r   r   c                        e Zd Zd Zd Zd ZdS )BaseTestCasec                 6    t          j                    | _        d S r   )r   threading_setup_threadsr(   s    r   setUpzBaseTestCase.setUpM   s    (8::r   c                 R    t          j        | j          t          j                     d S r   )r   threading_cleanupr8   r   reap_childrenr(   s    r   tearDownzBaseTestCase.tearDownP   s'    *DM::r   c                 j    |                      ||dz             |                     ||dz             d S )Ng333333?g      $@)assertGreaterEqual
assertLess)r   actualexpecteds      r   assertTimeoutzBaseTestCase.assertTimeoutT   s<     	3777400000r   N)r0   r1   r2   r9   r=   rC   r   r   r   r5   r5   L   sA        ; ; ;     1 1 1 1 1r   r5   c                   `    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd ZdS )BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c                 0    |                                  }~d S r   )locktyper   locks     r   test_constructorzBaseLockTests.test_constructorb   s    }}DDr   c                 v    |                                  }|                     t          |          d           ~d S )Nz<unlocked .* object (.*)?at .*>)rG   assertRegexreprrH   s     r   	test_reprzBaseLockTests.test_reprf   s3    }}d%FGGGDDr   c                     |                                  }|                                 |                     t          |          d           ~d S )Nz<locked .* object (.*)?at .*>)rG   acquirerL   rM   rH   s     r   test_locked_reprzBaseLockTests.test_locked_reprk   s@    }}d%DEEEDDr   c                 X    |                                  }|                                 ~d S r   )rG   rP   rH   s     r   test_acquire_destroyz"BaseLockTests.test_acquire_destroyq   s#    }}DDr   c                     |                                  }|                                 |                                 ~d S r   rG   rP   releaserH   s     r   test_acquire_releasez"BaseLockTests.test_acquire_releasev   s0    }}DDr   c                     |                                  }|                     |                    d                     |                                 d S NF)rG   
assertTruerP   rV   rH   s     r   test_try_acquirezBaseLockTests.test_try_acquire|   s>    }}U++,,,r   c                    |                                                                   g fd}t          |d                                           |                     d                                                     d S )Nc                  X                                              d                     d S rY   r   rP   rI   results   r   r   z3BaseLockTests.test_try_acquire_contended.<locals>.f   s'    MM$,,u--.....r      r   )rG   rP   r   r,   assertFalserV   r   r   rI   r`   s     @@r   test_try_acquire_contendedz(BaseLockTests.test_try_acquire_contended   s    }}	/ 	/ 	/ 	/ 	/ 	/a%%'''###r   c                    |                                                                   d}fd}t          ||          }|                                 t	                       |                     t          |j                  d                                            |	                                 |                     t          |j                  |           d S )N   c                  X                                                                         d S r   rP   rV   rI   s   r   r   z/BaseLockTests.test_acquire_contended.<locals>.f   !    LLNNNLLNNNNNr   r   )
rG   rP   r   r)   r   assertEqualr'   r   rV   r,   )r   Nr   brI   s       @r   test_acquire_contendedz$BaseLockTests.test_acquire_contended   s    }}	 	 	 	 	 !QKK	QZ!,,,	QZ!,,,,,r   c                 $   |                                  fd}dfd	} |             t          |d                                           |                     t          |t                     t          |d                                           d S )Nc                  X                                                                         d S r   rh   ri   s   r   r   z"BaseLockTests.test_with.<locals>.f   rj   r   c                 H    5  | | 	 d d d            d S # 1 swxY w Y   d S r   r   )errrI   s    r   _withz&BaseLockTests.test_with.<locals>._with   s|      ?I #                 s   ra   r   )rG   r   r,   assertRaises	TypeError)r   r   rs   rI   s      @r   	test_withzBaseLockTests.test_with   s    }}	 	 	 	 		 	 	 	 	 	 	a%%''')UI666a%%'''''r   c                    |                                  fd}t          t          j                              }t	          |d                                           t          t          j                              |k    rJt          j        d           |                     |t          t          j                                         d S d S )Nc                  X                                                                         d S r   rh   ri   s   r   r   z)BaseLockTests.test_thread_leak.<locals>.f   rj   r      g?)	rG   r'   r   	enumerater   r,   r	   r
   rk   )r   r   r   rI   s      @r   test_thread_leakzBaseLockTests.test_thread_leak   s     }}	 	 	 	 	 	#%%&& 	a&&(((y"$$%%**
 JsOOOQI$7$9$9 : :;;;;; +*r   c                 B   |                                  |                     t          j        dd           |                     t          j        d           |                     t          j        d           |                     t          j        t
          dz                                  t
                                                      t          j                    }| 	                                        d                     t          j                    }| 
                    ||z
  d           g fd}t          |d                                           |                     d                    |                     d         d	           d S )
NFra   itimeoutg}Ô%ITrf   c                      t          j                    }                                         d                     t          j                    }                    || z
             d S )N      ?r}   )r	   	monotonicr   rP   )t1t2rI   resultss     r   r   z%BaseLockTests.test_timeout.<locals>.f   sY    !!BNN4<<<44555!!BNN27#####r   r   r   )rG   rt   
ValueErrorrP   OverflowErrorr   rV   r	   r   rZ   r@   r   r,   rb   rC   )r   r   r   r   rI   r   s       @@r   test_timeoutzBaseLockTests.test_timeout   sr   }}*dlE1===*dlDAAA-uEEE-{QOOO[)))^Q//000^R###	$ 	$ 	$ 	$ 	$ 	$
 	a%%'''$$$71:s+++++r   c                     |                                  }t          j        |          }|                      |                       d S r   )rG   weakrefrefassertIsNotNoner   rI   r   s      r   test_weakref_existsz!BaseLockTests.test_weakref_exists   s>    }}k$SSUU#####r   c                     |                                  }t          j        |          }~t          j                     |                      |                       d S r   )rG   r   r   gccollectassertIsNoner   s      r   test_weakref_deletedz"BaseLockTests.test_weakref_deleted   sL    }}k$

##%%     r   N)r0   r1   r2   r3   rJ   rN   rQ   rS   rW   r[   rd   rn   rv   r{   r   r   r   r   r   r   rE   rE   ]   s             
    
    
  - - - ( ( ( < < <&, , ,4$ $ $
! ! ! ! !r   rE   c                   :    e Zd ZdZd Zd Zd Zed             ZdS )	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c                 Z   |                                  g fd}t          j                    5  t          |d           t	                    dk    r!t                       t	                    dk    !t                       |                     t	                    d                                            t	                    dk    r!t                       t	                    dk    !|                     t	                    d           d d d            d S # 1 swxY w Y   d S )Nc                                                                             d                                                                   d            d S r   rP   r   )rI   phases   r   r   z#LockTests.test_reacquire.<locals>.f   sG    LLNNNLLLLNNNLLr   r   r   ra      )rG   r   r   r   r'   r   rk   rV   )r   r   rI   r   s     @@r   test_reacquirezLockTests.test_reacquire   sY   }}	 	 	 	 	 	 /11 		, 		,Q###e**// e**//GGGSZZ+++LLNNNe**// e**//SZZ+++		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		, 		,s   C!D  D$'D$c                     |                                                                   fd}t          |d          }|                                                                                                   d S )Nc                  0                                       d S r   )rV   ri   s   r   r   z*LockTests.test_different_thread.<locals>.f      LLNNNNNr   ra   )rG   rP   r   r,   rV   r   r   rm   rI   s      @r   test_different_threadzLockTests.test_different_thread   ss    }}	 	 	 	 	!QKK	r   c                 p   |                                  }|                                 |                     |                    d                     |                                 |                     |                                           |                     |                    d                     d S )Nr   r}   F)blocking)rG   rP   rb   rV   lockedrZ   rH   s     r   test_state_after_timeoutz"LockTests.test_state_after_timeout  s     }}d33444'''e4455555r   c                     d }|                                  }|                                  ||           |                                  }|                                 |                                  ||           d S )Nc                 V    |                                   |                                  d S r   rh   ri   s    r   use_lockz/LockTests.test_at_fork_reinit.<locals>.use_lock  s"     LLNNNLLNNNNNr   )rG   _at_fork_reinitrP   )r   r   rI   lock2s       r   test_at_fork_reinitzLockTests.test_at_fork_reinit  s~    	 	 	 }} r   N)	r0   r1   r2   r3   r   r   r   requires_forkr   r   r   r   r   r      sf         , , ,,	 	 	6 6 6   ]  r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )
RLockTestsz$
    Tests for recursive locks.
    c                    |                                  }|                                 |                                 |                                 |                                 |                                 |                                 d S r   rU   rH   s     r   r   zRLockTests.test_reacquire-  sa    }}r   c                    |                                  }|                     t          |j                   |                                 |                                 |                                 |                                 |                                 |                                 |                     t          |j                   d S r   )rG   rt   RuntimeErrorrV   rP   rH   s     r   test_release_unacquiredz"RLockTests.test_release_unacquired6  s    }},555,55555r   c                    |                                  }|                     t          |j                   |                                 |                                 |                                 |                                 |                                 |                                 |                     t          |j                   d S r   )rG   rt   r   _release_saverP   rV   rH   s     r   test_release_save_unacquiredz'RLockTests.test_release_save_unacquiredB  s    }},(:;;;,(:;;;;;r   c                 "   |                                  fd}t          |dd          }	 |                     t          j                   |                                 n# |                                 w xY w|                                 d S )Nc                  0                                       d S r   )rP   ri   s   r   r   z+RLockTests.test_different_thread.<locals>.fQ  r   r   ra   T)rG   r   rt   r   rV   r/   r,   r   s      @r   r   z RLockTests.test_different_threadN  s    }}	 	 	 	 	!Q	lDL999KKMMMMAKKMMMM	s    A" "A8c                    |                                  |                                                                                                 |                                                                                                 |                                                                g fd}t          |d                                           |                     d                                                     |                                                                                                 |                                                                d S )Nc                  V                                                                     d S r   )r   	_is_ownedr_   s   r   r   z$RLockTests.test__is_owned.<locals>.fb  s%    MM$..**+++++r   ra   r   )rG   rb   r   rP   rZ   r   r,   rV   rc   s     @@r   test__is_ownedzRLockTests.test__is_ownedZ  s0   }}))***(()))(()))	, 	, 	, 	, 	, 	,a%%'''###(()))))*****r   N)	r0   r1   r2   r3   r   r   r   r   r   r   r   r   r   r   )  si           
6 
6 
6
< 
< 
<
 
 
+ + + + +r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Ze	d             Z
d Zd	S )

EventTestsz"
    Tests for Event objects.
    c                 T   |                                  }|                     |                                           |                                 |                     |                                           |                                 |                     |                                           |                                 |                     |                                           |                                 |                     |                                           d S r   )	eventtyperb   is_setsetrZ   clearr   evts     r   test_is_setzEventTests.test_is_setq  s    nn&&&			

%%%			

%%%		&&&		&&&&&r   c                    d}g g fd}t          ||          }|                                 t                       |                     t	                    d                                            |                                 |                     dg|z             |                     dg|z             d S )Nrf   c                                                                                                                                                        d S r   r   wait)r   results1results2s   r   r   z#EventTests._check_notify.<locals>.f  s=    OOCHHJJ'''OOCHHJJ'''''r   r   T)r   r)   r   rk   r'   r   r,   )r   r   rl   r   rm   r   r   s    `   @@r   _check_notifyzEventTests._check_notify}  s    	( 	( 	( 	( 	( 	( 	( !QKK	X***				D6A:...D6A:.....r   c                     |                                  }|                     |           |                                 |                                 |                     |           d S r   )r   r   r   r   r   s     r   test_notifyzEventTests.test_notify  sY    nn3					3r   c                    |                                  g g d}fd}t          ||                                           |                     dg|z             D ]0\  }}|                     |           |                     |d           1g g                                  t          ||                                           |                     dg|z             D ]\  }}|                     |           d S )Nrf   c                                                              d                     t          j                    }                     d          }t          j                    }                     ||| z
  f           d S )Ng        r   )r   r   r	   r   )r   rr   r   r   r   s      r   r   z"EventTests.test_timeout.<locals>.f  sh    OOCHHSMM***!!BA!!BOOQRL)))))r   Fr   T)r   r   r,   rk   rb   rC   r   rZ   )r   rl   r   r   dtr   r   r   s        @@@r   r   zEventTests.test_timeout  s=   nn	* 	* 	* 	* 	* 	* 	* 	a%%'''E7Q;/// 	( 	(EArQr3''''			a%%'''D6A:... 	 	EArOOA	 	r   c                 j   |                                  g dd}fd}t          ||          }|                                 t          j                                                                                     |                                 |                     dg|z             d S )Ng      ?rf   c                  ^                                              dz                       d S N   r   )r   r   r~   s   r   r   z(EventTests.test_set_and_clear.<locals>.f  s+    NN388GaK0011111r   T)	r   r   r)   r	   r
   r   r   r,   rk   )r   rl   r   rm   r   r   r~   s       @@@r   test_set_and_clearzEventTests.test_set_and_clear  s     nn	2 	2 	2 	2 	2 	2 	2!QKK	
7						4&1*-----r   c                    |                                  }|j        5  |                     |j                            d                     d d d            n# 1 swxY w Y   |                                 |j        5  |                     |j                            d                     d d d            d S # 1 swxY w Y   d S rY   )r   _condrb   rP   r   r   s     r   r   zEventTests.test_at_fork_reinit  s6    nnY 	7 	7SY..u55666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7Y 	7 	7SY..u55666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s#   .AAA<.B77B;>B;c                     |                                  }|                     t          |          d           |                                 |                     t          |          d           d S )Nz<\w+\.Event at .*: unset>z<\w+\.Event at .*: set>)r   rL   rM   r   r   s     r   rN   zEventTests.test_repr  s^    nnc$@AAA			c$>?????r   N)r0   r1   r2   r3   r   r   r   r   r   r   r   rN   r   r   r   r   r   l  s         
' 
' 
'/ / /"       2. . ." 7 7 ]7@ @ @ @ @r   r   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ConditionTestsz(
    Tests for condition variables.
    c                    |                                  }|                                 |                                 |                                 |                                 t          j                    }|                      |          }|                                 |                     |                    d                     |                                 |                     |                    d                     |                     |                    d                     |                                 |5  |                     |                    d                     d d d            d S # 1 swxY w Y   d S rY   )condtyperP   rV   r   Lockrb   rZ   )r   condrI   s      r   test_acquirezConditionTests.test_acquire  sr   }} 	~}}T""e,,---U++,,,e,,--- 	2 	2T\\%00111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   )E99E= E=c                 n    |                                  }|                     t          |j                   d S r   )r   rt   r   r   r   r   s     r   test_unacquired_waitz#ConditionTests.test_unacquired_wait  s-    }},	22222r   c                 n    |                                  }|                     t          |j                   d S r   )r   rt   r   notifyr   s     r   test_unacquired_notifyz%ConditionTests.test_unacquired_notify  s-    }},44444r   c                    d}g g g dfd}t          ||          }|                                 t                    dk     r!t                       t                    dk     !                                 |                     g                                                                 d           t                       d                                 t                    dk     r!t                       t                    dk     !|                     dgdz             |                     g            t                    dk     r!t                       t                    dk     !                                                     d           t                       d                                 t                    t                    z   dk     r1t                       t                    t                    z   dk     1|                     dgdz  d	gdz  z              |                     d	gdz             t                    dk     r!t                       t                    dk     !                                 	                                 t                       d                                 t                    dk     r!t                       t                    dk     !|                     dgdz  d	gdz  z              |                     d	gdz  d
gdz  z              |
                                 d S )Nrf   r   c                                                                                                                      }                                                      | f                                                                                                            }                                                      | f           d S r   )rP   r   r   rV   )r`   r   	phase_numreadyr   r   s    r   r   z'ConditionTests._check_notify.<locals>.f  s    LLNNNLL###YY[[FLLNNNOOVY/000LLNNNLL###YY[[FLLNNNOOVY/00000r      ra   )Tra   r      )Tr   )Tr   )r   r)   r'   r   r   rk   rP   r   rV   
notify_allr,   )	r   r   rl   r   rm   r   r   r   r   s	    `   @@@@r   r   zConditionTests._check_notify  s2    	
	1 
	1 
	1 
	1 
	1 
	1 
	1 
	1 
	1 !QKK	 %jj1nnGGG %jj1nn2&&&A	(mmaGGG (mmaI;?3332&&&%jj1nnGGG %jj1nn 	A	(mmc(mm+a//GGG (mmc(mm+a//I;?i[1_#DEEEI;?333%jj1nnGGG %jj1nn 		(mmaGGG (mmaI;?hZ!^#CDDDI;?i[1_#DEEE	r   c                     |                                  }|                     |           |                     |           d S r   )r   r   r   s     r   r   zConditionTests.test_notify;  s=    }}4   4     r   c                 6   |                                  g d}fd}t          ||                                           |                     t	                    |           D ]0\  }}|                     |d           |                     |           1d S )Nrf   c                                                       t          j                    }                     d          }t          j                    }                                                     || z
  |f           d S )Nr   )rP   r	   r   r   rV   r   )r   r`   r   r   r   s      r   r   z&ConditionTests.test_timeout.<locals>.fE  sg    LLNNN!!BYYs^^F!!BLLNNNNNBGV,-----r   r   )r   r   r,   rk   r'   rC   rb   )r   rl   r   r   r`   r   r   s        @@r   r   zConditionTests.test_timeoutA  s    }}	. 	. 	. 	. 	. 	. 	a%%'''Wq)))! 	% 	%JBr3''' V$$$$	% 	%r   c                 h                                      d fd}t          |d          }|                                 t          d          D ]I}t	          j        d           5  dz                                   d d d            n# 1 swxY w Y   J|                                 d S )Nr   c                      5                       fd          }                     |                                d           d d d            d S # 1 swxY w Y   d S )Nc                       dk    S r   r   states   r   <lambda>z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>\      q r   r   )wait_forrZ   rk   )r`   r   r   r   s    r   r   z&ConditionTests.test_waitfor.<locals>.fZ  s     + +'8'8'8'899'''  ***+ + + + + + + + + + + + + + + + + +s   AAAAra   r   r   )r   r   r)   r"   r	   r
   r   r,   )r   r   rm   r$   r   r   s   `   @@r   test_waitforzConditionTests.test_waitforW  s   }}	+ 	+ 	+ 	+ 	+ 	+ 	+
 !QKK	q 	 	AJt  
               	
s   ,BB	B	c                                                       dg  fd}t          |d          }|                                 t          d          D ]I}t	          j        d           5  dz                                   d d d            n# 1 swxY w Y   J|                                                      t                    d           d S )Nr   c                  D   5  t          j                    }                     fdd          }t          j                    | z
  }                     |                               | d                               d            d d d            d S # 1 swxY w Y   d S )Nc                       dk    S r   r   r   s   r   r   z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>o  r   r   g?r}   )r	   r   r   rb   rC   r   )r   r`   r   r   r   successs     r   r   z.ConditionTests.test_waitfor_timeout.<locals>.fl  s     % %^%%'8'8'8'8#FF^%%*  (((""2s+++t$$$% % % % % % % % % % % % % % % % % %s   BBBBra   r   r   )
r   r   r)   r"   r	   r
   r   r,   rk   r'   )r   r   rm   r$   r   r   r   s   `   @@@r   test_waitfor_timeoutz#ConditionTests.test_waitfor_timeouth  s3   }}	% 	% 	% 	% 	% 	% 	% 	% !QKK	q 	 	AJt  
               	
Wq)))))s   0BB	B	N)r0   r1   r2   r3   r   r   r   r   r   r   r   r   r   r   r   r   r     s         2 2 2&3 3 35 5 5H H HT! ! !% % %,  "* * * * *r   r   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c                     |                      t          | j        d           |                      t          | j        t          j                    d S )N)value)rt   r   semtypesysmaxsizer(   s    r   rJ   z#BaseSemaphoreTests.test_constructor  sF    *dlB???*dlS[LIIIIIr   c                 J   |                      d          }|                                 |                                 |                      d          }|                                 |                                 |                                 |                                 d S )Nra   r   )r  rP   rV   r   sems     r   r   zBaseSemaphoreTests.test_acquire  sr    ll1ooll1oor   c                 X    |                                  }|                                 ~d S r   )r  rP   r  s     r   rS   z'BaseSemaphoreTests.test_acquire_destroy  s#    llnnCCr   c                 H  	 |                      d                                           d}g 	g g d	fd}t          |d          }|                                 t	                    t	                    z   dk     r1t                       t	                    t	                    z   dk     1|                     z   dgdz             dt          d          D ]}                                 t	                    t	                    z   dk     r1t                       t	                    t	                    z   dk     1|                     t          z             dgdz  dgdz  z              dt          d          D ]}                                 t	                    t	                    z   d	k     r1t                       t	                    t	                    z   d	k     1|                     t          z             dgdz  dgdz  z   dgdz  z              | 
                                        d
                                                      |                                 |                     	dgdz             d S )N   
   r   c                                                                                                                                                                                                                        d S r   r^   )r   r   r   r  sem_resultss   r   r   z4BaseSemaphoreTests.test_acquire_contended.<locals>.f  se    s{{}}---OOI&&&s{{}}---OOI&&&&&r      ra      r      FT   )r  rP   r   r)   r'   r   rk   r"   rV   sortedrb   r,   )
r   rl   r   rm   r$   r   r   r   r  r  s
        @@@@@r   rn   z)BaseSemaphoreTests.test_acquire_contended  s   ll1oo		' 	' 	' 	' 	' 	' 	' 	' 	'
 !RLL	(mmc(mm+a//GGG (mmc(mm+a//H,qcAg666	q 	 	AKKMMMM(mmc(mm+b00GGG (mmc(mm+b008 344qcAga6GHHH	q 	 	AKKMMMM(mmc(mm+b00GGG (mmc(mm+b008 344qcAga6G1#PQ'6QRRRU++,,,	tf&>?????r   c                    |                      d                                           g g dfd}t          |d          }|                                 t	                    t	                    z   dk     r1t                       t	                    t	                    z   dk     1|                     z   dgdz             d                    d           t	                    t	                    z   dk     r1t                       t	                    t	                    z   dk     1|                     t          z             dgdz  dgdz  z              d                    d           t	                    t	                    z   d	k     r1t                       t	                    t	                    z   d	k     1|                     t          z             dgdz  dgdz  z   dgdz  z              | 	                                        d
                                                      |
                                 d S )Nr  r   c                                                                                                                                                          d S r   r   )r   r   r   r  s   r   r   z/BaseSemaphoreTests.test_multirelease.<locals>.f  sG    KKMMMOOI&&&KKMMMOOI&&&&&r   r  r  ra   r  r   r  F)r  rP   r   r)   r'   r   rk   rV   r  rb   r,   )r   r   rm   r   r   r   r  s      @@@@r   test_multireleasez$BaseSemaphoreTests.test_multirelease  sE   ll1oo		' 	' 	' 	' 	' 	' 	' 	'
 !RLL	(mmc(mm+a//GGG (mmc(mm+a//H,qcAg666	A(mmc(mm+b00GGG (mmc(mm+b008 344qcAga6GHHH	A(mmc(mm+b00GGG (mmc(mm+b008 344qcAga6G1#PQ'6QRRRU++,,,	r   c                    |                      d          }|                     |                    d                     |                     |                    d                     |                     |                    d                     |                                 |                     |                    d                     d S )Nr   F)r  rZ   rP   rb   rV   r  s     r   r[   z#BaseSemaphoreTests.test_try_acquire  s    ll1ooE**+++E**+++U++,,,E**+++++r   c                    |                      d                                           g fd}t          |d                                           |                     t                    dgdz  dgdz  z              d S )Nr   c                                                                d                                                               d                     d S rY   r^   )r   r  s   r   r   z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.f  sE    NN3;;u--...NN3;;u--.....r   rf   Fr  Tr   )r  rP   r   r,   rk   r  )r   r   r   r  s     @@r   rd   z-BaseSemaphoreTests.test_try_acquire_contended  s    ll1oo	/ 	/ 	/ 	/ 	/ 	/ 	a%%''' 	5'A+!*CEEEEEr   c                    |                      d          }|                     t          |j        dd           |                     |                    d                     |                     |                    d                     |                     |                    d                     |                                 |                     |                    d                     t          j                    }|                     |                    d                     t          j                    |z
  }| 	                    |d           d S )Nr   F      ?r}   g{Gzt?r   )
r  rt   r   rP   rZ   rb   rV   r	   r   rC   )r   r  tr   s       r   test_acquire_timeoutz'BaseSemaphoreTests.test_acquire_timeout  s   ll1oo*ck5#FFFE22333E22333U33444E22333NS11222^!2s#####r   c                 J   |                                                                   fd}t          |d          }|                                 t	                       |                     |j                                                    |                                 d S )Nc                  X                                                                         d S r   rh   )r  s   r   r   z0BaseSemaphoreTests.test_default_value.<locals>.f  s!    KKMMMKKMMMMMr   ra   )	r  rP   r   r)   r   rb   r   rV   r,   )r   r   rm   r  s      @r   test_default_valuez%BaseSemaphoreTests.test_default_value  s    llnn	 	 	 	 	 !QKK	$$$	r   c                                           d          d fd	} |                                                      d                                                                           t
          |t
                                                              d                                                      d S )Nr   c                 D   5                                           d                                                      5                                          d                     | r| 	 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 rY   )rZ   rP   rV   rb   )rr   r   r  s    r   rs   z+BaseSemaphoreTests.test_with.<locals>._with  s%    " "E 2 2333 " "$$S[[%7%7888 "!	"" " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " "s5   ?B-A=1B=B	BB	BBBFr   )r  rZ   rP   rV   rt   ru   )r   rs   r  s   ` @r   rv   zBaseSemaphoreTests.test_with  s    ll1oo	" 	" 	" 	" 	" 	" 	" 	E**+++)UI666E**+++r   N)r0   r1   r2   r3   rJ   r   rS   rn   r  r[   rd   r  r   rv   r   r   r   r   r     s         J J J    
#@ #@ #@J  @, , ,F F F$ $ $      r   r   c                       e Zd ZdZd Zd ZdS )SemaphoreTestsz)
    Tests for unbounded semaphores.
    c                     |                      d          }|                                 |                                 |                                 |                                 d S Nra   )r  rV   rP   r  s     r   r   z&SemaphoreTests.test_release_unacquired#  sI    ll1oor   c                 z   |                      d          }|                     t          |          d           |                                 |                     t          |          d           |                                 |                                 |                     t          |          d           d S )Nr   z<\w+\.Semaphore at .*: value=3>z<\w+\.Semaphore at .*: value=2>z<\w+\.Semaphore at .*: value=4>)r  rL   rM   rP   rV   r  s     r   rN   zSemaphoreTests.test_repr+  s    ll1ooc$FGGGc$FGGGc$FGGGGGr   Nr0   r1   r2   r3   r   rN   r   r   r   r$  r$    sA           H H H H Hr   r$  c                       e Zd ZdZd Zd ZdS )BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    c                     |                                  }|                     t          |j                   |                                 |                                 |                     t          |j                   d S r   )r  rt   r   rV   rP   r  s     r   r   z-BoundedSemaphoreTests.test_release_unacquired:  s_    llnn*ck222*ck22222r   c                     |                      d          }|                     t          |          d           |                                 |                     t          |          d           d S )Nr   z(<\w+\.BoundedSemaphore at .*: value=3/3>z(<\w+\.BoundedSemaphore at .*: value=2/3>)r  rL   rM   rP   r  s     r   rN   zBoundedSemaphoreTests.test_reprB  s^    ll1ooc$OPPPc$OPPPPPr   Nr(  r   r   r   r*  r*  5  sA         3 3 3Q Q Q Q Qr   r*  c                   v    e Zd ZdZdZdZd Zd Zd Zd Z	dd	Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BarrierTestsz$
    Tests for Barrier objects.
    rf   g       @c                 R    |                      | j        | j                  | _        d S )Nr}   )barriertyperl   defaultTimeoutbarrierr(   s    r   r9   zBarrierTests.setUpP  s%    ''8K'LLr   c                 8    | j                                          d S r   )r2  abortr(   s    r   r=   zBarrierTests.tearDownR  s    r   c                 r    t          || j        dz
            } |             |                                 d S r&  )r   rl   r,   )r   r   rm   s      r   run_threadszBarrierTests.run_threadsU  s:    !TVAX		r   c                 |   | j         j        }|                     || j                   t	          |          D ]}|d                             d           |                     t          |d                   ||z             | j                                          |d                             d           |                     t          |d                   |dz   |z             | j                                          |                     | j         j        d           | 	                    | j         j
                   d S )Nr   Tra   )r2  partiesrk   rl   r"   r   r'   r   	n_waitingrb   broken)r   r   r   mr$   s        r   	multipasszBarrierTests.multipassZ  s   L DF###q 	  	 AAJd###S__a!e444LAJd###S__q1uk:::L/333,-----r   ra   c                 L     g g g fd}                      |           dS )z;
        Test that a barrier is passed in lockstep
        c                  4                                     d S r   )r<  )passesr   r   s   r   r   z$BarrierTests.test_barrier.<locals>.fl  s    NN7F+++++r   Nr6  )r   r?  r   r   s   `` @r   test_barrierzBarrierTests.test_barrierg  sM     b'	, 	, 	, 	, 	, 	, 	,r   c                 ,    |                      d          S )zC
        Test that a barrier works for 10 consecutive runs
        r  )rA  r(   s    r   test_barrier_10zBarrierTests.test_barrier_10p  s       $$$r   c                      g  fd}                      |                                t                    t          t           j                                       dS )z9
        test the return value from barrier.wait
        c                  d    j                                         }                     |            d S r   )r2  r   r   )r   r   r   s    r   r   z(BarrierTests.test_wait_return.<locals>.f{  s.    !!##ANN1r   N)r6  rk   sumr"   rl   )r   r   r   s   ` @r   test_wait_returnzBarrierTests.test_wait_returnv  sq     	 	 	 	 	 	 	Ws5=='9'9:::::r   c                      g fd}                       j        |           fd}                     |           dS )z,
        Test the 'action' callback
        c                  2                          d           d S r.   )r   )r   s   r   actionz(BarrierTests.test_action.<locals>.action  s    NN4     r   c                  v                                                           t                    d           d S r&  )r   rk   r'   )r2  r   r   s   r   r   z#BarrierTests.test_action.<locals>.f  s2    LLNNNS\\1-----r   Nr0  rl   r6  )r   rJ  r   r2  r   s   `  @@r   test_actionzBarrierTests.test_action  s{     	! 	! 	! 	! 	!""46622	. 	. 	. 	. 	. 	. 	. 	r   c                 &    g g  fd}                      |                                t                    d                                t                     j        dz
                                   j        j                   dS )zK
        Test that an abort will put the barrier in a broken state
        c                  b   	 j                                         } | j        dz  k    rt          j                                                              d           d S # t
          j        $ r                     d           Y d S t          $ r j                                          Y d S w xY wNr   T)r2  r   rl   r   r   r   BrokenBarrierErrorr4  )r$   r   r   r   s    r   r   z"BarrierTests.test_abort.<locals>.f  s    
L%%''	>>&&!!###%%%%%/ & & &%%%%%%   ""$$$s   AA! !$B."B.-B.r   ra   N)r6  rk   r'   rl   rZ   r2  r:  )r   r   r   r   s   ` @@r   
test_abortzBarrierTests.test_abort  s     	 	 	 	 	 	 	 	X***Xq111+,,,,,r   c                 @    g g g  fd}                      |                                t                    d                                t                     j        dz
                                  t                     j                   dS )zL
        Test that a 'reset' on a barrier frees the waiting threads
        c                  "   j                                         } | j        dz  k    r^j         j        j        dz
  k     r,t	          j        d           j         j        j        dz
  k     ,j                                          nZ	 j                                                              d           n*# t          j	        $ r                     d           Y nw xY wj                                                              d           d S )Nr   ra   gMbP?T)
r2  r   rl   r9  r	   r
   resetr   r   rQ  )r$   r   r   results3r   s    r   r   z"BarrierTests.test_reset.<locals>.f  s   !!##ADFAI~~l,tvax77Ju%%% l,tvax77""$$$$*L%%'''OOD)))) 3 * * *OOD)))))* LOOD!!!!!s   .B7 7$CCr   ra   N)r6  rk   r'   rl   )r   r   r   r   rV  s   ` @@@r   
test_resetzBarrierTests.test_reset  s     	" 	" 	" 	" 	" 	" 	" 	"" 	X***Xq111X/////r   c                 x    g g g                        j                   fd}                     |                                t	                    d                                t	                     j        dz
                                  t	                     j                   dS )zF
        Test that a barrier can be reset after being broken.
        c                  V   	 j                                         } | j        dz  k    rt          j                                                              d           nN# t
          j        $ r                     d           Y n(t          $ r j                                          Y nw xY w                                j        dz  k    rj                                                                           j                                                              d           d S rP  )	r2  r   rl   r   r   r   rQ  r4  rU  )r$   barrier2r   r   rV  r   s    r   r   z,BarrierTests.test_abort_and_reset.<locals>.f  s"   
L%%''	>>&&!!###%%%%/ & & &%%%%%   ""$$$ }}$&!)++""$$$MMOOOLOOD!!!!!s   AA   $B+"B+*B+r   ra   N)r0  rl   r6  rk   r'   )r   r   rZ  r   r   rV  s   ` @@@@r   test_abort_and_resetz!BarrierTests.test_abort_and_reset  s     ##DF++	" 	" 	" 	" 	" 	" 	" 	" 	"* 	X***Xq111X/////r   c                 <      fd}                      |           dS )z$
        Test wait(timeout)
        c                      j                                         } | j        dz  k    rt          j        d                               t          j        j         j        d           d S )Nr   r  r   )r2  r   rl   r	   r
   rt   r   rQ  )r$   r   s    r   r   z$BarrierTests.test_timeout.<locals>.f  se    !!##ADFaK
3i:"l/6 6 6 6 6r   Nr@  )r   r   s   ` r   r   zBarrierTests.test_timeout  s8    	6 	6 	6 	6 	6 	r   c                 x                            j        d           fd}                     |           dS )z4
        Test the barrier's default timeout
        g333333?r}   c                                                       } | j        dz  k    rt          j        d                               t
          j        j                    d S )Nr   r  )r   rl   r	   r
   rt   r   rQ  )r$   r2  r   s    r   r   z,BarrierTests.test_default_timeout.<locals>.f  sO    ADFaK
3i:GLIIIIIr   NrL  )r   r   r2  s   ` @r   test_default_timeoutz!BarrierTests.test_default_timeout  s`    
 ""463"77	J 	J 	J 	J 	J 	J 	r   c                     |                      d          }|                                 |                                 d S r&  )r0  r   )r   rm   s     r   test_single_threadzBarrierTests.test_single_thread  s3    Q		r   c                 >   |                      d          |                     t                    d           fd}t          |d          }|                                 t          j        d           |                     t                    d                               d           |                                 |                     t                    d           	                                 |                     t                    d           d S )Nr   z!<\w+\.Barrier at .*: waiters=0/3>c                  2                          d           d S )Nr   )r   )rm   s   r   r   z!BarrierTests.test_repr.<locals>.f  s    FF1IIIIIr   r   g?z!<\w+\.Barrier at .*: waiters=2/3>z<\w+\.Barrier at .*: broken>)
r0  rL   rM   r   r)   r	   r
   r   r,   r4  )r   r   bunchrm   s      @r   rN   zBarrierTests.test_repr	  s   Qa"FGGG	 	 	 	 	a   
3a"FGGG	q			!!!a"FGGG				a"ABBBBBr   N)ra   )r0   r1   r2   r3   rl   r1  r9   r=   r6  r<  rA  rC  rG  rM  rR  rW  r[  r   r`  rb  rN   r   r   r   r.  r.  I  s         	
ANM M M    
. . .   % % %
; 
; 
;  - - -00 0 0< 0  0  0D      
C C C C Cr   r.  ) r3   osr   r  r	   _threadr   r   r   unittestr   testr   test.supportr   
skipUnlesshas_fork_supportr   r   objectr   TestCaser5   rE   r   r   r   r   r   r$  r*  r.  r   r   r   <module>ro     s    
			 				 



  1 1 1 1 1 1 1 1             ) ) ) ) ) ) $#G$<%CD D
  . . . . .F . . .b1 1 1 1 18$ 1 1 1"E! E! E! E! E!L E! E! E!PA A A A A A A AH@+ @+ @+ @+ @+ @+ @+ @+Fb@ b@ b@ b@ b@ b@ b@ b@Jl* l* l* l* l*\ l* l* l*^\ \ \ \ \ \ \ \|H H H H H' H H H.Q Q Q Q Q. Q Q Q(MC MC MC MC MC< MC MC MC MC MCr   