
    /hhPG                     ,   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
\R.                  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  \R@                  " 5         gg)    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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                   N    \ 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.   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 r   )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__r!   r"   r=   r   r(   staticmethodr-   r1   r5   r@   __static_attributes__r,   r   r
   r   r   .   sC    
 LM J	? 3 33
0Fr   r   c                       \ 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   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   )rangerM   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   )rW   osrR   r'   s    r
   	test_waitOSEINTRTest.test_waitj   s      )r   wait3zrequires wait3()c                 (    U R                  S 5        g )Nc                  .    [         R                  " S5      $ r+   )rZ   r]   r,   r   r
   <lambda>(OSEINTRTest.test_wait3.<locals>.<lambda>o   s    !r   )rW   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   )rM   pidrR   )r   rS   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+   )rZ   waitpidre   s    r
   r`   *OSEINTRTest.test_waitpid.<locals>.<lambda>x   s    2::c1+=r   rf   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+   )rZ   rp   rk   s    r
   r`   (OSEINTRTest.test_wait4.<locals>.<lambda>|   s    288C+;r   rm   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   )rZ   pipe
addCleanupclosejoinr=   r5   strr   assertEqualreadlenrR   )r   rdwrdatasrL   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   xrw   zimport io, os, sys, timerx   zrd = int(sys.argv[1])rz   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   )rZ   r~   r   r   r   PIPE_MAX_SIZEr   r=   r5   r   r   r   write
memoryviewr   rR   )r   r   r   r   rL   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   rM   rW   r[   unittest
skipUnlesshasattrrZ   rb   rf   rn   rt   r   r   rG   r,   r   r
   rI   rI   Y   sy    %* W-/AB6 C6? W-/AB= C=-:$-r   rI   c                      \ 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*                  " \R.                  S:H  S5      S 5       rS r\R*                  " \R.                  S:H  S5      \R*                  " \R.                  R5                  S5      S5      S 5       5       rSrg)SocketEINTRTest   
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   zrw   import os, socket, sys, timerx   fd = int(sys.argv[1])family = %ssock_type = %sry   rz   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   rR   )	r   	recv_funcr   r   r   rL   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
   r`   .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   xyzrP   rw   r   rx   r   r   r   rz   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   rR   )
r   	send_funcr   r   r   rL   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
   r`   .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   rw   zimport socket, timerx   z	host = %rz	port = %srz   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   rR   )r   r   portrL   r	   client_sockrU   s          r
   test_acceptSocketEINTRTest.test_accept)  s    ##]%7%7$;<

#!!$yy!-,,,$/,$:(
  t$4 ![[]NKTYY[!, !  s   -AC99
D
   rP   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(): %srw   import os, timerx   z	path = %arz   z# let the parent blockr   r   )r   TESTFNunlinkrZ   r   PermissionErrorskipTestr   r   r=   r5   r   r   rR   )r   do_open_close_readerdo_open_close_writerfilenameerL   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   )rZ   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   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionrZ   r   r   skipIfr%   platformr   r   
startswithr   rG   r,   r   r
   r   r      so    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g)TimeEINTRTesti{  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   r  rG   r,   r   r
   r   r   {  s    $r   r   pthread_sigmaskzneed signal.pthread_sigmask()c                       \ 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  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
   r`   /SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    $r   rw   r   zpid = %szsignum = %srz   r   zos.kill(pid, signum)r   )r   SIGUSR1rZ   getpidr   r   r   r=   r  	SIG_BLOCKSIG_UNBLOCKr5   r   r   rR   )r   rS   r   re   old_handlerrL   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
   rS   3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(r   r  r   rS   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
   rS   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   r  r   r   r   r   r  r#  rG   r,   r   r
   r
  r
    s]    )2 746&6& 846&6&r   r
  c                   `   \ 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  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(  r2  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(  r6  r   r   r   r  controlr=   r-   r@   )r   r6  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   r)  r   r   r%   r   r   r   r(  r0  r4  r9  r=  rG   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   rZ   r~   r   textwrapdedentr=   r5   r   r   r   r   r   r  r   fcntlLOCK_EXr-   r@   rR   )r   	lock_func	lock_namerd1wr1rd2wr2r   rL   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)rQ  rF  rU  r'   s    r
   
test_lockfFCNTLEINTRTest.test_lockf  s    

5;;(r   c                 D    U R                  [        R                  S5        g )Nflock)rQ  rF  rY  r'   s    r
   
test_flockFCNTLEINTRTest.test_flock  s    

5;;(r   r,   N)rB   rC   rD   rE   rQ  r   r   r   systemrV  rZ  rG   r,   r   r
   r@  r@    s:     H __X__&%/1NO) P))r   r@  __main__)!
contextlibr#   rF  rZ   r   r(  r   r   r5   r%   rD  r   r   testr   test.supportr   r   r>   contextmanagerr   r   r   TestCaser   rI   r   r   r
  r&  r@  rB   mainr,   r   r
   <module>rd     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   