
    4\hG                     |   d Z ddlZddlZddlZddlZddlZddlZddlZddl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mZ ddlmZ dZej        d             Z ej         eed          d	           G d
 dej                              Z ej         eed          d	           G d de                      Z ej         eed          d	           G d de                      Z ej         eed          d	           G d de                      Z ej         eed          d	           ej         eed          d           G d de                                  Z ej         eed          d	           G d de                      Z G d de          Zedk    r ej                      dS dS )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              #      K   | 5  	 | V  n#  |                                    xY w	 ddd           dS # 1 swxY w Y   dS )zGContext manager killing the subprocess if a Python exception is raised.N)kill)procs    :/opt/python-3.11.14/usr/lib/python3.11/test/_test_eintr.pykill_on_errorr
   "   s       
  	JJJJ	IIKKK                  s   44#488	setitimerzrequires setitimer()c                   R    e Zd ZdZdZdZdZd Zd Ze	d             Z
d Zd Zd	 Zd
S )EINTRBaseTestz Base class for EINTR tests. g?g?c                 &    | xj         dz  c_         d S N   )signals)selfsignumframes      r	   
sighandlerzEINTRBaseTest.sighandler9   s        c                     d| _         t          j        t          j        | j                  | _        t          j        t          j        | j        | j                   t          j
        ddt          j                   d S )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	   setUpzEINTRBaseTest.setUp<   su    "M&.$/JJ+T->+	- 	- 	-
 	)'/2~	? 	? 	? 	? 	? 	?r   c                  F    t          j        t           j        dd           d S Nr   )r   r   r    r   r	   
stop_alarmzEINTRBaseTest.stop_alarmG   s     +Q22222r   c                     |                                   t          j        t          j        | j                   t	          j                     d S N)r)   r   r   r   r    cancel_dump_traceback_laterr$   s    r	   tearDownzEINTRBaseTest.tearDownK   s>    fnd&7888022222r   c                 H    t           j        df|z   }t          j        |fi |S )Nz-c)r"   
executable
subprocessPopen)r   argskwcmd_argss       r	   r0   zEINTRBaseTest.subprocessP   s,    ND)D0//B///r   c                 L    |                      || j        t          z
             d S r+   )assertGreaterEqual
sleep_time	CLOCK_RES)r   elapseds     r	   check_elapsed_timez EINTRBaseTest.check_elapsed_timeT   s%    9)DEEEEEr   N)__name__
__module____qualname____doc__r   r   r7   r   r%   staticmethodr)   r-   r0   r:   r(   r   r	   r   r   -   s        '' LM J  	? 	? 	? 3 3 \33 3 3
0 0 0F F F F Fr   r   c                       e Zd ZdZd Zd Zd Z ej         e	e
d          d          d             Zd Zd	 Z ej         e	e
d
          d          d             Zd Zd ZdS )OSEINTRTestz  EINTR tests for the os module. c                 @    d| j         z  }|                     |          S )Nzimport time; time.sleep(%r))r7   r0   )r   codes     r	   new_sleep_processzOSEINTRTest.new_sleep_process\   s     ,t>t$$$r   c                      d} fdt          |          D             }t          |          D ]} |             |D ]}|                                 d S )N   c                 8    g | ]}                                 S r(   )rD   ).0_r   s     r	   
