o
    GXhx                     @   s4  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	eeddZdd	 ZG d
d deZG dd de	jZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS ) z/
Various tests for synchronization primitives.
    N)start_new_threadTIMEOUT_MAX)support)threading_helperforkz9platform doesn't support fork (no _at_fork_reinit method)c                   C   s   t d d S )N{Gz?)timesleep r
   r
   9/opt/python-3.10.19/usr/lib/python3.10/test/lock_tests.py_wait   s   r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )Bunchz
    A bunch of threads.
    Fc                    sp    _ |_g _g _| _t _j   fdd}zt	|D ]}t
|d q&W dS    d_ )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               	      sd   t  } j|  z   W j|  js t  jrd S d S j|  js1t  jr+w N)	threading	get_identstartedappendfinished	_can_exitr   )tidfselfr
   r   task-   s   zBunch.__init__.<locals>.taskr
   TN)r   nr   r   r   r   wait_threads_exitwait_thread	__enter__ranger   )r   r   r   Zwait_before_exitr   ir
   r   r   __init__   s   


zBunch.__init__c                 C   s.   t | j| jk rt  t | j| jk sd S d S r   )lenr   r   r   r   r
   r
   r   wait_for_started>   s   zBunch.wait_for_startedc                 C   s:   t | j| jk rt  t | j| jk s| jd d d  d S r   )r!   r   r   r   r   __exit__r"   r
   r
   r   wait_for_finishedB   s   zBunch.wait_for_finishedc                 C   s
   d| _ d S NT)r   r"   r
   r
   r   	do_finishH   s   
zBunch.do_finishN)F)__name__
__module____qualname____doc__r    r#   r%   r'   r
   r
   r
   r   r      s    
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BaseTestCasec                 C   s   t  | _d S r   )r   Zthreading_setup_threadsr"   r
   r
   r   setUpM      zBaseTestCase.setUpc                 C   s   t j| j  t  d S r   )r   Zthreading_cleanupr-   r   reap_childrenr"   r
   r
   r   tearDownP   s   zBaseTestCase.tearDownc                 C   s$   |  ||d  | ||d  d S )Ng333333?g      $@)ZassertGreaterEqual
assertLess)r   actualZexpectedr
   r
   r   assertTimeoutT   s   zBaseTestCase.assertTimeoutN)r(   r)   r*   r.   r1   r4   r
   r
   r
   r   r,   L   s    r,   c                   @   sx   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c                 C   s   |   }~d S r   )locktyper   lockr
   r
   r   test_constructorb   s   zBaseLockTests.test_constructorc                 C   s   |   }| t|d ~d S )Nz<unlocked .* object (.*)?at .*>)r6   assertRegexreprr7   r
   r
   r   	test_reprf   s   zBaseLockTests.test_reprc                 C   s&   |   }|  | t|d ~d S )Nz<locked .* object (.*)?at .*>)r6   acquirer:   r;   r7   r
   r
   r   test_locked_reprk   s   zBaseLockTests.test_locked_reprc                 C      |   }|  ~d S r   )r6   r=   r7   r
   r
   r   test_acquire_destroyq      z"BaseLockTests.test_acquire_destroyc                 C   s   |   }|  |  ~d S r   r6   r=   releaser7   r
   r
   r   test_acquire_releasev   s   z"BaseLockTests.test_acquire_releasec                 C   s$   |   }| |d |  d S NF)r6   
assertTruer=   rC   r7   r
   r
   r   test_try_acquire|   s   zBaseLockTests.test_try_acquirec                    sJ   |       g  fdd}t|d  | d     d S )Nc                      s     d d S rE   r   r=   r
   r8   resultr
   r   r      s   z3BaseLockTests.test_try_acquire_contended.<locals>.f   r   )r6   r=   r   r%   assertFalserC   r   r   r
   rI   r   test_try_acquire_contended   s   z(BaseLockTests.test_try_acquire_contendedc                    sp   |       d} fdd}t||}|  t  | t|jd    |	  | t|j| d S )N   c                                d S r   r=   rC   r
   r8   r
   r   r         z/BaseLockTests.test_acquire_contended.<locals>.fr   )
r6   r=   r   r#   r   assertEqualr!   r   rC   r%   r   Nr   br
   rR   r   test_acquire_contended   s   
