
    Zh%                        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"       jH                        e!       d Z% e e#e&jN                        e%        e e#e(jR                        e%       d  Z*d! Z+ eejX                  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# e$ r d dlZY w xY w)+    )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 multiprocess.c                     t        |   |i | | j                  j                         | _        | j                  j                  | j                         y N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargskwds	__class__s      e/mounts/lovelace/software/anaconda3/envs/py312/lib/python3.12/site-packages/multiprocess/reduction.pyr   zForkingPickler.__init__)   sF    $'$'"::??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                     t        j                         } | ||g|i |j                  |       |j                         S r   )ioBytesIOr
   	getbuffer)r    objprotocolr   r   bufs         r   dumpszForkingPickler.dumps3   s8    jjlC)D)D)..s3}}r   r   )__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr	   r*   pickleloads__classcell__)r   s   @r   r   r   $   sO    0O%449
 + +  
 LLEr   r   c                 B    t        ||g|i |j                  |        y)z3Replacement for pickle.dump() using ForkingPickler.N)r   r
   )r'   filer(   r   r   s        r   r
   r
   =   s!    41D1D166s;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inheritabler9   current_processs        r   r7   r7   J   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   r8   r8   V   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)r6   r;   r>   send)connr?   destination_piddhs       r   r   r   b   s!    vw<<oN		"r   c                 >    | j                         j                         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y)r6   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;   rD   rE   r=   r<   _handlerG   _access_pid)r   r?   accesspidprocs        r   r   zDupHandle.__init__m   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)rZ   rV   rW   rX   r;   rD   rE   r=   r<   rY   rF   rG   )r   r]   s     r   rS   zDupHandle.detach|   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   rS    r   r   r6   r6   k   s    -		*r   r6   )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   ACKNOWLEDGErR   RuntimeError)sockfdsmsgs      r   ra   ra      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.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      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rK   )rk   fromfdfilenoAF_UNIXSOCK_STREAMra   )rM   r?   rN   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)rQ   r   r   N)rk   r   r   r   r   rb   )rM   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   rw   )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   )rS   )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   )rS   rk   )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 multiprocess.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   r{   appendr   int__add__r   r   r   rk   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platformr8   r7   r6   ra   rb   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)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      	 	  
 
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 0[  s   F4 4	G G