
    c%                     j   d dl mZ d dlZd dlZd dlZd dlZ	 d dlZn# e$ r d dlZY nw xY wd dl	Z	d dl
Z
ddlmZ g dZe
j        dk    p( ee	d          o ee	d          o ee	j	        d	          Z G d
 dej                  Zej        Zd*dZe
j        dk    r*eg dz  Zd dlZd+dddZd Zd Zd Z G d de          Zn%eg dz  Zd dlZe
j        dk    Zd Zd Zd Zd Zd Z d Z! G d d          Z" e e# e"            j$                  e!           d  Z% e e#e&j'                  e%            e e#e(j)                  e%           d! Z*d" Z+ eej,        e*           e
j        dk    rd# Z-d$ Z. ee	j	        e-           nd% Z-d& Z. ee	j	        e-            G d' d(e)          Z/dS ),    )ABCMetaN   )context)send_handlerecv_handleForkingPicklerregisterdumpwin32CMSG_LEN
SCM_RIGHTSsendmsgc                   p     e Zd ZdZi Zej        Z fdZe	d             Z
e	dd            Zej        Z xZS )r   z&Pickler subclass used by multiprocess.c                      t                      j        |i | | j                                        | _        | j                            | j                   d S N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargskwds	__class__s      6lib/python3.11/site-packages/multiprocess/reduction.pyr   zForkingPickler.__init__)   sV    $'$'''":??AA""4#788888    c                     || j         |<   dS )z&Register a reduce function for a type.N)r   )clstypereduces      r   r	   zForkingPickler.register.   s     %+D!!!r   Nc                     t          j                    } | ||g|R i |                    |           |                                S r   )ioBytesIOr
   	getbuffer)r    objprotocolr   r   bufs         r   dumpszForkingPickler.dumps3   sK    jllC)D)))D))..s333}}r   r   )__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr	   r*   pickleloads__classcell__)r   s   @r   r   r   $   s        00O%49 9 9 9 9
 + + [+    [
 LEEEEEr   r   c                 N    t          ||g|R i |                    |            dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r
   )r'   filer(   r   r   s        r   r
   r
   =   s6    41D111D1166s;;;;;r   )	DupHandle	duplicatesteal_handleF)source_processc                ~    t          j                    }||}||}t          j        || |d|t           j                  S )z<Duplicate a handle.  (target_process is a handle not a pid!)Nr   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handletarget_processinheritabler9   current_processs        r   r7   r7   J   sR     "355 	-,N 	-,N&FN{G9; ; 	;r   c           	          t          j        t           j        d|           }	 t          j        ||t          j                    ddt           j        t           j        z            t          j        |           S # t          j        |           w xY w)z5Steal a handle from process identified by source_pid.Fr   )r;   OpenProcessPROCESS_DUP_HANDLEr=   r<   r>   DUPLICATE_CLOSE_SOURCECloseHandle)
source_pidr?   source_process_handles      r   r8   r8   V   s     ' 3&z!; !;	7*%v)++Q-0NNP P
  56666G 56666s   A A7 7Bc                 f    t          |t          j        |          }|                     |           dS z&Send a handle over a local connection.N)r6   r;   r>   send)connr?   destination_piddhs       r   r   r   b   s)    vw<oNN		"r   c                 N    |                                                                  S ))Receive a handle over a local connection.)recvdetach)rM   s    r   r   r   g   s    yy{{!!###r   c                        e Zd ZdZddZd ZdS )r6   zPicklable wrapper for a handle.Nc                 H   |t          j                    }t          j        t          j        d|          }	 t          j        t          j                    |||dd          | _        t          j        |           n# t          j        |           w xY w|| _	        || _
        d S )NFr   )osgetpidr;   rD   rE   r=   r<   _handlerG   _access_pid)r   r?   accesspidprocs        r   r   zDupHandle.__init__m   s     " ikk&w'A5#NND*&6-//D&% 4  4 #D))))#D))))!DLDIIIs   /A; ;Bc                 j   | j         t          j                    k    r| j        S t	          j        t          j        d| j                   }	 t	          j        || j        t	          j                    | j	        dt          j
                  t	          j        |           S # t	          j        |           w xY w)z1Get the handle.  This should only be called once.F)rZ   rV   rW   rX   r;   rD   rE   r=   r<   rY   rF   rG   )r   r]   s     r   rS   zDupHandle.detach|   s     yBIKK' $|#&w'A5'+y2 2D*.$,(A(C(CL%)GI I #D))))#D))))s   
=B B2r   )r+   r,   r-   r.   r   rS    r   r   r6   r6   k   s=        --	 	 	 		* 	* 	* 	* 	*r   r6   )DupFdsendfdsrecvfdsdarwinc                 0   t          j         d|          }t          t          |          dz  g          }|                     |gt          j        t          j        |fg           t          r(|                     d          dk    rt          d          dS dS )z,Send an array of fds over an AF_UNIX socket.i   r      Az%did not receive acknowledgement of fdN)
arraybyteslenr   socket
SOL_SOCKETr   ACKNOWLEDGErR   RuntimeError)sockfdsmsgs      r   ra   ra      s    k#s##SXX^$%%cUf/1BCHIJJJ 	H499Q<<4/ 	HFGGG	H 	H 	H 	Hr   c                 "   t          j         d          }|j        |z  }|                     dt          j        |                    \  }}}}|s	|st
          	 t          r|                     d           t          |          dk    rt          dt          |          z            |d         \  }}	}