z$BaseLockTests.test_acquire_contendedc                    sV   |     fdd}d fdd	}|  t|d  | t|t t|d  d S )Nc                      rP   r   rQ   r
   rR   r
   r   r      rS   z"BaseLockTests.test_with.<locals>.fc                    s6     | d ur	| W d    d S 1 sw   Y  d S r   r
   errrR   r
   r   _with   s
   "z&BaseLockTests.test_with.<locals>._withrK   r   )r6   r   r%   assertRaises	TypeError)r   r   r[   r
   rR   r   	test_with   s   zBaseLockTests.test_withc                    sd   |     fdd}tt }t|d  tt |kr0td | |tt  d S d S )Nc                      rP   r   rQ   r
   rR   r
   r   r      rS   z)BaseLockTests.test_thread_leak.<locals>.f   g?)	r6   r!   r   	enumerater   r%   r   r	   rT   )r   r   r   r
   rR   r   test_thread_leak   s   
zBaseLockTests.test_thread_leakc                    s   |    | t jdd | jt jdd | jt jdd | jt jtd d  jtd    t }| 	 jdd t }| 
|| d g  fdd}t|d  | d	  | d d
 d S )NFrK   itimeoutg}Ô%ITrO   c                     s4   t  }  jdd t  }||   d S )N      ?rb   )r   	monotonicr   r=   )t1t2r8   resultsr
   r   r      s   z%BaseLockTests.test_timeout.<locals>.fr   rd   )r6   r\   
ValueErrorr=   OverflowErrorr   rC   r   re   rF   r2   r   r%   rL   r4   )r   rf   rg   r   r
   rh   r   test_timeout   s    zBaseLockTests.test_timeoutc                 C   s"   |   }t|}| |  d S r   )r6   weakrefrefZassertIsNotNoner   r8   rn   r
   r
   r   test_weakref_exists   s   
z!BaseLockTests.test_weakref_existsc                 C   s,   |   }t|}~t  | |  d S r   )r6   rm   rn   gcZcollectZassertIsNonero   r
   r
   r   test_weakref_deleted   s
   
z"BaseLockTests.test_weakref_deletedN)r(   r)   r*   r+   r9   r<   r>   r@   rD   rG   rN   rX   r^   ra   rl   rp   rr   r
   r
   r
   r   r5   ]   s    
r5   c                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c                    s   |    g  fdd}t C t|d tdkr&t  tdkst  | td    tdkrDt  tdks;| td W d    d S 1 sWw   Y  d S )Nc                      s(       d      d  d S r   r=   r   r
   r8   Zphaser
   r   r         
z#LockTests.test_reacquire.<locals>.fr
   r   rK      )r6   r   r   r   r!   r   rT   rC   rM   r
   ru   r   test_reacquire   s    

"zLockTests.test_reacquirec                    sB   |        fdd}t|d}|        d S )Nc                             d S r   )rC   r
   rR   r
   r   r        z*LockTests.test_different_thread.<locals>.frK   )r6   r=   r   r%   rC   r   r   rW   r
   rR   r   test_different_thread   s   
zLockTests.test_different_threadc                 C   sN   |   }|  | |jdd |  | |  | |jdd d S )Nr   rb   F)blocking)r6   r=   rL   rC   lockedrF   r7   r
   r
   r   test_state_after_timeout  s   z"LockTests.test_state_after_timeoutc                 C   sD   dd }|   }|  || |   }|  |  || d S )Nc                 S   s   |    |   d S r   rQ   rR   r
   r
   r   use_lock  s   z/LockTests.test_at_fork_reinit.<locals>.use_lock)r6   _at_fork_reinitr=   )r   r   r8   Zlock2r
   r
   r   test_at_fork_reinit  s   zLockTests.test_at_fork_reinitN)	r(   r)   r*   r+   rx   r|   r   requires_forkr   r
   r
   r
   r   rs      s    
