
    z%i(                     $   d Z ddlZddlZddlZddlZddlmZ ddlZddl	Z	ej                  dd dk(  r ej                  dej                  z         ej                         Z ej                         Zej                   j"                  dk(  xr ej                   j$                  dk(  Zd	 Zd
 Zd Z ej.                          ej0                   eed      d       G d dej4                                      Zd Zedk(  r ej<                          yy)z6PyUnit testing that threads honor our signal semantics    N)threading_helper   winzCan't test signal on %spthreadz
mutex+condc                     t        j                   t         j                  |       }t        j                   t         j                  |      }t        j                   t         j                  |      }|||fS N)signalSIGUSR1SIGUSR2SIGALRM)for_usr1for_usr2for_alrmusr1usr2alrms         K/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_threadsignals.pyregisterSignalsr      sK    ==2D==2D==2Dt    c                 h    t         |    dxx   dz  cc<   t        j                         t         |    d<   y )Ntripped   
tripped_by)signal_blackboardthread	get_ident)sigframes     r   handle_signalsr      s0    c9%*%+1+;+;+=c<(r   c                      t        j                  t        t        j                         t        j                  t        t        j
                         t        j                          y r   )oskillprocess_pidr	   r
   r   signalled_allrelease r   r   send_signalsr'   "   s2    GGK(GGK(r   alarmztest requires signal.alarmc                   v   e Zd Zd Zd Zd Z ej                  ed       ej                  e	j                  j                  d      xr e	j                  j                   d       ej                  e	j                  j                  d      d      d	                      Z ej                  ed       ej                  e	j                  j                  d      xr e	j                  j                   d       ej                  e	j                  j                  d      d      d
                      Zd Zd Zd Zd Zy)ThreadSignalsc                    t        j                         5  t        j                          | j	                          t        j                          d d d        t
        t        j                     d   dk(  st
        t        j                     d   dk(  r?	 t        j                  d       t        j                          t        j                  d       | j                  t
        t        j                     d   d       | j                  t
        t        j                     d   t        j                                | j                  t
        t        j                     d   d       | j                  t
        t        j                     d   t        j                                t        j                          y # 1 sw Y   dxY w# t        j                  d       w xY w)Nr   r   r   r   )r   wait_threads_exitr$   acquirespawnSignallingThreadr   r	   r
   r   r(   pauseassertEqualr   r   r%   selfs    r   test_signalszThreadSignals.test_signals,   sI   //1 	$
 !!#&&(!!#	$ V^^,Y71</	:a? QQ+FNN;IFJ+FNN;LI!++-	/+FNN;IFJ+FNN;LI!++-	/;	$ 	$* Qs   9F0)F= 0F:=Gc                 8    t        j                  t        d       y )Nr&   )r   start_new_threadr'   r1   s    r   r.   z#ThreadSignals.spawnSignallingThreadL   s    b1r   c                     t         r   )KeyboardInterrupt)r2   r   r   s      r   alarm_interruptzThreadSignals.alarm_interruptO   s    r   z/POSIX condition variables cannot be interruptedlinuxzBIssue 34004: musl does not allow interruption of locks by signals.openbsdz%lock cannot be interrupted on OpenBSDc                    t        j                   t         j                  | j                        }	 t        j                         }|j                          t        j                  d       t        j                         }| j                  t        |j
                  d       t        j                         |z
  }| j                  |d       t        j                  d       t        j                   t         j                  |       y # t        j                  d       t        j                   t         j                  |       w xY w)Nr      timeout      @r   )r	   r   r8   r   allocate_lockr-   r(   time	monotonicassertRaisesr7   
assertLess)r2   oldalrmlockt1dts        r   test_lock_acquire_interruptionz,ThreadSignals.test_lock_acquire_interruptionR   s     --0D0DE	3'')DLLNLLO!B/qI!B&B
 OOB$LLOMM&..'2 LLOMM&..'2s   BD ;D=c                 ~   t        j                   t         j                  | j                        }	 t        j                         fd}t        j                         5  t        j                  |d       j                  d      r8j                          t        j                  d       j                  d      r8t        j                  d       t        j                         }| j                  t        j                  d       t        j                         |z
  }| j!                  |d	       d d d        t        j                  d
       t        j                   t         j                  |       y # 1 sw Y   CxY w# t        j                  d
       t        j                   t         j                  |       w xY w)Nc                  &     j                          y r   )r-   )rlocks   r   other_threadzCThreadSignals.test_rlock_acquire_interruption.<locals>.other_thread   s    r   r&   Fblocking{Gz?r   r<   r=   r?   r   )r	   r   r8   r   RLockr   r,   r5   r-   r%   rA   sleepr(   rB   rC   r7   rD   )r2   rE   rM   rG   rH   rL   s        @r   test_rlock_acquire_interruptionz-ThreadSignals.test_rlock_acquire_interruptionq   s+    --0D0DE	3LLNE  "335 )''b9mmUm3MMOJJt$ mmUm3 Q^^%!!"3U]]A!N^^%*C() LLOMM&..'2) ) LLOMM&..'2s+   -F A E5?A4E53F 5E>:F ;F<c                     d _          fd}t        j                  t        j                  |      }	 fd}t        j                         5  t        j                  |d       j                  d      r8j                          t        j                  d       j                  d      r8j                         } j                   j                           j                  |       d d d        t        j                  t        j                  |       y # 1 sw Y   .xY w# t        j                  t        j                  |       w xY w)NFc                     d_         y )NT)	sig_recvd)r	   r   r2   s     r   