|t          j
        k    r|	t          j        k    rt          |
          |j        z  dk    rt          |                    |
           t          |          dz  |d         k    r6t          d                    t          |          |d                             t!          |          S n# t          t"          f$ r Y nw xY wt          d          )	z/Receive an array of fds over an AF_UNIX socket.re   r   rg   zreceived %d items of ancdatar   rf   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rh   itemsizerecvmsgrk   
CMSG_SPACEEOFErrorrm   rL   rj   rn   rl   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)ro   sizea
bytes_sizerq   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datas              r   rb   rb      s   KZ$&
$(LLF4Ej4Q4Q$R$R!WeT 	7 	N	  		$7||q  1"#A#&w<<$0 1 1 1/6qz,J	9f// 	V..	y>>AJ.!3 %$$I&&&q66C<3q6) -(:AAFFCF, ,- - - AwwJ' 	 	 	D	2333s   DE+ +E?>E?c                     t          j        |                                 t           j        t           j                  5 }t          ||g           ddd           dS # 1 swxY w Y   dS rK   )rk   fromfdfilenoAF_UNIXSOCK_STREAMra   )rM   r?   rN   ss       r   r   r      s    ]4;;==&.&:LMM 	!QRAx   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   AA #A c                     t          j        |                                 t           j        t           j                  5 }t          |d          d         cddd           S # 1 swxY w Y   dS )rQ   r   r   N)rk   r   r   r   r   rb   )rM   r   s     r   r   r      s    ]4;;==&.&:LMM 	$QR1a==#	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   A  A$'A$c                     t          j                    }|(|                    |                    |                     S t          rddlm} |                    |           S t          d          )zReturn a wrapper for an fd.Nr   )resource_sharerz&SCM_RIGHTS appears not to be available)r   get_spawning_popenr`   duplicate_for_childHAVE_SEND_HANDLE r   rw   )fd	popen_objr   s      r   r`   r`      sw    .00	 	G??9#@#@#D#DEEE 	G))))))"((,,,EFFFr   c                 x    | j         t          | j        | j        j        ffS t          | j         | j        j        ffS r   )__self__getattrr   __func__r+   ms    r   _reduce_methodr      s:    z :aj&9:::QZ%8999r   c                       e Zd Zd ZdS )_Cc                     d S r   r_   )r   s    r   fz_C.f   s    r   N)r+   r,   r-   r   r_   r   r   r   r      s#            r   r   c                 ,    t           | j        | j        ffS r   )r   __objclass__r+   r   s    r   _reduce_method_descriptorr      s    Q^QZ000r   c                 <    t           | j        | j        | j        pi ffS r   )_rebuild_partialfuncr   keywords)ps    r   _reduce_partialr      s    afafaj.>B???r   c                 ,    t          j        | g|R i |S r   )	functoolspartial)r   r   r   s      r   r   r      s#    T5D555H555r   c                 4    ddl m} t           ||           ffS )Nr   )	DupSocket)r   r   _rebuild_socket)r   r   s     r   _reduce_socketr      s)    ......1//r   c                 *    |                                  S r   )rS   )dss    r   r   r      s    yy{{r   c                 |    t          |                                           }t          || j        | j        | j        ffS r   )r`   r   r   familyr!   proto)r   dfs     r   r   r      s1    188::QXqvqw ???r   c                 Z    |                                  }t          j        ||||          S )N)r   )rS   rk   )r   r   r!   r   r   s        r   r   r      s(    YY[[}VT5<<<<r   c                   p    e Zd ZdZeZeZeZeZeZe	j
        dk    reZeZeZneZeZeZeZeZeZeZeZd ZdS )AbstractReducerzAbstract base class for use in implementing a Reduction class
    suitable for use in replacing the standard reduction mechanism
    used in multiprocess.r   c                    t          t          t                      j                  t                     t          t          t
          j                  t                     t          t          t          j	                  t                     t          t          j        t                     t          t          j        t                     d S r   )r	   r!   r   r   r   r{   appendr   int__add__r   r   r   rk   r   )r   r   s     r   r   zAbstractReducer.__init__  s    bddf~...dk""$=>>>ck""$=>>>"O444/////r   N)r+   r,   r-   r.   r   r	   r
   r   r   sysplatformr8   r7   r6   ra   rb   r`   r   r   r   r   r   r   r_   r   r   r   r      s          $NHDKK
|w #			#N 9'#N%O0 0 0 0 0r   r   )	metaclassr   )NF)0abcr   r/   r   r$   rV   dillr1   ImportErrorrk   r   r   r   __all__r   hasattrr   Picklerr   r	   r
   r;   r7   r8   r   r   objectr6   rh   rm   ra   rb   r`   r   r   r!   r   r   r{   r   r   r   r   r   r   r   r   r   r_   r   r   <module>r      s              				 				   MMMMM  



      
N
N
N LG+ 8WVZ00 7WV\227WV]I66     V^   . "< < < < <7 FG9999GNNN
;$(
; 
; 
; 
; 
;
7 
7 
7  
$ $ $* * * * *F * * * *F ....GLLL ,(*KH H H4 4 48! ! !
$ $ $
	G 	G 	G: : :
        	bbddf~ & & &1 1 1 dk		5 6 6 6 ck		5 6 6 6@ @ @6 6 6 	O , , , <7 ,0 0 0  HV]N++++@ @ @= = = HV]N+++0 0 0 0 0 0 0 0 0 0 0s    	))