rs   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )
RLockTestsz$
    Tests for recursive locks.
    c                 C   s<   |   }|  |  |  |  |  |  d S r   rB   r7   r
   r
   r   rx   -  s   zRLockTests.test_reacquirec                 C   sX   |   }| t|j |  |  |  |  |  |  | t|j d S r   )r6   r\   RuntimeErrorrC   r=   r7   r
   r
   r   test_release_unacquired6     z"RLockTests.test_release_unacquiredc                 C   sX   |   }| t|j |  |  |  |  |  |  | t|j d S r   )r6   r\   r   _release_saver=   rC   r7   r
   r
   r   test_release_save_unacquiredB  r   z'RLockTests.test_release_save_unacquiredc                    sR   |     fdd}t|dd}z| t j W |  n|  w |  d S )Nc                      ry   r   )r=   r
   rR   r
   r   r   Q  rz   z+RLockTests.test_different_thread.<locals>.frK   T)r6   r   r\   r   rC   r'   r%   r{   r
   rR   r   r|   N  s   z RLockTests.test_different_threadc                    s   |    |       |       |    g  fdd}t|d  | d     |       |    d S )Nc                      s       d S r   )r   	_is_ownedr
   rI   r
   r   r   b  s   z$RLockTests.test__is_owned.<locals>.frK   r   )r6   rL   r   r=   rF   r   r%   rC   rM   r
   rI   r   test__is_ownedZ  s   zRLockTests.test__is_ownedN)	r(   r)   r*   r+   rx   r   r   r|   r   r
   r
   r
   r   r   )  s    	r   c                   @   sD   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
dS )
EventTestsz"
    Tests for Event objects.
    c                 C   sr   |   }| |  |  | |  |  | |  |  | |  |  | |  d S r   )	eventtyperL   is_setsetrF   clearr   evtr
   r
   r   test_is_setq  s   zEventTests.test_is_setc                    s|   d}g g  fdd}t ||}|  t  | td    |  | dg|  | dg|  d S )NrO   c                      s            d S r   r   waitr
   r   results1results2r
   r   r     s   z#EventTests._check_notify.<locals>.fr   T)r   r#   r   rT   r!   r   r%   )r   r   rV   r   rW   r
   r   r   _check_notify}  s   
zEventTests._check_notifyc                 C   s0   |   }| | |  |  | | d S r   )r   r   r   r   r   r
   r
   r   test_notify  s
   
zEventTests.test_notifyc                    s   |    g g d} fdd}t||  | dg|  D ]\}}| | | |d q$g g    t||  | dg|  D ]	\}}| | qNd S )NrO   c                     s@     d t }  d}t } |||  f d S )Ng        rd   )r   r   r   re   )rf   rrg   r   r
   r   r     s
   
z"EventTests.test_timeout.<locals>.fFrd   T)r   r   r%   rT   rL   r4   r   rF   )r   rV   r   r   dtr
   r   r   rl     s$   
zEventTests.test_timeoutc                    sn   |    g dd} fdd}t||}|  t       |  | dg|  d S )Ng      ?rO   c                      s     d  d S N   r   r
   r   ri   rc   r
   r   r        z(EventTests.test_set_and_clear.<locals>.fT)	r   r   r#   r   r	   r   r   r%   rT   rU   r
   r   r   test_set_and_clear  s   

zEventTests.test_set_and_clearc                 C   s   |   }|j | |jd W d    n1 sw   Y  |  |j | |jd W d    d S 1 s<w   Y  d S rE   )r   _condrL   r=   r   r   r
   r
   r   r     s   "zEventTests.test_at_fork_reinitN)r(   r)   r*   r+   r   r   r   rl   r   r   r   r
   r
   r
   r   r   l  s    r   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )ConditionTestsz(
    Tests for condition variables.
    c                 C   s   |   }|  |  |  |  t }|  |}|  | |d |  | |d | |d |  | | |d W d    d S 1 sWw   Y  d S rE   )condtyper=   rC   r   LockrL   rF   )r   condr8   r
   r
   r   test_acquire  s    
"zConditionTests.test_acquirec                 C      |   }| t|j d S r   )r   r\   r   r   r   r   r
   r
   r   test_unacquired_wait     z#ConditionTests.test_unacquired_waitc                 C   r   r   )r   r\   r   notifyr   r
   r
   r   test_unacquired_notify  r   z%ConditionTests.test_unacquired_notifyc                    s  d}g g g d fdd}t ||}|  tdk r,t  tdk s#  | g      d t  d   tdk rWt  tdk sN| dgd  | g  tdk rut  tdk sl    d t  d   tt d	k rt  tt d	k s| dgd d
