
    Rh(%                     f   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d dlZd dlZddl	m
Z
 g dZej                  dk(  xs)  eed      xr  eed      xr  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        jD                        e       d Z# e e!e$jJ                        e#        e e!e&jN                        e#       d  Z(d! Z) eejT                  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-y)+    )ABCMetaN   )context)send_handlerecv_handleForkingPicklerregisterdumpwin32CMSG_LEN
SCM_RIGHTSsendmsgc                   x     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 multiprocessing.c                     t        |   |  | j                  j                         | _        | j                  j                  | j                         y N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargs	__class__s     0/usr/lib/python3.12/multiprocessing/reduction.pyr   zForkingPickler.__init__&   sA    $"::??A""4#7#78    c                 "    || j                   |<   y)z&Register a reduce function for a type.N)r   )clstypereduces      r   r	   zForkingPickler.register+   s     %+D!r   c                 z    t        j                         } | ||      j                  |       |j                         S r   )ioBytesIOr
   	getbuffer)r   objprotocolbufs       r   dumpszForkingPickler.dumps0   s.    jjlC$}}r   r   )__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr	   r)   pickleloads__classcell__)r   s   @r   r   r   !   sO    3O%449
 + +  
 LLEr   r   c                 :    t        ||      j                  |        y)z3Replacement for pickle.dump() using ForkingPickler.N)r   r
   )r&   filer'   s      r   r
   r
   :   s    4"'',r   )	DupHandle	duplicatesteal_handle)source_processc                    t        j                         }||}||}t        j                  || |d|t         j                        S )z<Duplicate a handle.  (target_process is a handle not a pid!)r   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handletarget_processinheritabler8   current_processs        r   r6   r6   G   sO     "335!,N!,N&&FN{G99; 	;r   c           	      B   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   r7   r7   S   s~     ' 3 3&&z!;	7**%v))+Q--0N0NNP
  56G 56s   A
B Bc                 \    t        |t        j                  |      }| j                  |       yz&Send a handle over a local connection.N)r5   r:   r=   send)connr>   destination_piddhs       r   r   r   _   s!    vw<<oN		"r   c                 >    | j                         j                         S ))Receive a handle over a local connection.)recvdetach)rL   s    r   r   r   d   s    yy{!!##r   c                       e Zd ZdZddZd Zy)r5   zPicklable wrapper for a handle.Nc                 X   |t        j                         }t        j                  t        j                  d|      }	 t        j
                  t        j                         |||dd      | _        t        j                  |       || _	        || _
        y # t        j                  |       w xY w)NFr   )osgetpidr:   rC   rD   r<   r;   _handlerF   _access_pid)r   r>   accesspidprocs        r   r   zDupHandle.__init__j   s    { iik&&w'A'A5#ND*&66--/D&% 4 ##D)!DLDI ##D)s   1B B)c                    | 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)rY   rU   rV   rW   r:   rC   rD   r<   r;   rX   rE   rF   )r   r\   s     r   rR   zDupHandle.detachy   s     yyBIIK'||#&&w'A'A5'+yy2D*..$,,(A(A(CLL%)G)GI ##D)##D)s   AC Cr   )r*   r+   r,   r-   r   rR    r   r   r5   r5   h   s    -		*r   r5   )DupFdsendfdsrecvfdsdarwinc                    t        j                   d|      }t        t        |      dz  g      }| j                  |gt        j
                  t        j                  |fg       t        r | j                  d      dk7  rt        d      yy)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   ACKNOWLEDGErQ   RuntimeError)sockfdsmsgs      r   r`   r`      sr    kk#s#SX^$%cUf//1B1BCHIJ499Q<4/FGG 0;r   c                    t        j                   d      }|j                  |z  }| j                  dt        j                  |            \  }}}}|s|st
        	 t        r| j                  d       t        |      dk7  rt        dt        |      z        |d   \  }}	}
