
    h%                        S SK J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Qr\
R                  S:H  =(       d3    \" \	S5      =(       a#    \" \	S5      =(       a    \" \	R                  S	5      r " S
 S\R"                  5      r\R&                  rS)S jr\
R                  S:X  a)  \/ SQ-  rS SKrS*SS.S jjrS rS rS r " S S\5      rO)\/ SQ-  rS SKr\
R                  S:H  rS rS rS rS rS r S r! " S S5      r"\" \#" \"" 5       RH                  5      \!5        S r%\" \#" \&RN                  5      \%5        \" \#" \(RR                  5      \%5        S  r*S! r+\" \RX                  \*5        \
R                  S:X  a  S" r-S# r.\" \	R                  \-5        OS$ r-S% r.\" \	R                  \-5         " S& S'\S(9r/g! \ a    S SKr GNf = f)+    )ABCMetaN   )context)send_handlerecv_handleForkingPicklerregisterdumpwin32CMSG_LEN
SCM_RIGHTSsendmsgc                      ^  \ rS rSrSr0 r\R                  rU 4S jr	\
S 5       r\
SS j5       r\R                  rSrU =r$ )r   $   z&Pickler subclass used by multiprocess.c                    > [         TU ]  " U0 UD6  U R                  R                  5       U l        U R                  R                  U R                  5        g N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargskwds	__class__s      P/home/james-whalen/.local/lib/python3.13/site-packages/multiprocess/reduction.pyr   ForkingPickler.__init__)   sF    $'$'"::??A""4#7#78    c                      X R                   U'   g)z&Register a reduce function for a type.N)r   )clstypereduces      r   r	   ForkingPickler.register.   s     %+D!r    c                     [         R                  " 5       nU " XR/UQ70 UD6R                  U5        UR                  5       $ r   )ioBytesIOr
   	getbuffer)r"   objprotocolr   r   bufs         r   dumpsForkingPickler.dumps3   s6    jjlC)D)D)..s3}}r    )r   r   )__name__