gd   | d
gd  tdk rt  tdk s    	  t  d   tdk rt  tdk s| dgd d
gd   | d
gd dgd   |
  d S )NrO   r   c                     sd          }    | f        }    | f d S r   )r=   r   r   rC   rJ   r   	phase_numreadyr   r   r
   r   r     s   

z'ConditionTests._check_notify.<locals>.f   rK   )TrK   rw      )Trw   )Tr   )r   r#   r!   r   r   rT   r=   r   rC   
notify_allr%   )r   r   rV   r   rW   r
   r   r   r     sd   


zConditionTests._check_notifyc                 C   s    |   }| | | | d S r   )r   r   r   r
   r
   r   r   5  s   
zConditionTests.test_notifyc                    sd   |    g d} fdd}t||  | t| D ]\}}| |d | | q d S )NrO   c                     s@       t }  d}t }   ||  |f d S )Nrd   )r=   r   re   r   rC   r   )rf   rJ   rg   r   ri   r
   r   r   ?  s   
z&ConditionTests.test_timeout.<locals>.frd   )r   r   r%   rT   r!   r4   rL   )r   rV   r   r   rJ   r
   r   r   rl   ;  s   zConditionTests.test_timeoutc              	      s      d fdd}t|d}|  tdD ]!}td   d7    W d    n1 s7w   Y  q|  d S )Nr   c                     sR       fdd} |  d W d    d S 1 s"w   Y  d S )Nc                          dkS r   r
   r
   stater
   r   <lambda>V      z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>r   )wait_forrF   rT   r   r   r   r   r
   r   r   T  s
   
"z&ConditionTests.test_waitfor.<locals>.frK   r   r   )r   r   r#   r   r   r	   r   r%   r   r   rW   r   r
   r   r   test_waitforQ  s   


zConditionTests.test_waitforc              	      s      dg  fdd}t|d}|  tdD ]!}td   d7    W d    n1 s:w   Y  q|  t	d d S )Nr   c                     st    . t  }  jfdddd}t  |  } | | d d  W d    d S 1 s3w   Y  d S )Nc                      r   r   r
   r
   r   r
   r   r   i  r   z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>g?rb   )r   re   r   rL   r4   r   )r   rJ   r   r   r   successr
   r   r   f  s   
"z.ConditionTests.test_waitfor_timeout.<locals>.frK   r   r   )
r   r   r#   r   r   r	   r   r%   rT   r!   r   r
   r   r   test_waitfor_timeoutb  s   


z#ConditionTests.test_waitfor_timeoutN)r(   r)   r*   r+   r   r   r   r   r   rl   r   r   r
   r
   r
   r   r     s    Jr   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c                 C   s,   | j t| jdd | j t| jtj d d S )N)value)r\   rj   semtypesysmaxsizer"   r
   r
   r   r9     s   z#BaseSemaphoreTests.test_constructorc                 C   sH   |  d}|  |  |  d}|  |  |  |  d S )NrK   rw   )r   r=   rC   r   semr
   r
   r   r     s   

zBaseSemaphoreTests.test_acquirec                 C   r?   r   )r   r=   r   r
   r
   r   r@     rA   z'BaseSemaphoreTests.test_acquire_destroyc                    s  |  d  d}g g g d  fdd}t|d}|  tt dk r=t  tt dk s0|  dgd  d tdD ]}  qNtt dk rlt  tt dk s_| t	 dgd dgd   d	 tdD ]}  qtt d
k rt  tt d
k s| t	 dgd dgd  d	gd   | 
d   |  | dgd  d S )N   
   r   c                      s4               d S r   rH   r
   r   r   r   r   Zsem_resultsr
   r   r     s   
z4BaseSemaphoreTests.test_acquire_contended.<locals>.f   rK      rw      FT   )r   r=   r   r#   r!   r   rT   r   rC   sortedrL   r%   )r   rV   r   rW   r   r
   r   r   rX     s@   


$
.z)BaseSemaphoreTests.test_acquire_contendedc                    st  |  d  g g d  fdd}t|d}|  tt dk r8t  tt dk s+|  dgd  d d tt dk rat  tt dk sT| t dgd dgd   d	 d tt d
k rt  tt d
k s| t dgd dgd  d	gd   | 	d   |
  d S )Nr   r   c                      s(             d S r   rt   r
   r   r   r   r   r
   r   r     rv   z/BaseSemaphoreTests.test_multirelease.<locals>.fr   r   rK   r   rw   r   F)r   r=   r   r#   r!   r   rT   rC   r   rL   r%   r{   r
   r   r   test_multirelease  s6   


