a
    äze:(  ã                   @   sÌ   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  
dej	 ¡‚e ¡ Ze ¡ Zejjdko„ejjdkZdd	„ Zd
d„ Zdd„ ZG dd„ de jƒZdd„ ZedkrÈe  ¡  dS )é    N)Úsupporté   ÚwinzCan't test signal on %sZpthreadz
mutex+condc                 C   s4   t   t j| ¡}t   t j|¡}t   t j|¡}|||fS ©N)ÚsignalÚSIGUSR1ÚSIGUSR2ÚSIGALRM)Zfor_usr1Zfor_usr2Zfor_alrmZusr1Zusr2Zalrm© r
   ú-/usr/lib/python3.9/test/test_threadsignals.pyÚregisterSignals   s    r   c                 C   s(   t |  d  d7  < t ¡ t |  d< d S )NÚtrippedé   Ú
tripped_by)Úsignal_blackboardÚthreadÚ	get_ident)ÚsigÚframer
   r
   r   Úhandle_signals   s    r   c                   C   s(   t  ttj¡ t  ttj¡ t ¡  d S r   )ÚosÚkillÚprocess_pidr   r   r   Úsignalled_allÚreleaser
   r
   r
   r   Úsend_signals"   s    r   c                   @   sÐ   e Zd Zdd„ Zdd„ Zdd„ Ze ed¡e e	j
 d¡oBe	jj d	¡e e	j
 d
¡d¡dd„ ƒƒƒZe ed¡e e	j
 d¡oˆe	jj d	¡e e	j
 d
¡d¡dd„ ƒƒƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚThreadSignalsc              	   C   sþ   t  ¡ ( t ¡  |  ¡  t ¡  W d   ƒ n1 s60    Y  ttj d dksdttj d dkr’z t 	d¡ t 
¡  W t 	d¡ nt 	d¡ 0 |  ttj d d¡ |  ttj d t ¡ ¡ |  ttj d d¡ |  ttj d t ¡ ¡ t ¡  d S )Nr   r   r   r   )r   Úwait_threads_exitr   ÚacquireÚspawnSignallingThreadr   r   r   r   ÚalarmÚpauseZassertEqualr   r   r   ©Úselfr
   r
   r   Útest_signals)   s(    
&ÿ

ÿÿzThreadSignals.test_signalsc                 C   s   t  td¡ d S )Nr
   )r   Ústart_new_threadr   r"   r
   r
   r   r   I   s    z#ThreadSignals.spawnSignallingThreadc                 C   s   t ‚d S r   )ÚKeyboardInterrupt)r#   r   r   r
   r
   r   Úalarm_interruptL   s    zThreadSignals.alarm_interruptz/POSIX condition variables cannot be interruptedÚlinuxzBIssue 34004: musl does not allow interruption of locks by signals.Zopenbsdz%lock cannot be interrupted on OpenBSDc              
   C   s˜   t   t j| j¡}zht ¡ }| ¡  t  d¡ t ¡ }| j	t
|jdd t ¡ | }|  |d¡ W t  d¡ t   t j|¡ nt  d¡ t   t j|¡ 0 d S )Nr   é   ©Útimeoutç      @r   )r   r	   r'   r   Úallocate_lockr   r    ÚtimeÚ	monotonicÚassertRaisesr&   Ú
assertLess)r#   ÚoldalrmÚlockÚt1Údtr
   r
   r   Útest_lock_acquire_interruptionO   s    

ÿ
z,ThreadSignals.test_lock_acquire_interruptionc              
      sð   t   t j| j¡}zÀt ¡ ‰ ‡ fdd„}t ¡ x t |d¡ ˆ jddr\ˆ  	¡  t
 d¡ q<t  d¡ t
 ¡ }| jtˆ jdd	 t
 ¡ | }|  |d
¡ W d   ƒ n1 s¬0    Y  W t  d¡ t   t j|¡ nt  d¡ t   t j|¡ 0 d S )Nc                      s   ˆ   ¡  d S r   )r   r
   ©Zrlockr
   r   Úother_thread   s    zCThreadSignals.test_rlock_acquire_interruption.<locals>.other_threadr
   F©Úblockingç{®Gáz„?r   r)   r*   r,   r   )r   r	   r'   r   ÚRLockr   r   r%   r   r   r.   Úsleepr    r/   r0   r&   r1   )r#   r2   r8   r4   r5   r
   r7   r   Útest_rlock_acquire_interruptionn   s$    