__module____qualname____firstlineno____doc__r   copyregr   r   r   classmethodr	   r-   pickleloads__static_attributes____classcell__)r   s   @r   r   r   $   sO    0O%449
 + +  
 LLEr    r   c                 @    [        X/UQ70 UD6R                  U 5        g)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                    [         R                  " 5       nUc  UnUc  Un[         R                  " X0USU[         R                  5      $ )z<Duplicate a handle.  (target_process is a handle not a pid!)r   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handletarget_processinheritabler?   current_processs        r   r=   r=   J   sM     "335!,N!,N&&N{G99; 	;r    c           	      J   [         R                  " [         R                  SU 5      n [         R                  " X![         R                  " 5       SS[         R
                  [         R                  -  5      [         R                  " U5        $ ! [         R                  " U5        f = f)z5Steal a handle from process identified by source_pid.Fr   )rA   OpenProcessPROCESS_DUP_HANDLErC   rB   rD   DUPLICATE_CLOSE_SOURCECloseHandle)
source_pidrE   source_process_handles      r   r>   r>   V   s|     ' 3 3&&z!;	7**%))+Q--0N0NNP
  56G 56s   AB
 
B"c                 \    [        U[        R                  U5      nU R                  U5        gz&Send a handle over a local connection.N)r<   rA   rD   send)connrE   destination_piddhs       r   r   r   b   s!    vw<<oN		"r    c                 >    U R                  5       R                  5       $ ))Receive a handle over a local connection.)recvdetach)rS   s    r   r   r   g   s    yy{!!##r    c                   (    \ rS rSrSrSS jrS rSrg)r<   k   zPicklable wrapper for a handle.Nc                 `   Uc  [         R                  " 5       n[        R                  " [        R                  SU5      n [        R
                  " [        R                  " 5       XUSS5      U l        [        R                  " U5        X l	        X0l
        g ! [        R                  " U5        f = f)NFr   )osgetpidrA   rJ   rK   rC   rB   _handlerM   _access_pid)r   rE   accesspidprocs        r   r   DupHandle.__init__m   s    { iik&&w'A'A5#ND*&66--/&% 4 ##D)!LI ##D)s    2B B-c                    U R                   [        R                  " 5       :X  a  U R                  $ [        R
                  " [        R                  SU R                   5      n [        R                  " XR                  [        R                  " 5       U R                  S[        R                  5      [        R                  " U5        $ ! [        R                  " U5        f = f)z1Get the handle.  This should only be called once.F)ra   r]   r^   r_   rA   rJ   rK   rC   rB   r`   rL   rM   )r   rd   s     r   rY   DupHandle.detach|   s     yyBIIK'||#&&w'A'A5'+yy2D*..,,(A(A(CLL%)G)GI ##D)##D)s   !AC C)r`   r_   ra   r   )r/   r0   r1   r2   r3   r   rY   r8    r    r   r<   r<   k   s    -		*r    r<   )DupFdsendfdsrecvfdsdarwinc                     [         R                   " SU5      n[        [        U5      S-  /5      nU R                  U/[        R
                  [        R                  U4/5        [        (       a!  U R                  S5      S:w  a  [        S5      egg)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   ACKNOWLEDGErX   RuntimeError)sockfdsmsgs      r   rj   rj      st    kk#s#SX^$%cUf//1B1BCHIJ;499Q<4/FGG 0;r    c                    [         R                   " S5      nUR                  U-  nU R                  S[        R                  " U5      5      u  pEpgU(       d  U(       d  [
        e [        (       a  U R                  S5        [        U5      S:w  a  [        S[        U5      -  5      eUS   u  pn
U[        R                  :X  a  U	[        R                  :X  az  [        U
5      UR                  -  S:w  a  [        eUR                  U
5        [        U5      S-  US   :w  a'  [        SR                  [        U5      US   5      5      e[!        U5      $ [        S5      e! [        ["        4 a     Nf = f)	z/Receive an array of fds over an AF_UNIX socket.rn   r   rp   zreceived %d items of ancdatar   ro   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rq   itemsizerecvmsgrt   
CMSG_SPACEEOFErrorrv   rR   rs   rw   ru   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)rx   sizea
bytes_sizerz   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datas              r   rk   rk      sD   KKZZ$&
$(LLF4E4Ej4Q$R!e7N	{		$7|q "#A#&w<$0 1 1/6qz,J9f///V...y>AJJ.!3$$I&q6C<3q6)(:AAFCF,- - Aw 233 J' 		s   $C+E E.-E.c                     [         R                  " U R                  5       [         R                  [         R                  5       n[        X1/5        SSS5        g! , (       d  f       g= frQ   )rt   fromfdfilenoAF_UNIXSOCK_STREAMrj   )rS   rE   rT   ss       r   r   r      s<    ]]4;;=&..&:L:LMQRAx  NMMs   A
A'c                     [         R                  " U R                  5       [         R                  [         R                  5       n[        US5      S   sSSS5        $ ! , (       d  f       g= f)rW   r   r   N)rt   r   r   r   r   rk   )rS   r   s     r   r   r      s@    ]]4;;=&..&:L:LMQR1a=# NMMs   A
A*c                     [         R                  " 5       nUb   UR                  UR                  U 5      5      $ [        (       a  SSKJn  UR                  U 5      $ [        S5      e)zReturn a wrapper for an fd.r   )resource_sharerz&SCM_RIGHTS appears not to be available)r   get_spawning_popenri   duplicate_for_childHAVE_SEND_HANDLE r   r   )fd	popen_objr   s      r   ri   ri      sV    ..0	 ??9#@#@#DEE)"((,,EFFr    c                     U R                   c(  [        U R                  U R                  R                  44$ [        U R                   U R                  R                  44$ r   )__self__getattrr   __func__r/   ms    r   _reduce_methodr      sH    zzajj&9&9:::QZZ%8%8999r    c                       \ rS rSrS rSrg)_C   c                     g r   rh   )r   s    r   f_C.f   s    r    rh   N)r/   r0   r1   r2   r   r8   rh   r    r   r   r      s    r    r   c                 >    [         U R                  U R                  44$ r   )r   __objclass__r/   r   s    r   _reduce_method_descriptorr      s    Q^^QZZ000r    c                 f    [         U R                  U R                  U R                  =(       d    0 44$ r   )_rebuild_partialfuncr   keywords)ps    r   _reduce_partialr      s%    affaffajj.>B???r    c                 6    [         R                  " U /UQ70 UD6$ r   )	functoolspartial)r   r   r   s      r   r   r      s    T5D5H55r    c                 ,    SSK Jn  [        U" U 5      44$ )Nr   )	DupSocket)r   r   _rebuild_socket)r   r   s     r   _reduce_socketr      s    .1//r    c                 "    U R                  5       $ r   )rY   )dss    r   r   r      s    yy{r    c                     [        U R                  5       5      n[        XR                  U R                  U R
                  44$ r   )ri   r   r   familyr#   proto)r   dfs     r   r   r      s0    188:XXqvvqww ???r    c                 L    U R                  5       n[        R                  " XX4S9$ )N)r   )rY   rt   )r   r   r#   r   r   s        r   r   r      s    YY[}}V5<<r    c                       \ rS rSrSr\r\r\r\r\	r	\
R                  S:X  a  \r\r\rO\r\r\r\r\r\r\r\rS rSrg)AbstractReducer   zAbstract base class for use in implementing a Reduction class
suitable for use in replacing the standard reduction mechanism
used in multiprocess.r   c                 n   [        [        [        5       R                  5      [        5        [        [        [
        R                  5      [        5        [        [        [        R                  5      [        5        [        [        R                  [        5        [        [        R                  [        5        g r   )r	   r#   r   r   r   r   appendr   int__add__r   r   r   rt   r   )r   r   s     r   r   AbstractReducer.__init__  s\    bdff~.dkk"$=>ckk"$=>""O4/r    rh   N)r/   r0   r1   r2   r3   r   r	   r
   r   r   sysplatformr>   r=   r<   rj   rk   ri   r   r   r   r   r   r   r8   rh   r    r   r   r      sl     $NHDKK
||w#		#N 9'#N%O0r    r   )	metaclassr   )NF)0abcr   r4   r   r'   r]   dillr6   ImportErrorrt   r   r   r   __all__r   hasattrr   Picklerr   r	   r
   rA   r=   r>   r   r   objectr<   rq   rv   rj   rk   ri   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   rh   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   G 
GG