$
.z$BaseSemaphoreTests.test_multireleasec                 C   sV   |  d}| |d | |d | |d |  | |d d S )Nrw   F)r   rF   r=   rL   rC   r   r
   r
   r   rG     s   
z#BaseSemaphoreTests.test_try_acquirec                    sV   |  d  g   fdd}t|d  | t dgd dgd   d S )	Nr   c                      s$     d   d d S rE   rH   r
   ri   r   r
   r   r     s   z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.frO   Fr   Tr   )r   r=   r   r%   rT   r   rM   r
   r   r   rN     s   
$z-BaseSemaphoreTests.test_try_acquire_contendedc                 C   s   |  d}| jt|jddd | |jdd | |jdd | |jdd |  | |jdd t }| |jdd t | }| 	|d d S )Nrw   F      ?rb   g{Gzt?rd   )
r   r\   rj   r=   rF   rL   rC   r   re   r4   )r   r   tr   r
   r
   r   test_acquire_timeout  s   
z'BaseSemaphoreTests.test_acquire_timeoutc                    sT   |        fdd}t|d}|  t  | |j    |  d S )Nc                      rP   r   rQ   r
   r   r
   r   r     rS   z0BaseSemaphoreTests.test_default_value.<locals>.frK   )	r   r=   r   r#   r   rL   r   rC   r%   r{   r
   r   r   test_default_value  s   
z%BaseSemaphoreTests.test_default_valuec                    sb     dd fdd	}|   d    t|t  d   d S )Nrw   c              	      s   ;   d     d | r| W d    n1 s(w   Y  W d    d S W d    d S 1 s@w   Y  d S rE   )rF   r=   rC   rL   rY   r   r
   r   r[   	  s   "z+BaseSemaphoreTests.test_with.<locals>._withFr   )r   rF   r=   rC   r\   r]   )r   r[   r
   r   r   r^     s   
zBaseSemaphoreTests.test_withN)r(   r)   r*   r+   r9   r   r@   rX   r   rG   rN   r   r   r^   r
   r
   r
   r   r   z  s    
% r   c                   @      e Zd ZdZdd ZdS )SemaphoreTestsz)
    Tests for unbounded semaphores.
    c                 C   s.   |  d}|  |  |  |  d S NrK   )r   rC   r=   r   r
   r
   r   r     s
   
z&SemaphoreTests.test_release_unacquiredNr(   r)   r*   r+   r   r
   r
   r
   r   r         r   c                   @   r   )BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    c                 C   s8   |   }| t|j |  |  | t|j d S r   )r   r\   rj   rC   r=   r   r
   r
   r   r   +  s
   z-BoundedSemaphoreTests.test_release_unacquiredNr   r
   r
   r
   r   r   &  r   r   c                   @   s   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	d"ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )#BarrierTestsz$
    Tests for Barrier objects.
    rO   g       @c                 C   s   | j | j| jd| _d S )Nrb   )barriertyperV   defaultTimeoutbarrierr"   r
   r
   r   r.   ;  r   zBarrierTests.setUpc                 C   s   | j   d S r   )r   abortr"   r
   r
   r   r1   =  r/   zBarrierTests.tearDownc                 C   s"   t || jd }|  |  d S r   )r   rV   r%   r{   r
   r
   r   run_threads@  s   zBarrierTests.run_threadsc                 C   s   | j j}| || j t|D ]4}|d d | t|d ||  | j   |d d | t|d |d |  | j   q| | j jd | 	| j j
 d S )Nr   TrK   )r   partiesrT   rV   r   r   r!   r   	n_waitingrL   broken)r   ri   r   mr   r
   r
   r   	multipassE  s   