my_handlerz9ThreadSignals.acquire_retries_on_intr.<locals>.my_handler   s
    !DNr   c                       j                          t        j                  d       t        j                  t
        t        j                         t        j                  d        j                          y )N      ?)	r-   rA   rR   r!   r"   r#   r	   r
   r%   )rF   s   r   rM   z;ThreadSignals.acquire_retries_on_intr.<locals>.other_thread   sC      

3V^^4 

3r   r&   rN   rP   )rV   r	   r
   r   r,   r   r5   r-   r%   rA   rR   
assertTrue)r2   rF   rW   old_handlerrM   results   ``    r   acquire_retries_on_intrz%ThreadSignals.acquire_retries_on_intr   s    	" mmFNNJ?	7 "335 (''b9llEl2LLNJJt$ llEl2 /'( MM&..+6( ( MM&..+6s*   D# A D.<D*D# D D# #&E	c                 J    | j                  t        j                                y r   )r]   r   r@   r1   s    r   !test_lock_acquire_retries_on_intrz/ThreadSignals.test_lock_acquire_retries_on_intr   s    $$V%9%9%;<r   c                 J    | j                  t        j                                y r   )r]   r   rQ   r1   s    r   "test_rlock_acquire_retries_on_intrz0ThreadSignals.test_rlock_acquire_retries_on_intr   s    $$V\\^4r   c                 P    d  _         d  _        d _        t        j                         j                          t        j                         j                           fd}t        j                  t        j                  |      }	  fd}fd}t        j                         5  t        j                  |d        |        j                           j                   j                   j                   z
  d        j                   j                   j                   z
  d        j                   j                  d       d d d        t        j                  t        j                  |       y # 1 sw Y   .xY w# t        j                  t        j                  |       w xY w)Nr   c                 0    xj                   dz  c_         y )Nr   )
sigs_recvd)signumr   r2   s     r   rW   z@ThreadSignals.test_interrupted_timed_acquire.<locals>.my_handler   s    OOq Or   c                      t        j                         _         j                  d       t        j                         _        y )NrY   r=   )rA   rB   startr-   end)rF   r2   s   r   timed_acquirezCThreadSignals.test_interrupted_timed_acquire.<locals>.timed_acquire   s-    !^^-
S)>>+r   c                      t        d      D ]?  } t        j                  d       t        j                  t
        t        j                         A j                          y )N(   g{Gz?)	rangerA   rR   r!   r"   r#   r	   r
   r%   )_dones    r   r'   zBThreadSignals.test_interrupted_timed_acquire.<locals>.send_signals   s?    r 9AJJt$GGK89 r   r&   g       @g333333?)rg   rh   rd   r   r@   r-   r	   r
   r   r,   r5   rD   assertGreater)r2   rW   r[   ri   r'   rn   rF   s   `    @@r   test_interrupted_timed_acquirez,ThreadSignals.test_interrupted_timed_acquire   s*    
##%##%	!mmFNNJ?	7, "335 7 ''b94:: 5s;""488djj#8#> ""4??A67 MM&..+67 7 MM&..+6s%   E? *BE3E? 3E<8E? ?&F%N)__name__
__module____qualname__r3   r.   r8   unittestskipIfUSING_PTHREAD_CONDsysplatform
startswiththread_infoversionrI   rS   r]   r_   ra   rp   r&   r   r   r*   r*   (   sC    @2  X__'FHX__S\\,,W5 1000#$
 X__S\\,,Y7<>3>$H3, X__'FHX__S\\,,W5 1000#$
 X__S\\,,Y7<>3>$H3:7@=5,7r   r*   c                      t         j                  dddt         j                  dddt         j                  dddiat        t        t        t              } t        j                  t
        g|   y )Nr   )r   r   )	r	   r
   r   r   r   r   r   rt   addModuleCleanup)oldsigss    r   setUpModuler      sZ     !..q+K ..q+K ..q+KN nnnMGo88r   __main__)__doc__rt   r	   r!   rw   test.supportr   _threadr   rA   rx   SkipTestgetpidr#   r@   r$   rz   namerF   rv   r   r   r'   requires_working_threading
skipUnlesshasattrTestCaser*   r   rq   mainr&   r   r   <module>r      s   <   	 
 )  LL!
(

5D
EEbiik"f""$oo**i7 ?//..,> >
 -,,.WVW-/KL7H%% 7 M /7D9 zHMMO r   