
    /hhPG                     0   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  Sr\R(                  S 5       r\R,                  " \" \S5      S	5       " S
 S\R0                  5      5       r\R,                  " \" \S5      S	5       " S S\5      5       r\R,                  " \" \S5      S	5       " S S\5      5       r\R,                  " \" \S5      S	5       " S S\5      5       r\R,                  " \" \S5      S	5      \R,                  " \" \S5      S5       " S S\5      5       5       r\R,                  " \" \S5      S	5       " S S\5      5       r " S S\5      r\ S:X  a  \RB                  " 5         gg)a  
This test suite exercises some system calls subject to interruption with EINTR,
to check that it is actually handled transparently.
It is intended to be run by the main test suite within a child process, to
ensure there is no background thread running (so that signals are delivered to
the correct thread).
Signals are generated in-process using setitimer(ITIMER_REAL), which allows
sub-second periodicity (contrarily to signal()).
    N)support)	os_helper)socket_helperg{Gz?c              #   |   #    U     U v    SSS5        g!   U R                  5         e = f! , (       d  f       g= f7f)zGContext manager killing the subprocess if a Python exception is raised.N)kill)procs    9/opt/python-3.13.8/usr/lib/python3.13/test/_test_eintr.pykill_on_errorr
   #   s5      
	J 
	IIK 
s    <+	<(+
9<	setitimerzrequires setitimer()c                   R    \ rS rSrSrSrSrSrS rS r	\
S 5       rS rS	 rS
 rSrg)EINTRBaseTest.   zBase class for EINTR tests. g?g?c                 .    U =R                   S-  sl         g N   )signals)selfsignumframes      r	   
sighandlerEINTRBaseTest.sighandler:   s        c                 6   SU l         [        R                  " [        R                  U R                  5      U l        [        R
                  " [        R                  U R                  U R                  5        [        R                  " SS[        R                  S9  g )Nr   iX  T)exitfile)r   signalSIGALRMr   orig_handlerr   ITIMER_REALsignal_delaysignal_periodfaulthandlerdump_traceback_latersys
__stderr__r   s    r	   setUpEINTRBaseTest.setUp=   sf    "MM&..$//J++T->->++	-
 	))'/2~~	?r   c                  P    [         R                  " [         R                  SS5        g Nr   )r   r   r    r   r	   
stop_alarmEINTRBaseTest.stop_alarmH   s    ++Q2r   c                     U R                  5         [        R                  " [        R                  U R                  5        [        R
                  " 5         g N)r,   r   r   r   r"   cancel_dump_traceback_laterr&   s    r	   tearDownEINTRBaseTest.tearDownL   s0    fnnd&7&78002r   c                 Z    [         R                  S4U-   n[        R                  " U40 UD6$ )Nz-c)r$   
executable
subprocessPopen)r   argskwcmd_argss       r	   r5   EINTRBaseTest.subprocessQ   s+    NND)D0/B//r   c                 H    U R                  XR                  [        -
  5        g r/   )assertGreaterEqual