zBarrierTests.multipassrK   c                    s&   g g g fdd} | dS )z;
        Test that a barrier is passed in lockstep
        c                      s      d S r   )r   r
   passesri   r   r
   r   r   W  s   z$BarrierTests.test_barrier.<locals>.fNr   )r   r   r   r
   r   r   test_barrierR  s   zBarrierTests.test_barrierc                 C   s
   |  dS )zC
        Test that a barrier works for 10 consecutive runs
        r   )r   r"   r
   r
   r   test_barrier_10[  s   
zBarrierTests.test_barrier_10c                    s:   g   fdd} | t ttj dS )z9
        test the return value from barrier.wait
        c                     s   j  }  |  d S r   )r   r   r   )r   ri   r   r
   r   r   f  s   
z(BarrierTests.test_wait_return.<locals>.fN)r   rT   sumr   rV   rM   r
   r   r   test_wait_returna  s   
zBarrierTests.test_wait_returnc                    s<   g fdd} j|  fdd}| dS )z,
        Test the 'action' callback
        c                      s     d d S r&   )r   r
   )ri   r
   r   actionr  r/   z(BarrierTests.test_action.<locals>.actionc                      s       td d S r   )r   rT   r!   r
   r   ri   r   r
   r   r   u  s   z#BarrierTests.test_action.<locals>.fNr   rV   r   )r   r   r   r
   r   r   test_actionm  s
   zBarrierTests.test_actionc                    sZ   g  g  fdd} | t d tjd  jj dS )zK
        Test that an abort will put the barrier in a broken state
        c                     st   zj  } | jd krtj    d W d S  tjy+   d Y d S  ty9   j   Y d S w Nrw   T)r   r   rV   r   r   r   BrokenBarrierErrorr   r   r   r   r   r
   r   r     s   


z"BarrierTests.test_abort.<locals>.fr   rK   N)r   rT   r!   rV   rF   r   r   rM   r
   r   r   
test_abort{  s   
zBarrierTests.test_abortc                    sd   g  g g  fdd} | t d tjd  tj dS )zL
        Test that a 'reset' on a barrier frees the waiting threads
        c                     s   j  } | jd kr)j jjd k r#td j jjd k sj   nzj    d W n tj	yD   d Y nw j   d d S )Nrw   rK   gMbP?T)
r   r   rV   r   r   r	   resetr   r   r   r   r   r   results3r   r
   r   r     s   



z"BarrierTests.test_reset.<locals>.fr   rK   N)r   rT   r!   rV   rM   r
   r   r   
test_reset  s   
zBarrierTests.test_resetc                    sr   g g g  j  fdd}| td tjd  tj dS )zF
        Test that a barrier can be reset after being broken.
        c                     s   zj  } | jd krtj   d W n tjy)   d Y n ty6   j   Y nw   jd krEj      j   d d S r   )	r   r   rV   r   r   r   r   r   r   r   Zbarrier2r   r   r   r   r
   r   r     s"   




z,BarrierTests.test_abort_and_reset.<locals>.fr   rK   N)r   rV   r   rT   r!   rM   r
   r   r   test_abort_and_reset  s   
z!BarrierTests.test_abort_and_resetc                    s    fdd}  | dS )z$
        Test wait(timeout)
        c                     s:    j  } |  jd krtd  tj j jd d S )Nrw   r   rd   )r   r   rV   r   r	   r\   r   r   r   r"   r
   r   r     s   

z$BarrierTests.test_timeout.<locals>.fNr   rM   r
   r"   r   rl     s   zBarrierTests.test_timeoutc                    s,   j jdd  fdd}| dS )z4
        Test the barrier's default timeout
        g333333?rb   c                     s4      } | jd krtd tj j  d S )Nrw   r   )r   rV   r   r	   r\   r   r   r   r   r   r
   r   r     s   
z,BarrierTests.test_default_timeout.<locals>.fNr   rM   r
   r  r   test_default_timeout  s   z!BarrierTests.test_default_timeoutc                 C   s   |  d}|  |  d S r   )r   r   )r   rW   r
   r
   r   test_single_thread  s   
zBarrierTests.test_single_threadN)rK   )r(   r)   r*   r+   rV   r   r.   r1   r   r   r   r   r   r   r   r   r  rl   r  r  r
   r
   r
   r   r   4  s$    
	"r   ) r+   osrq   r   r   _threadr   r   r   Zunittestrm   testr   Ztest.supportr   Z
skipUnlesshasattrr   r   objectr   ZTestCaser,   r5   rs   r   r   r   r   r   r   r   r
   r
   r
   r   <module>   s:    1 	DC_ 0 