|t        j                  k(  r|	t        j                  k(  rxt        |
      |j                  z  dk7  rt        |j                  |
       t        |      dz  |d   k7  r't        dj                  t        |      |d               t!        |      S t        d      # t        t"        f$ r Y t        d      w xY w)	z/Receive an array of fds over an AF_UNIX socket.rd   r   rf   zreceived %d items of ancdatar   re   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rg   itemsizerecvmsgrj   
CMSG_SPACEEOFErrorrl   rK   ri   rm   rk   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)rn   sizea
bytes_sizerp   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datas              r   ra   ra      sT   KKZZ$&
$(LLF4E4Ej4Q$R!WeT7N			$7|q "#A#&w<$0 1 1/6qz,J	9f///V...y>AJJ.!3$$I&q6C<3q6)(:AAFCF,- - Aw 233 J' 	233	s   C"E E$#E$c                     t        j                  | j                         t         j                  t         j                        5 }t        ||g       ddd       y# 1 sw Y   yxY wrJ   )rj   fromfdfilenoAF_UNIXSOCK_STREAMr`   )rL   r>   rM   ss       r   r   r      sF    ]]4;;=&..&:L:LM 	!QRAx 	! 	! 	!s   AA"c                     t        j                  | j                         t         j                  t         j                        5 }t        |d      d   cddd       S # 1 sw Y   yxY w)rP   r   r   N)rj   r   r   r   r   ra   )rL   r   s     r   r   r      sH    ]]4;;=&..&:L:LM 	$QR1a=#	$ 	$ 	$s   AA$c                     t        j                         }| |j                  |j                  |             S t        rddlm} |j                  |       S t        d      )zReturn a wrapper for an fd.r   )resource_sharerz&SCM_RIGHTS appears not to be available)r   get_spawning_popenr_   duplicate_for_childHAVE_SEND_HANDLE r   rv   )fd	popen_objr   s      r   r_   r_      sS    ..0	 ??9#@#@#DEE)"((,,EFFr   c                     | j                   (t        | j                  | j                  j                  ffS t        | j                   | j                  j                  ffS r   )__self__getattrr   __func__r*   ms    r   _reduce_methodr      sH    zzajj&9&9:::QZZ%8%8999r   c                       e Zd Zd Zy)_Cc                      y 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^^QZZ000r   c                 \    t         | j                  | j                  | j                  xs i ffS r   )_rebuild_partialfuncr   keywords)ps    r   _reduce_partialr      s%    affaffajj.>B???r   c                 4    t        j                  | g|i |S r   )	functoolspartial)r   r   r   s      r   r   r      s    T5D5H55r   c                 ,    ddl m} t         ||       ffS )Nr   )	DupSocket)r   r   _rebuild_socket)r   r   s     r   _reduce_socketr      s    .1//r   c                 "    | j                         S r   )rR   )dss    r   r   r      s    yy{r   c                     t        | j                               }t        || j                  | j                  | j
                  ffS r   )r_   r   r   familyr    proto)r   dfs     r   r   r      s2    188:QXXqvvqww ???r   c                 T    | j                         }t        j                  ||||      S )N)r   )rR   rj   )r   r   r    r   r   s        r   r   r      s"    YY[}}VT5<<r   c                   v    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y)AbstractReducerzAbstract base class for use in implementing a Reduction class
    suitable for use in replacing the standard reduction mechanism
    used in multiprocessing.r   c                 n   t        t        t               j                        t               t        t        t
        j                        t               t        t        t        j                        t               t        t        j                  t               t        t        j                  t               y r   )r	   r    r   r   r   rz   appendr   int__add__r   r   r   rj   r   )r   r   s     r   r   zAbstractReducer.__init__  s\    bdff~.dkk"$=>ckk"$=>""O4/r   N)r*   r+   r,   r-   r   r	   r
   r   r   sysplatformr7   r6   r5   r`   ra   r_   r   r   r   r   r   r   r^   r   r   r   r      sl      $NHDKK
||w#		#N 9'#N%O0r   r   )	metaclassr   )NF).abcr   r.   r   r#   rU   r0   rj   r   r   r   __all__r   hasattrr   Picklerr   r	   r
   r:   r6   r7   r   r   objectr5   rg   rl   r`   ra   r_   r   r   r    r   r   rz   r   r   r   r   r   r   r   r   r   r^   r   r   <module>r      s      	 	   
 
N LLG+ 8VZ0 7V\27V]]I6 V^^ . ""- <<799G
;$(
;
7
$*F *F ..G ,,(*KH48!
$
	G:
  	bdff~ &1 dkk	5 6 ckk	5 6@6 		O , <<70V]]N+@= V]]N+0 0r   