sleep_time	CLOCK_RES)r   elapseds     r	   check_elapsed_time EINTRBaseTest.check_elapsed_timeU   s    9)DEr   )r   r   N)__name__
__module____qualname____firstlineno____doc__r    r!   r=   r   r'   staticmethodr,   r1   r5   r@   __static_attributes__r+   r   r	   r   r   .   sF    ' LM J	? 3 33
0Fr   r   c                       \ rS rSrSrS rS rS r\R                  " \
" \S5      S5      S 5       rS	 rS
 r\R                  " \
" \S5      S5      S 5       rS rS rSrg)OSEINTRTestY   zEINTR tests for the os module. c                 B    SU R                   -  nU R                  U5      $ )Nzimport time; time.sleep(%r))r=   r5   )r   codes     r	   new_sleep_processOSEINTRTest.new_sleep_process]   s    ,t>t$$r   c                     Sn[        U5       Vs/ s H  o0R                  5       PM     nn[        U5       H
  nU" 5         M     U H  nUR                  5         M     g s  snf )N   )rangerN   wait)r   	wait_funcnum_	processesr   s         r	   _test_wait_multipleOSEINTRTest._test_wait_multiplea   sT    7<SzBz!++-z	BsAK  DIIK 	 Cs   Ac                 B    U R                  [        R                  5        g r/   )rX   osrS   r&   s    r	   	test_waitOSEINTRTest.test_waitj   s      )r   wait3zrequires wait3()c                 (    U R                  S 5        g )Nc                  .    [         R                  " S5      $ r*   )r[   r^   r+   r   r	   <lambda>(OSEINTRTest.test_wait3.<locals>.<lambda>o   s    !r   )rX   r&   s    r	   
test_wait3OSEINTRTest.test_wait3m   s      !45r   c                 h    U R                  5       nU" UR                  5        UR                  5         g r/   )rN   pidrS   )r   rT   r   s      r	   _test_wait_singleOSEINTRTest._test_wait_singleq   s%    %%'$((		r   c                 (    U R                  S 5        g )Nc                 0    [         R                  " U S5      $ r*   )r[   waitpidrf   s    r	   ra   *OSEINTRTest.test_waitpid.<locals>.<lambda>x   s    2::c1+=r   rg   r&   s    r	   test_waitpidOSEINTRTest.test_waitpidw   s    =>r   wait4zrequires wait4()c                 (    U R                  S 5        g )Nc                 0    [         R                  " U S5      $ r*   )r[   rq   rl   s    r	   ra   (OSEINTRTest.test_wait4.<locals>.<lambda>|   s    288C+;r   rn   r&   s    r	   
test_wait4OSEINTRTest.test_wait4z   s    ;<r   c                 .   [         R                  " 5       u  pU R                  [         R                  U5        / SQnSR	                  SSSSU-  SU R
                  -  SSS	S
S4
5      nU R                  U[        U5      U/S9n[        U5         [         R                  " U5        U H3  nU R                  U[         R                  " U[        U5      5      5        M5     U R                  UR                  5       S5        S S S 5        g ! , (       d  f       g = f)N)s   hellos   worlds   spam
zimport os, sys, time zwr = int(sys.argv[1])
datas = %rsleep_time = %rzfor data in datas:z$    # let the parent block on read()    time.sleep(sleep_time)z    os.write(wr, data)pass_fdsr   )r[   pipe
addCleanupclosejoinr=   r5   strr
   assertEqualreadlenrS   )r   rdwrdatasrM   r   datas          r	   	test_readOSEINTRTest.test_read~   s    "%
 .yy"#5 / 2($
  tSWt<4 HHRL  rwwr3t9'=> TYY[!,	 !  s   A0D
Dc                    [         R                  " 5       u  pU R                  [         R                  U5        S[        R
                  -  nSR                  SSSSU R                  -  S[        R
                  -  SSS	S
SSSSSSSSSS45      nU R                  U[        U5      U/S9n[        U5         [         R                  " U5        SnU[        U5      :  a7  U[         R                  " U[        U5      US  5      -  nU[        U5      :  a  M7  U R                  UR                  5       S5        S S S 5        g ! , (       d  f       g = f)N   xrx   zimport io, os, sys, timery   zrd = int(sys.argv[1])r{   zdata = b"x" * %sdata_len = len(data)z!# let the parent block on write()time.sleep(sleep_time)zread_data = io.BytesIO()z+while len(read_data.getvalue()) < data_len:z%    chunk = os.read(rd, 2 * data_len)z    read_data.write(chunk)zvalue = read_data.getvalue()zif value != data:z0    raise Exception("read error: %s vs %s bytes"z-                    % (len(value), data_len))r}   r   )r[   r   r   r   r   PIPE_MAX_SIZEr   r=   r5   r   r
   r   write
memoryviewr   rS   )r   r   r   r   rM   r   writtens          r	   
test_writeOSEINTRTest.test_write   s$   "% g+++yy&#/!6!66"/$&93(*>;'
 , tSWt<4 HHRLGCI%288B
4(8(BCC CI%TYY[!, !  s   3AD; D;;
E	r+   N)rB   rC   rD   rE   rF   rN   rX   r\   unittest
skipUnlesshasattrr[   rc   rg   ro   ru   r   r   rH   r+   r   r	   rJ   rJ   Y   s|    *%* W-/AB6 C6? W-/AB= C=-:$-r   rJ   c                      \ rS rSrSr\R                  " \" \S5      S5      S 5       r	S r
\R                  " \" \R                  S5      S5      S	 5       rS
 rS rS r\R                  " \" \R                  S5      S5      S 5       rS r\R$                  " SS5      \R                  " \" \S5      S5      S 5       5       rS r\R,                  " \R0                  S:H  S5      S 5       rS r\R,                  " \R0                  S:H  S5      \R,                  " \R0                  R7                  S5      S5      S 5       5       rSrg) SocketEINTRTest   z#EINTR tests for the socket module. 
socketpairzneeds socketpair()c                 ~   [         R                  " 5       u  p#U R                  UR                  5        / SQnSR	                  SSSS[        UR                  5      -  S[        UR                  5      -  SU-  S	U R                  -  SS
SSSSSSS45      nUR                  5       nU R                  U[        U5      U/S9n[        U5         UR                  5         U H$  nU R                  X" U[        U5      5      5        M&     U R                  UR                  5       S5        S S S 5        g ! , (       d  f       g = f)N)r      y   zrx   import os, socket, sys, timery   fd = int(sys.argv[1])family = %ssock_type = %srz   r{   z)wr = socket.fromfd(fd, family, sock_type)os.close(fd)zwith wr:z    for data in datas:z(        # let the parent block on recv()z        time.sleep(sleep_time)z        wr.sendall(data)r}   r   )socketr   r   r   r   intfamilytyper=   filenor5   r   r
   r   r   rS   )	r   	recv_funcr   r   r   rM   fdr   r   s	            r	   
_test_recvSocketEINTRTest._test_recv   s   ""$! #yy*#C		N*s277|+5 /7$6,&!
 & YY[tSWt<4 HHJ  ySY'?@ TYY[!,	 !  s   
AD..
D<c                 V    U R                  [        R                  R                  5        g r/   )r   r   recvr&   s    r	   	test_recvSocketEINTRTest.test_recv       **+r   recvmsgzneeds recvmsg()c                 (    U R                  S 5        g )Nc                 *    U R                  U5      S   $ r*   )r   sockr   s     r	   ra   .SocketEINTRTest.test_recvmsg.<locals>.<lambda>   s    4<<+=a+@r   )r   r&   s    r	   test_recvmsgSocketEINTRTest.test_recvmsg   s    @Ar   c                    [         R                  " 5       u  p#U R                  UR                  5        S[        R
                  S-  -  nSR                  SSSS[        UR                  5      -  S[        UR                  5      -  S	U R                  -  S
[        R
                  S-  -  SSSSSSSSSSSSSSSSS45      nUR                  5       nU R                  U[        U5      U/S9n[        U5         UR                  5         SnU[        U5      :  a8  U" U[!        U5      US  5      n	Xc  [        U5      OU	-  nU[        U5      :  a  M8  U R#                  UR%                  5       S5        S S S 5        g ! , (       d  f       g = f)Ns   xyzrQ   rx   r   ry   r   r   r   r{   zdata = b"xyz" * %sr   z)rd = socket.fromfd(fd, family, sock_type)r   zwith rd:z$    # let the parent block on send()r|   z'    received_data = bytearray(data_len)z	    n = 0z    while n < data_len:z8        n += rd.recv_into(memoryview(received_data)[n:])zif received_data != data:z0    raise Exception("recv error: %s vs %s bytes"z5                    % (len(received_data), data_len))r}   r   )r   r   r   r   r   SOCK_MAX_SIZEr   r   r   r   r=   r   r5   r   r
   r   r   r   rS   )
r   	send_funcr   r   r   rM   r   r   r   sents
             r	   
_test_sendSocketEINTRTest._test_send   sl   ""$! ..!34yy*#C		N*s277|+/ G$9$9Q$>?"72(5%F'>C1
 6 YY[tSWt<4 HHJGCI% Z%5gh%?@3t9$> CI% TYY[!, !  s   5AE8 E88
Fc                 V    U R                  [        R                  R                  5        g r/   )r   r   sendr&   s    r	   	test_sendSocketEINTRTest.test_send  r   r   c                 V    U R                  [        R                  R                  5        g r/   )r   r   sendallr&   s    r	   test_sendallSocketEINTRTest.test_sendall"  s    --.r   sendmsgzneeds sendmsg()c                 (    U R                  S 5        g )Nc                 &    U R                  U/5      $ r/   )r   r   s     r	   ra   .SocketEINTRTest.test_sendmsg.<locals>.<lambda>'  s    4<<+?r   )r   r&   s    r	   test_sendmsgSocketEINTRTest.test_sendmsg%  s    ?@r   c                    [         R                  " [        R                  S45      nU R	                  UR
                  5        UR                  5       S   nSR                  SSS[        R                  -  SU-  SU R                  -  SS	S
SS4
5      nU R                  U5      n[        U5         UR                  5       u  pVUR                  5         U R                  UR                  5       S5        S S S 5        g ! , (       d  f       g = f)Nr   r   rx   zimport socket, timery   z	host = %rz	port = %sr{   z# let parent block on accept()r   z,with socket.create_connection((host, port)):r|   )r   create_serverr   HOSTr   r   getsocknamer   r=   r5   r
   acceptr   rS   )r   r   portrM   r   client_sockrV   s          r	   test_acceptSocketEINTRTest.test_accept)  s    ##]%7%7$;<

#!!$yy!-,,,$/,$:(
  t$4 ![[]NKTYY[!, !  s   -AC99
D
   rQ   mkfifozneeds mkfifo()c                 $   [         R                  n[         R                  " U5         [        R                  " U5        U R                  [         R                  U5        SR                  SSSU-  SU R                  -  SSSSU4	5      nU R                  U5      n[        U5         U" U5        U R                  UR                  5       S	5        S S S 5        g ! [
         a  nU R                  SU-  5         S nANS nAff = f! , (       d  f       g = f)
Nzos.mkfifo(): %srx   import os, timery   z	path = %ar{   z# let the parent blockr   r   )r   TESTFNunlinkr[   r   PermissionErrorskipTestr   r   r=   r5   r
   r   rS   )r   do_open_close_readerdo_open_close_writerfilenameerM   r   s          r	   
_test_openSocketEINTRTest._test_openE  s     ## 	"	1IIh 		(((3yy("/$$ 

 
 t$4  *TYY[!, ! #  	1MM+a/00	1" ! s#   C $)D
C> C99C>
Dc                 <    [        US5      nUR                  5         g )Nw)openr   )r   pathfps      r	   python_openSocketEINTRTest.python_opend  s    $_

r   darwinz+hangs under macOS; see bpo-25234, bpo-35363c                 <    U R                  SU R                  5        g )Nzfp = open(path, 'r')
fp.close())r   r   r&   s    r	   	test_openSocketEINTRTest.test_openh  s     	:((	*r   c                 z    [         R                  " U[         R                  5      n[         R                  " U5        g r/   )r[   r   O_WRONLYr   )r   r   r   s      r	   os_openSocketEINTRTest.os_openn  s!    WWT2;;'
r   netbsdzhangs on NetBSD; see gh-137397c                 <    U R                  SU R                  5        g )Nz,fd = os.open(path, os.O_RDONLY)
os.close(fd))r   r   r&   s    r	   test_os_openSocketEINTRTest.test_os_openr  s    
 	G	&r   r+   N)rB   rC   rD   rE   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionr[   r   r   skipIfr$   platformr   r   
startswithr   rH   r+   r   r	   r   r      sp   .68LM!- N!-F, 	:<MNB OB,-\,/ 	:<MNA OA-8 %%b!,X.0@A- B --: __S\\X-BD*D* __S\\X-BD__S\\,,X657&7D&r   r   c                       \ rS rSrSrS rSrg)TimeEINTRTesti{  z!EINTR tests for the time module. c                     [         R                  " 5       n[         R                  " U R                  5        U R	                  5         [         R                  " 5       U-
  nU R                  U5        g r/   )time	monotonicsleepr=   r,   r@   r   t0dts      r	   
test_sleepTimeEINTRTest.test_sleep  sG    ^^

4??#^^"#r   r+   N)rB   rC   rD   rE   rF   r  rH   r+   r   r	   r   r   {  s
    ,$r   r   pthread_sigmaskzneed signal.pthread_sigmask()c                       \ rS rSrSrS r\R                  " \" \	S5      S5      S 5       r
\R                  " \" \	S5      S5      S 5       rS	rg
)SignalEINTRTesti  z#EINTR tests for the signal module. c                    [         R                  n[        R                  " 5       n[         R                   " US 5      nU R	                  [         R                   X$5        SR                  SS[        R                  " 5       -  S[        U5      -  SU R                  -  SS45      n[         R                  " [         R                  U/5      nU R	                  [         R                  [         R                  U/5        U R                  U5      n[        U5         U" U5        S S S 5        U R                  UR                  5       S	5        g ! , (       d  f       N/= f)
Nc                      g r/   r+   )r7   s    r	   ra   /SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    $r   rx   r   zpid = %szsignum = %sr{   r   zos.kill(pid, signum)r   )r   SIGUSR1r[   getpidr   r   r   r=   r	  	SIG_BLOCKSIG_UNBLOCKr5   r
   r   rS   )r   rT   r   rf   old_handlerrM   old_maskr   s           r	   check_sigwaitSignalEINTRTest.check_sigwait  s    iikmmF,>?v;yy$CK'/$"
  ))&*:*:VHE..0B0BVHMt$4 f ! 	a( ! s   	E
Esigwaitinfozneed signal.sigwaitinfo()c                 ,    S nU R                  U5        g )Nc                 2    [         R                  " U /5        g r/   )r   r  r   s    r	   rT   3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(r   r  r   rT   s     r	   test_sigwaitinfo SignalEINTRTest.test_sigwaitinfo  s    	) 	9%r   sigtimedwaitc                 ,    S nU R                  U5        g )Nc                 4    [         R                  " U /S5        g )Ng      ^@)r   r   r  s    r	   rT   4SignalEINTRTest.test_sigtimedwait.<locals>.wait_func  s    %0r   r  r  s     r	   test_sigtimedwait!SignalEINTRTest.test_sigtimedwait  s    	1 	9%r   r+   N)rB   rC   rD   rE   rF   r  r   r   r   r   r  r$  rH   r+   r   r	   r  r    sb     /)2 746&6& 846&6&r   r  c                   d   \ rS rSrSrS r\R                  " \R                  S:H  S5      \R                  " \" \S5      S5      S 5       5       r\R                  " \" \S	5      S
5      S 5       r\R                  " \" \S5      S5      S 5       r\R                  " \" \S5      S5      S 5       rSrg)SelectEINTRTesti  z#EINTR tests for the select module. c                     [         R                  " 5       n[        R                  " / / / U R                  5        [         R                  " 5       U-
  nU R	                  5         U R                  U5        g r/   )r  r  selectr=   r,   r@   r  s      r	   test_selectSelectEINTRTest.test_select  sM    ^^b"b$//2^^"#r   r   z(poll may fail on macOS; see issue #28087pollzneed select.pollc                    [         R                  " 5       n[        R                  " 5       nUR                  U R                  S-  5        [        R                  " 5       U-
  nU R                  5         U R                  U5        g Ng     @@)r)  r,  r  r  r=   r,   r@   r   pollerr  r  s       r	   	test_pollSelectEINTRTest.test_poll  sY     ^^DOOc)*^^"#r   epollzneed select.epollc                 6   [         R                  " 5       nU R                  UR                  5        [        R
                  " 5       nUR                  U R                  5        [        R
                  " 5       U-
  nU R                  5         U R                  U5        g r/   )
r)  r3  r   r   r  r  r,  r=   r,   r@   r/  s       r	   
test_epollSelectEINTRTest.test_epoll  sb    %^^DOO$^^"#r   kqueuezneed select.kqueuec                 :   [         R                  " 5       nU R                  UR                  5        [        R
                  " 5       nUR                  S SU R                  5        [        R
                  " 5       U-
  nU R                  5         U R                  U5        g r   )
r)  r7  r   r   r  r  controlr=   r,   r@   )r   r7  r  r  s       r	   test_kqueueSelectEINTRTest.test_kqueue  sf    %^^tQ0^^"#r   devpollzneed select.devpollc                 <   [         R                  " 5       nU R                  UR                  5        [        R
                  " 5       nUR                  U R                  S-  5        [        R
                  " 5       U-
  nU R                  5         U R                  U5        g r.  )
r)  r<  r   r   r  r  r,  r=   r,   r@   r/  s       r	   test_devpollSelectEINTRTest.test_devpoll  sh    !%^^DOOc)*^^"#r   r+   N)rB   rC   rD   rE   rF   r*  r   r   r$   r   r   r   r)  r1  r5  r:  r>  rH   r+   r   r	   r'  r'    s    .$ __S\\X-?A02DE$ FA$ 13FG$ H$ 24HI$ J$ 35JK$ L$r   r'  c                   v    \ rS rSrS r\R                  " \R                  " 5       S:H  S5      S 5       r	S r
Srg)	FCNTLEINTRTesti  c                    U R                  [        R                  [        R                  5        [        R
                  " 5       u  p4[        R
                  " 5       u  pVX4XV4 H#  nU R                  [        R                  U5        M%     [        R                  " S[        R                   SU SU SU SU R                   S35      nU R                  XU/S9n	[        U	5         [        [        R                  S5       n
[        R                  " US	5      nU R                  US
5        [        R                   " 5       n[        R"                  " US5        U" U
[$        R&                  5        [        R                   " 5       U-
  nU R)                  5         U R+                  U5        S S S 5        U	R-                  5         S S S 5        g ! , (       d  f       N'= f! , (       d  f       g = f)Nz;
            import fcntl, os, time
            with open('z%', 'wb') as f:
                fcntl.z,(f, fcntl.LOCK_EX)
                os.write(z%, b"ok")
                _ = os.read(z;, 2)  # wait for parent process
                time.sleep(z
)
        r}   wb   s   oks   go)r   r   r   r   r[   r   r   textwrapdedentr=   r5   r
   r   r   r   r  r  r   fcntlLOCK_EXr,   r@   rS   )r   	lock_func	lock_namerd1wr1rd2wr2r   rM   r   fok
start_timer  s                 r	   _lockFCNTLEINTRTest._lock  sy   	(()*:*:;779779S&BOOBHHb) ' $!(() * k "  E " OO, -	   tCj94 i&&-WWS!_  U+ "^^-
e$
 !U]]+^^%
2!''+ .  IIK# ! -- ! s%   "G=B&G#G
G	G
G#AIXzAIX returns PermissionErrorc                 D    U R                  [        R                  S5        g )Nlockf)rR  rG  rV  r&   s    r	   
test_lockfFCNTLEINTRTest.test_lockf  s    

5;;(r   c                 D    U R                  [        R                  S5        g )Nflock)rR  rG  rZ  r&   s    r	   
test_flockFCNTLEINTRTest.test_flock  s    

5;;(r   r+   N)rB   rC   rD   rE   rR  r   r   r   systemrW  r[  rH   r+   r   r	   rA  rA    s:     H __X__&%/1NO) P))r   rA  __main__)"rF   
contextlibr"   rG  r[   r   r)  r   r   r5   r$   rE  r  r   testr   test.supportr   r   r>   contextmanagerr
   r   r   TestCaser   rJ   r   r   r  r'  rA  rB   mainr+   r   r	   <module>re     s      	      
     " &
 	   
WV[13IJ'FH%% 'F K'FT 
WV[13IJe-- e- Ke-P 
WV[13IJu&m u& Ku&p 
WV[13IJ$M $ K$ 
WV[13IJ 
WV%6746*&m *&6 K
*&Z 
WV[13IJ5$m 5$ K5$p*)] *)Z zMMO r   