
    daf|'                        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.                          G d dej0                               Zd Zedk(  r ej8                          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         2/root/Python-3.12.4/Lib/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         j                         t        j                  t         j                         t        j                          y r   )r	   raise_signalr
   r   signalled_allrelease r   r   send_signalsr&   "   s4    
 '
'r   c                   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        | 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   xY wr   )r   wait_threads_exitr#   acquirespawnSignallingThreadassertEqualr   r	   r
   r   r   r   r$   selfs    r   test_signalszThreadSignals.test_signals/   s    //1 	$
 !!#&&(!!#	$ 	+FNN;IFJ+FNN;LI!++-	/+FNN;IFJ+FNN;LI!++-	/	$ 	$s   9D77E c                 8    t        j                  t        d       y )Nr%   )r   start_new_threadr&   r.   s    r   r,   z#ThreadSignals.spawnSignallingThreadA   s    b1r   c                     t         r   )KeyboardInterrupt)r/   r   r   s      r   alarm_interruptzThreadSignals.alarm_interruptD   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   r5   r   allocate_lockr+   alarmtime	monotonicassertRaisesr4   
assertLess)r/   oldalrmlockt1dts        r   test_lock_acquire_interruptionz,ThreadSignals.test_lock_acquire_interruptionG   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_thready   s    r   r%   Fblocking{Gz?r   r9   r:   r<   r   )r	   r   r5   r   RLockr   r*   r2   r+   r$   r?   sleepr>   r@   rA   r4   rB   )r/   rC   rK   rE   rF   rJ   s        @r   test_rlock_acquire_interruptionz-ThreadSignals.test_rlock_acquire_interruptionf   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   r/   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+   r?   rP   oskillprocess_pidr	   r
   r$   )rD   s   r   rK   z;ThreadSignals.acquire_retries_on_intr.<locals>.other_thread   sC      

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

3r   r%   rL   rN   )rT   r	   r
   r   r*   r   r2   r+   r$   r?   rP   
assertTrue)r/   rD   rU   old_handlerrK   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=   r.   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   rO   r.   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   r/   s     r   rU   z@ThreadSignals.test_interrupted_timed_acquire.<locals>.my_handler   s    OOq Or   c                      t        j                         _         j                  d       t        j                         _        y )NrW   r:   )r?   r@   startr+   end)rD   r/   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?)	ranger?   rP   rX   rY   rZ   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?)rh   ri   re   r   r=   r+   r	   r
   r   r*   r2   rB   assertGreater)r/   rU   r\   rj   r&   ro   rD   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__r0   r,   r5   unittestskipIfUSING_PTHREAD_CONDsysplatform
startswiththread_infoversionrG   rQ   r^   r`   rb   rq   r%   r   r   r(   r(   ,   sB    $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    ru   addModuleCleanup)oldsigss    r   setUpModuler      sZ     !..q+K ..q+K ..q+KN nnnMGo88r   __main__)__doc__ru   r	   rX   rx   test.supportr   _threadr   r?   ry   SkipTestgetpidrZ   r=   r#   r{   namerD   rw   r   r    r&   requires_working_threadingTestCaser(   r   rr   mainr%   r   r   <module>r      s    <   	 
 )  LL!
(

5D
EEbiik"f""$oo**i7 ?//..,> >
 -,,.q7H%% q7 /q7h9 zHMMO r   