
    F\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       RD                  5      \5        S r#\" \!" \$RJ                  5      \#5        \" \!" \&RN                  5      \#5        S  r(S! r)\" \RT                  \(5        \R                  S:X  a  S" r+S# r,\" \R                  \+5        OS$ r+S% r,\" \R                  \+5         " S& S'\S(9r-g)+    )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 multiprocessing.c                    > [         TU ]  " U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	__class__s     0/usr/lib/python3.13/multiprocessing/reduction.pyr   ForkingPickler.__init__&   sA    $"::??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                 z    [         R                  " 5       nU " X25      R                  U5        UR                  5       $ r   )ioBytesIOr
   	getbuffer)r!   objprotocolbufs       r   dumpsForkingPickler.dumps0   s,    jjlC$}}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    3O%449
 + +  
 LLEr   r   c                 8    [        X5      R                  U 5        g)z3Replacement for pickle.dump() using ForkingPickler.N)r   r
   )r)   filer*   s      r   r
   r
   :   s    4"'',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<   G   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   )r@   OpenProcessPROCESS_DUP_HANDLErB   rA   rC   DUPLICATE_CLOSE_SOURCECloseHandle)
source_pidrD   source_process_handles      r   r=   r=   S   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;   r@   rC   send)connrD   destination_piddhs       r   r   r   _   s!    vw<<oN		"r   c                 >    U R                  5       R                  5       $ ))Receive a handle over a local connection.)recvdetach)rR   s    r   r   r   d   s    yy{!!##r   c                   (    \ rS rSrSrSS jrS rSrg)r;   h   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getpidr@   rI   rJ   rB   rA   _handlerL   _access_pid)r   rD   accesspidprocs        r   r   DupHandle.__init__j   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)r`   r\   r]   r^   r@   rI   rJ   rB   rA   r_   rK   rL   )r   rc   s     r   rX   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/   r0   r1   r2   r   rX   r7    r   r   r;   r;   h   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   ACKNOWLEDGErW   RuntimeError)sockfdsmsgs      r   ri   ri      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.rm   r   ro   zreceived %d items of ancdatar   rn   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rp   itemsizerecvmsgrs   
CMSG_SPACEEOFErrorru   rQ   rr   rv   rt   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)rw   sizea
bytes_sizery   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datas              r   rj   rj      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rP   )rs   fromfdfilenoAF_UNIXSOCK_STREAMri   )rR   rD   rS   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)rV   r   r   N)rs   r   r   r   r   rj   )rR   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_popenrh   duplicate_for_childHAVE_SEND_HANDLE r   r   )fd	popen_objr   s      r   rh   rh      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   rg   )r   s    r   f_C.f   s    r   rg   N)r.   r/   r0   r1   r   r7   rg   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   )rX   )dss    r   r   r      s    yy{r   c                     [        U R                  5       5      n[        XR                  U R                  U R
                  44$ r   )rh   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   )rX   rs   )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 multiprocessing.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   rs   r   )r   r   s     r   r   AbstractReducer.__init__  s\    bdff~.dkk"$=>ckk"$=>""O4/r   rg   N)r.   r/   r0   r1   r2   r   r	   r
   r   r   sysplatformr=   r<   r;   ri   rj   rh   r   r   r   r   r   r   r7   rg   r   r   r   r      sl      $NHDKK
||w#		#N 9'#N%O0r   r   )	metaclassr   )NF).abcr   r3   r   r&   r\   r5   rs   r   r   r   __all__r   hasattrr   Picklerr   r	   r
   r@   r<   r=   r   r   objectr;   rp   ru   ri   rj   rh   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   rg   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   