,
ÿ
z-ThreadSignals.test_rlock_acquire_interruptionc              
      sÆ   dˆ_ ‡fdd„}t tj|¡}z‡ fdd„}t ¡ Z t |d¡ ˆ jddrdˆ  ¡  t	 
d¡ qDˆ  ¡ }ˆ ˆj ¡ ˆ |¡ W d   ƒ n1 s–0    Y  W t tj|¡ nt tj|¡ 0 d S )	NFc                    s
   dˆ _ d S )NT)Ú	sig_recvd)r   r   r"   r
   r   Ú
my_handler–   s    z9ThreadSignals.acquire_retries_on_intr.<locals>.my_handlerc                      s6   ˆ   ¡  t d¡ t ttj¡ t d¡ ˆ  ¡  d S )Nç      à?)	r   r.   r=   r   r   r   r   r   r   r
   )r3   r
   r   r8   ›   s
    

z;ThreadSignals.acquire_retries_on_intr.<locals>.other_threadr
   r9   r;   )r?   r   r   r   r   r   r%   r   r   r.   r=   Z
assertTrue)r#   r3   r@   Úold_handlerr8   Úresultr
   ©r3   r#   r   Úacquire_retries_on_intr”   s    
*z%ThreadSignals.acquire_retries_on_intrc                 C   s   |   t ¡ ¡ d S r   )rE   r   r-   r"   r
   r
   r   Ú!test_lock_acquire_retries_on_intr´   s    z/ThreadSignals.test_lock_acquire_retries_on_intrc                 C   s   |   t ¡ ¡ d S r   )rE   r   r<   r"   r
   r
   r   Ú"test_rlock_acquire_retries_on_intr·   s    z0ThreadSignals.test_rlock_acquire_retries_on_intrc              
      s  d ˆ_ d ˆ_dˆ_t ¡ ‰ ˆ  ¡  t ¡ ‰ˆ ¡  ‡fdd„}t tj|¡}z¤‡‡fdd„}‡ fdd„}t 	¡ ` t 
|d¡ |ƒ  ˆ  ¡  ˆ ˆjˆj  d	¡ ˆ ˆjˆj  d
¡ ˆ ˆjd¡ W d   ƒ n1 sÖ0    Y  W t tj|¡ nt tj|¡ 0 d S )Nr   c                    s   ˆ  j d7  _ d S )Nr   )Ú
sigs_recvd)Úsignumr   r"   r
   r   r@   É   s    z@ThreadSignals.test_interrupted_timed_acquire.<locals>.my_handlerc                      s$   t  ¡ ˆ_ˆ jdd t  ¡ ˆ_d S )NrA   r*   )r.   r/   Ústartr   Úendr
   rD   r
   r   Útimed_acquireÍ   s    
zCThreadSignals.test_interrupted_timed_acquire.<locals>.timed_acquirec                     s2   t dƒD ]} t d¡ t ttj¡ qˆ  ¡  d S )Né(   g{®Gáz”?)	Úranger.   r=   r   r   r   r   r   r   )Ú_)Údoner
   r   r   Ñ   s    
zBThreadSignals.test_interrupted_timed_acquire.<locals>.send_signalsr
   g       @g333333Ó?)rJ   rK   rH   r   r-   r   r   r   r   r   r%   r1   ZassertGreater)r#   r@   rB   rL   r   r
   )rP   r3   r#   r   Útest_interrupted_timed_acquireº   s(    
.z,ThreadSignals.test_interrupted_timed_acquireN)Ú__name__Ú
__module__Ú__qualname__r$   r   r'   ÚunittestZskipIfÚUSING_PTHREAD_CONDÚsysÚplatformÚ
startswithÚthread_infoÚversionr6   r>   rE   rF   rG   rQ   r
   r
   r
   r   r   '   s:    ÿþÿÿþÿ r   c                  C   sJ   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| ¢R Ž  d S )Nr   )r   r   )	r   r   r   r	   r   r   r   rU   ZaddModuleCleanup)Zoldsigsr
   r
   r   ÚsetUpModuleé   s    þr\   Ú__main__)rU   r   r   rW   Útestr   Ú_threadr   r.   rX   ZSkipTestÚgetpidr   r-   r   rZ   Únamer3   rV   r   r   r   ZTestCaser   r\   rR   Úmainr
   r
   r
   r   Ú<module>   s*   
ÿ	 C