<listcomp>z3OSEINTRTest._test_wait_multiple.<locals>.<listcomp>b   s%    BBB!T++--BBBr   )rangewait)r   	wait_funcnum	processesrI   r   s   `     r	   _test_wait_multiplezOSEINTRTest._test_wait_multiple`   sq    BBBBuSzzBBB	s 	 	AIKKKK 	 	DIIKKKK	 	r   c                 D    |                      t          j                   d S r+   )rP   osrL   r$   s    r	   	test_waitzOSEINTRTest.test_waiti   s      )))))r   wait3zrequires wait3()c                 2    |                      d            d S )Nc                  *    t          j        d          S r'   )rR   rT   r(   r   r	   <lambda>z(OSEINTRTest.test_wait3.<locals>.<lambda>n   s    ! r   )rP   r$   s    r	   
test_wait3zOSEINTRTest.test_wait3l   s       !4!455555r   c                 v    |                                  } ||j                   |                                 d S r+   )rD   pidrL   )r   rM   r   s      r	   _test_wait_singlezOSEINTRTest._test_wait_singlep   s6    %%''	$(		r   c                 2    |                      d            d S )Nc                 ,    t          j        | d          S r'   )rR   waitpidrZ   s    r	   rW   z*OSEINTRTest.test_waitpid.<locals>.<lambda>w   s    2:c1+=+= r   r[   r$   s    r	   test_waitpidzOSEINTRTest.test_waitpidv   s     ==>>>>>r   wait4zrequires wait4()c                 2    |                      d            d S )Nc                 ,    t          j        | d          S r'   )rR   rb   r_   s    r	   rW   z(OSEINTRTest.test_wait4.<locals>.<lambda>{   s    28C+;+; r   r`   r$   s    r	   
test_wait4zOSEINTRTest.test_wait4y   s     ;;<<<<<r   c                 X   t          j                    \  }}|                     t           j        |           g d}d                    dddd|z  d| j        z  ddd	d
df
          }|                     |t          |          |g          }t          |          5  t          j        |           |D ]8}| 	                    |t          j
        |t          |                               9| 	                    |                                d           d d d            d S # 1 swxY w Y   d S )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   )rR   pipe
addCleanupclosejoinr7   r0   strr
   assertEqualreadlenrL   )r   rdwrdatasrC   r   datas          r	   	test_readzOSEINTRTest.test_read}   sn   B"%%%
 .--yy"#5 / 2($
   tSWWt<<4   	- 	-HRLLL ? ?  rwr3t99'='=>>>>TYY[[!,,,		- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A8DD#&D#c                    t          j                    \  }}|                     t           j        |           dt          j        z  }d                    dddd| j        z  dt          j        z  ddd	d
ddddddddddf          }|                     |t          |          |g          }t          |          5  t          j        |           d}|t          |          k     r@|t          j        |t          |          |d                    z  }|t          |          k     @|                     |                                d           d d d            d S # 1 swxY w Y   d S )N   xrg   zimport io, os, sys, timerh   zrd = int(sys.argv[1])rj   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))rl   r   )rR   rn   ro   rp   r   PIPE_MAX_SIZErq   r7   r0   rr   r
   ru   write
memoryviewrs   rL   )r   rv   rw   ry   rC   r   writtens          r	   
test_writezOSEINTRTest.test_write   s   B"%%% g++yy&#/!66"/$&93(*>;'
  , tSWWt<<4   	- 	-HRLLLGCII%%28B
4(8(8(BCCC CII%%TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   8BEEEN)r;   r<   r=   r>   rD   rP   rS   unittest
skipUnlesshasattrrR   rX   r[   ra   re   rz   r   r(   r   r	   rA   rA   X   s        **% % %  * * * XW--/ABB6 6 CB6  ? ? ? XW--/ABB= = CB=- - -:$- $- $- $- $-r   rA   c                   *   e Zd ZdZ ej         eed          d          d             Zd Z	 ej         eej        d          d          d             Z
d	 Zd
 Zd Z ej         eej        d          d          d             Zd Z ej        dd           ej         eed          d          d                         Zd Z ej        ej        dk    d          d             Zd Z ej        ej        dk    d          d             ZdS )SocketEINTRTestz$ EINTR tests for the socket module. 
socketpairzneeds socketpair()c                    t          j                    \  }}|                     |j                   g d}d                    ddddt          |j                  z  dt          |j                  z  d|z  d	| j        z  dd
dddddddf          }|	                                }| 
                    |t          |          |g          }t          |          5  |                                 |D ]/}|                     | ||t          |                               0|                     |                                d           d d d            d S # 1 swxY w Y   d S )N)r|      y   zrg   import os, socket, sys, timerh   fd = int(sys.argv[1])family = %ssock_type = %sri   rj   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)rl   r   )socketr   ro   rp   rq   intfamilytyper7   filenor0   rr   r
   rs   ru   rL   )	r   	recv_funcrv   rw   rx   rC   fdr   ry   s	            r	   
_test_recvzSocketEINTRTest._test_recv   s   "$$B!!! #""yy*#C	NN*s27||+5 /7$6,&!
  & YY[[tSWWt<<4   	- 	-HHJJJ A A  yySYY'?'?@@@@TYY[[!,,,		- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A/EEEc                 N    |                      t          j        j                   d S r+   )r   r   recvr$   s    r	   	test_recvzSocketEINTRTest.test_recv       *+++++r   recvmsgzneeds recvmsg()c                 2    |                      d            d S )Nc                 8    |                      |          d         S r'   )r   sockry   s     r	   rW   z.SocketEINTRTest.test_recvmsg.<locals>.<lambda>   s    4<<+=+=a+@ r   )r   r$   s    r	   test_recvmsgzSocketEINTRTest.test_recvmsg   s    @@AAAAAr   c                 b   t          j                    \  }}|                     |j                   dt          j        dz  z  }d                    ddddt          |j                  z  dt          |j	                  z  d	| j
        z  d
t          j        dz  z  dddddddddddddddddf          }|                                }|                     |t          |          |g          }t          |          5  |                                 d}|t          |          k     rJ ||t!          |          |d                    }	||	t          |          n|	z  }|t          |          k     J|                     |                                d           d d d            d S # 1 swxY w Y   d S )Ns   xyzrF   rg   r   rh   r   r   r   rj   zdata = b"xyz" * %sr}   z)rd = socket.fromfd(fd, family, sock_type)r   zwith rd:z$    # let the parent block on send()rk   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))rl   r   )r   r   ro   rp   r   SOCK_MAX_SIZErq   r   r   r   r7   r   r0   rr   r
   ru   r   rs   rL   )
r   	send_funcrv   rw   ry   rC   r   r   r   sents
             r	   
_test_sendzSocketEINTRTest._test_send   s   "$$B!!! .!34yy*#C	NN*s27||+/ G$9Q$>?"72(5%F'>C1
  6 YY[[tSWWt<<4   	- 	-HHJJJGCII%% yZ%5%5ghh%?@@3t999$> CII%% TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   ;BF$$F(+F(c                 N    |                      t          j        j                   d S r+   )r   r   sendr$   s    r	   	test_sendzSocketEINTRTest.test_send  r   r   c                 N    |                      t          j        j                   d S r+   )r   r   sendallr$   s    r	   test_sendallzSocketEINTRTest.test_sendall!  s    -.....r   sendmsgzneeds sendmsg()c                 2    |                      d            d S )Nc                 .    |                      |g          S r+   )r   r   s     r	   rW   z.SocketEINTRTest.test_sendmsg.<locals>.<lambda>&  s    4<<+?+? r   )r   r$   s    r	   test_sendmsgzSocketEINTRTest.test_sendmsg$  s    ??@@@@@r   c                 <   t          j        t          j        df          }|                     |j                   |                                d         }d                    dddt          j        z  d|z  d| j        z  dd	d
ddf
          }| 	                    |          }t          |          5  |                                \  }}|                                 |                     |                                d           d d d            d S # 1 swxY w Y   d S )Nr   r   rg   zimport socket, timerh   z	host = %rz	port = %srj   z# let parent block on accept()r~   z,with socket.create_connection((host, port)):rk   )r   create_serverr   HOSTro   rp   getsocknamerq   r7   r0   r
   acceptrs   rL   )r   r   portrC   r   client_sockrI   s          r	   test_acceptzSocketEINTRTest.test_accept(  sT   #]%7$;<<
###!!!$yy!-,,$/,$:(
   t$$4   	- 	-![[]]NKTYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   0ADDD
   rF   mkfifozneeds mkfifo()c                 B   t           j        }t          j        |           	 t          j        |           n/# t
          $ r"}|                     d|z             Y d }~nd }~ww xY w|                     t           j        |           d                    ddd|z  d| j	        z  dddd|f	          }| 
                    |          }t          |          5   ||           |                     |                                d	           d d d            d S # 1 swxY w Y   d S )
Nzos.mkfifo(): %srg   import os, timerh   z	path = %arj   z# let the parent blockr~   r   )r   TESTFNunlinkrR   r   PermissionErrorskipTestro   rq   r7   r0   r
   rs   rL   )r   do_open_close_readerdo_open_close_writerfilenameerC   r   s          r	   
_test_openzSocketEINTRTest._test_openD  s    # 	"""	1Ih 	1 	1 	1MM+a/00000000	1	((333yy("/$$ 

 
 
 t$$4   	- 	-  ***TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s'   7 
A#AA#4DDDc                 N    t          |d          }|                                 d S )Nw)openrp   )r   pathfps      r	   python_openzSocketEINTRTest.python_openc  s     $__





r   darwinz+hangs under macOS; see bpo-25234, bpo-35363c                 <    |                      d| j                   d S )Nzfp = open(path, 'r')
fp.close())r   r   r$   s    r	   	test_openzSocketEINTRTest.test_openg  s-     	:(	* 	* 	* 	* 	*r   c                 l    t          j        |t           j                  }t          j        |           d S r+   )rR   r   O_WRONLYrp   )r   r   r   s      r	   os_openzSocketEINTRTest.os_openm  s&    WT2;''
r   c                 <    |                      d| j                   d S )Nz,fd = os.open(path, os.O_RDONLY)
os.close(fd))r   r   r$   s    r	   test_os_openzSocketEINTRTest.test_os_openq  s,     	G	& 	& 	& 	& 	&r   N)r;   r<   r=   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionrR   r   r   skipIfr"   platformr   r   r   r(   r   r	   r   r      s       ..X668LMM!- !- NM!-F, , , X	::<MNNB B ONB,- ,- ,-\, , ,/ / / X	::<MNNA A ONA- - -8 &W%b!,,XX..0@AA- - BA -,-:   X_S\X-BD D* *D D*   X_S\X-BD D& &D D& & &r   r   c                       e Zd ZdZd ZdS )TimeEINTRTestz" EINTR tests for the time module. c                     t          j                    }t          j        | j                   |                                  t          j                    |z
  }|                     |           d S r+   )time	monotonicsleepr7   r)   r:   r   t0dts      r	   
test_sleepzTimeEINTRTest.test_sleep|  s]    ^
4?###^"#####r   N)r;   r<   r=   r>   r   r(   r   r	   r   r   x  s)        ,,$ $ $ $ $r   r   pthread_sigmaskzneed signal.pthread_sigmask()c                       e Zd ZdZd Z ej         eed          d          d             Z	 ej         eed          d          d             Z
dS )	SignalEINTRTestz$ EINTR tests for the signal module. c                    t           j        }t          j                    }t          j         |d           }|                     t           j         ||           d                    ddt          j                    z  dt          |          z  d| j        z  ddf          }t          j        t           j	        |g          }|                     t           j        t           j
        |g           t          j                    }|                     |          }t          |          5   ||           t          j                    |z
  }	d d d            n# 1 swxY w Y   |                     |                                d	           d S )
Nc                      d S r+   r(   )r2   s    r	   rW   z/SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    $ r   rg   r   zpid = %szsignum = %srj   r~   zos.kill(pid, signum)r   )r   SIGUSR1rR   getpidro   rq   r   r7   r   	SIG_BLOCKSIG_UNBLOCKr   r   r0   r
   rs   rL   )
r   rM   r   rZ   old_handlerrC   old_maskr   r   r   s
             r	   check_sigwaitzSignalEINTRTest.check_sigwait  s   ikkmF,>,>??v{;;;yy$CKK'/$"
   )&*:VHEE.0BVHMMM^t$$4   	' 	'If!!B&B	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	a(((((s   !"EEEsigwaitinfozneed signal.sigwaitinfo()c                 6    d }|                      |           d S )Nc                 0    t          j        | g           d S r+   )r   r   r   s    r	   rM   z3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(((((r   r   r   rM   s     r	   test_sigwaitinfoz SignalEINTRTest.test_sigwaitinfo  s-    	) 	) 	) 	9%%%%%r   sigtimedwaitc                 6    d }|                      |           d S )Nc                 2    t          j        | gd           d S )Ng      ^@)r   r   r   s    r	   rM   z4SignalEINTRTest.test_sigtimedwait.<locals>.wait_func  s    %00000r   r   r   s     r	   test_sigtimedwaitz!SignalEINTRTest.test_sigtimedwait  s-    	1 	1 	1 	9%%%%%r   N)r;   r<   r=   r>   r   r   r   r   r   r   r   r(   r   r	   r   r     s         /.) ) )6 X7746 6& &6 6& X8846 6& &6 6& & &r   r   c                   x   e Zd ZdZd Z ej        ej        dk    d           ej	         e
ed          d          d                         Z ej	         e
ed          d	          d
             Z ej	         e
ed          d          d             Z ej	         e
ed          d          d             ZdS )SelectEINTRTestz$ EINTR tests for the select module. c                     t          j                    }t          j        g g g | j                   t          j                    |z
  }|                                  |                     |           d S r+   )r   r   selectr7   r)   r:   r   s      r	   test_selectzSelectEINTRTest.test_select  sc    ^b"b$/222^"#####r   r   z(poll may fail on macOS; see issue #28087pollzneed select.pollc                 
   t          j                    }t          j                    }|                    | j        dz             t          j                    |z
  }|                                  |                     |           d S Ng     @@)r   r   r   r   r7   r)   r:   r   pollerr   r   s       r	   	test_pollzSelectEINTRTest.test_poll  sq     ^DOc)***^"#####r   epollzneed select.epollc                 8   t          j                    }|                     |j                   t	          j                    }|                    | j                   t	          j                    |z
  }|                                  | 	                    |           d S r+   )
r   r  ro   rp   r   r   r   r7   r)   r:   r  s       r	   
test_epollzSelectEINTRTest.test_epoll  s~    %%%^DO$$$^"#####r   kqueuezneed select.kqueuec                 <   t          j                    }|                     |j                   t	          j                    }|                    d d| j                   t	          j                    |z
  }|                                  | 	                    |           d S r   )
r   r  ro   rp   r   r   controlr7   r)   r:   )r   r  r   r   s       r	   test_kqueuezSelectEINTRTest.test_kqueue  s    %%%^tQ000^"#####r   devpollzneed select.devpollc                 >   t          j                    }|                     |j                   t	          j                    }|                    | j        dz             t	          j                    |z
  }|                                  | 	                    |           d S r  )
r   r  ro   rp   r   r   r   r7   r)   r:   r  s       r	   test_devpollzSelectEINTRTest.test_devpoll  s    !!%%%^DOc)***^"#####r   N)r;   r<   r=   r>   r   r   r   r"   r   r   r   r   r  r  r  r  r(   r   r	   r   r     s8       ..$ $ $ X_S\X-?A AX002DEE$ $ FEA A$ X113FGG$ $ HG$ X224HII$ $ JI$ X335JKK$ $ LK$ $ $r   r   c                   p    e Zd Zd Z ej         ej                    dk    d          d             Zd Z	dS )FNTLEINTRTestc                    |                      t          j        t          j                   d                    ddt          j        z  d|z  d| j        z  f          }t          j                    }|                     |          }t          |          5  t          t          j        d          5 }	 t          j                    |z
  }|dk    rt          d	|z            	  ||t          j        t          j        z              ||t          j                   t          j        d
           n# t"          $ r Y nw xY w ||t          j                   t          j                    |z
  }|                                  |                     |           d d d            n# 1 swxY w Y   |                                 d d d            d S # 1 swxY w Y   d S )Nrg   zimport fcntl, timezwith open('%s', 'wb') as f:z   fcntl.%s(f, fcntl.LOCK_EX)z   time.sleep(%s)wbTg      N@z failed to sync child in %.1f secg{Gz?)ro   r   r   r   rq   r7   r   r   r0   r
   r   	ExceptionfcntlLOCK_EXLOCK_NBLOCK_UNr   BlockingIOErrorr)   r:   rL   )r   	lock_func	lock_namerC   
start_timer   fr   s           r	   _lockzFNTLEINTRTest._lock  sF   	()*:;;;yy )I,<<+i7$/1	3 4 4
 ^%%
t$$4   	 	i&-- ,	))J6BDyy'(JR(OPPP!	!U]U]%BCCC!	!U]333
4((((*   	 	!U]+++^%%
2!!!''+++#, , , , , , , , , , , , , , ,$ IIKKK'	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s\   G.0FAD-,F-
D:7F9D::AFGF#	#G&F#	'GGGAIXzAIX returns PermissionErrorc                 F    |                      t          j        d           d S )Nlockf)r  r  r   r$   s    r	   
test_lockfzFNTLEINTRTest.test_lockf  s    

5;(((((r   c                 F    |                      t          j        d           d S )Nflock)r  r  r#  r$   s    r	   
test_flockzFNTLEINTRTest.test_flock  s    

5;(((((r   N)
r;   r<   r=   r  r   r   r   systemr!  r$  r(   r   r	   r  r    sn          @ X__X_&&%/1NOO) ) PO)) ) ) ) )r   r  __main__)!r>   
contextlibr    r  rR   r   r   r   r   r0   r"   r   r   testr   test.supportr   r   r8   contextmanagerr
   r   r   TestCaser   rA   r   r   r   r   r  r;   mainr(   r   r	   <module>r-     s{             				         



         " " " " " " & & & & & &
 	    WWV[113IJJ'F 'F 'F 'F 'FH% 'F 'F KJ'FT WWV[113IJJe- e- e- e- e-- e- e- KJe-P WWV[113IJJs& s& s& s& s&m s& s& KJs&l WWV[113IJJ$ $ $ $ $M $ $ KJ$ WWV[113IJJ WWV%67746 6,& ,& ,& ,& ,&m ,& ,&6 6 KJ
,&^ WWV[113IJJ5$ 5$ 5$ 5$ 5$m 5$ 5$ KJ5$p&) &) &) &) &)M &) &) &)R zHMOOOOO r   