a 5êdg^(ã@sÊddlZddlZddlZddlZddlmZddlZddlZej dd…dkr^e  dej ¡‚e  ¡Z e  ¡Zejjdko„ejjdkZdd „Zd d „Zd d „ZGdd„dejƒZdd„ZedkrÆeƒdS)éN)ÚsupportéÚwinzCan't test signal on %sZpthreadz mutex+condcCs4t tj|¡}t tj|¡}t tj|¡}|||fS©N)ÚsignalÚSIGUSR1ÚSIGUSR2ÚSIGALRM)Zfor_usr1Zfor_usr2Zfor_alrmZusr1Zusr2Zalrm©r ú3/usr/local/lib/python3.9/test/test_threadsignals.pyÚregisterSignalssr cCs(t|dd7<t ¡t|d<dS)NÚtrippedéÚ tripped_by)Úsignal_blackboardÚthreadÚ get_ident)ÚsigÚframer r r Úhandle_signalssrcCs(t ttj¡t ttj¡t ¡dSr)ÚosÚkillÚ process_pidrrrÚ signalled_allÚreleaser r r r Ú send_signals"src@sÐeZdZdd„Zdd„Zdd„Ze ed¡e e j   d¡oBe j j d ¡e e j   d ¡d ¡d d „ƒƒƒZe ed¡e e j   d¡oˆe j j d ¡e e j   d ¡d ¡dd„ƒƒƒZdd„Zdd„Zdd„Zdd„ZdS)Ú ThreadSignalsc Csþt ¡(t ¡| ¡t ¡Wdƒn1s60Yttjddksdttjddkr’z t  d¡t  ¡Wt  d¡n t  d¡0|  ttjdd¡|  ttjdt   ¡¡|  ttjdd¡|  ttjdt   ¡¡t ¡dS)Nr rrr)rÚwait_threads_exitrÚacquireÚspawnSignallingThreadrrrrÚalarmÚpauseZ assertEqualrrr©Úselfr r r Ú test_signals)s( &ÿ  ÿÿzThreadSignals.test_signalscCst td¡dS)Nr )rÚstart_new_threadrr"r r r rIsz#ThreadSignals.spawnSignallingThreadcCst‚dSr)ÚKeyboardInterrupt)r#rrr r r Úalarm_interruptLszThreadSignals.alarm_interruptz/POSIX condition variables cannot be interruptedÚlinuxzBIssue 34004: musl does not allow interruption of locks by signals.Zopenbsdz%lock cannot be interrupted on OpenBSDc Cs˜t tj|j¡}zht ¡}| ¡t d¡t ¡}|j t |jddt ¡|}|  |d¡Wt d¡t tj|¡nt d¡t tj|¡0dS)Nré©Útimeoutç@r) rr r'rÚ allocate_lockrr ÚtimeÚ monotonicÚ assertRaisesr&Ú assertLess)r#ÚoldalrmÚlockÚt1Údtr r r Útest_lock_acquire_interruptionOs   ÿ z,ThreadSignals.test_lock_acquire_interruptionc sðt tj|j¡}zÀt ¡‰‡fdd„}t ¡xt |d¡ˆjddr\ˆ  ¡t   d¡q.other_threadr F©Úblockingç{®Gáz„?rr)r*r,r)rr r'rÚRLockrrr%rrr.Úsleepr r/r0r&r1)r#r2r8r4r5r r7r Útest_rlock_acquire_interruptionns$       , ÿ z-ThreadSignals.test_rlock_acquire_interruptionc sÆdˆ_‡fdd„}t tj|¡}z‡fdd„}t ¡Zt |d¡ˆjddrdˆ ¡t   d¡qDˆ ¡}ˆ  ˆj¡ˆ  |¡Wdƒn1s–0YWt tj|¡nt tj|¡0dS) NFcs dˆ_dS)NT)Ú sig_recvd)rrr"r r Ú my_handler–sz9ThreadSignals.acquire_retries_on_intr..my_handlercs6ˆ ¡t d¡t ttj¡t d¡ˆ ¡dS)Nçà?) rr.r=rrrrrrr )r3r r r8›s   z;ThreadSignals.acquire_retries_on_intr..other_threadr r9r;) r?rrrrrr%rrr.r=Z assertTrue)r#r3r@Ú old_handlerr8Úresultr ©r3r#r Úacquire_retries_on_intr”s      *z%ThreadSignals.acquire_retries_on_intrcCs| t ¡¡dSr)rErr-r"r r r Ú!test_lock_acquire_retries_on_intr´sz/ThreadSignals.test_lock_acquire_retries_on_intrcCs| t ¡¡dSr)rErr<r"r r r Ú"test_rlock_acquire_retries_on_intr·sz0ThreadSignals.test_rlock_acquire_retries_on_intrc sdˆ_dˆ_dˆ_t ¡‰ˆ ¡t ¡‰ˆ ¡‡fdd„}t tj|¡}z¤‡‡fdd„}‡fdd„}t  ¡`t  |d¡|ƒˆ ¡ˆ  ˆjˆjd ¡ˆ  ˆjˆjd ¡ˆ  ˆjd¡Wdƒn1sÖ0YWt tj|¡nt tj|¡0dS) Nrcsˆjd7_dS)Nr)Ú sigs_recvd)Úsignumrr"r r r@Ész@ThreadSignals.test_interrupted_timed_acquire..my_handlercs$t ¡ˆ_ˆjddt ¡ˆ_dS)NrAr*)r.r/ÚstartrÚendr rDr r Ú timed_acquireÍs  zCThreadSignals.test_interrupted_timed_acquire..timed_acquirecs2tdƒD]}t d¡t ttj¡qˆ ¡dS)Né(g{®Gáz”?) Úranger.r=rrrrrr)Ú_)Údoner r rÑs  zBThreadSignals.test_interrupted_timed_acquire..send_signalsr g@g333333Ó?) rJrKrHrr-rrrrrr%r1Z assertGreater)r#r@rBrLrr )rPr3r#r Útest_interrupted_timed_acquireºs(    .z,ThreadSignals.test_interrupted_timed_acquireN)Ú__name__Ú __module__Ú __qualname__r$rr'ÚunittestZskipIfÚUSING_PTHREAD_CONDÚsysÚplatformÚ startswithÚ thread_infoÚversionr6r>rErFrGrQr r r r r's: ÿþÿÿþÿ rcCsZtjdddœtjdddœtjdddœiattttƒ}zt t ¡Wt|Žn t|Ž0dS)Nr)r r) rrrr rr rrZ run_unittestr)Zoldsigsr r r Ú test_mainés   þ  r\Ú__main__)rUrrrWÚtestrÚ_threadrr.rXZSkipTestÚgetpidrr-rrZÚnamer3rVr rrZTestCaserr\rRr r r r Ús*   ÿ C