3 \ $ã@sddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddddd gZ e j d kpŠeed ƒoŠeed ƒoŠeejd ƒZGdd„dejƒZejZd5dd „Ze j d k�re dddg7Z ddlZd6dd„Zdd„Zdd„Zdd„ZGdd„deƒZnHe dddg7Z ddlZe j dkZdd„Zdd„Zdd„Zd d„Zd!d„Zd"d#„Z Gd$d%„d%ƒZ!ee"e!ƒj#ƒe ƒd&d'„Z$ee"e%j&ƒe$ƒee"e'j(ƒe$ƒd(d)„Z)d*d+„Z*eej+e)ƒe j d k�râd,d-„Z,d.d/„Z-eeje,ƒnd0d-„Z,d1d/„Z-eeje,ƒGd2d3„d3ed4�Z.dS)7é)ÚABCMetaÚabstractmethodNé)ÚcontextÚ send_handleÚ recv_handleÚForkingPicklerÚregisterÚdumpÚwin32ZCMSG_LENÚ SCM_RIGHTSÚsendmsgcsJeZdZdZiZejZ‡fdd„Ze dd„ƒZ e d dd„ƒZ e j Z ‡ZS) rz)Pickler subclass used by multiprocessing.cs*tƒj|Ž|jjƒ|_|jj|jƒdS)N)ÚsuperÚ__init__Ú_copyreg_dispatch_tableÚcopyÚdispatch_tableÚupdateÚ_extra_reducers)ÚselfÚargs)Ú __class__©ú1/usr/lib64/python3.6/multiprocessing/reduction.pyr&s  zForkingPickler.__init__cCs||j|<dS)z&Register a reduce function for a type.N)r)ÚclsÚtypeÚreducerrrr +szForkingPickler.registerNcCs tjƒ}|||ƒj|ƒ|jƒS)N)ÚioÚBytesIOr Ú getbuffer)rÚobjÚprotocolZbufrrrÚdumps0szForkingPickler.dumps)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚcopyregrrrÚ classmethodr r"ÚpickleÚloadsÚ __classcell__rr)rrr!s   cCst||ƒj|ƒdS)z3Replacement for pickle.dump() using ForkingPickler.N)rr )r Úfiler!rrrr :sÚ DupHandleÚ duplicateÚ steal_handleFcCs*|dkrtjƒ}tjtjƒ||d|tjƒS)zr?r@r0r5r6r2r1rAr7r8)rrErrrr=us  zDupHandle.detach)N)r#r$r%r&rr=rrrrr-ds ÚDupFdÚsendfdsÚrecvfdsÚdarwincCsVtjd|ƒ}tt|ƒdgƒ}|j|gtjtj|fgƒtrR|jdƒdkrRt dƒ‚dS)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 Ú ACKNOWLEDGEr<Ú RuntimeError)ÚsockZfdsÚmsgrrrrG�s  c Csôtjdƒ}|j|}|jdtj|ƒƒ\}}}}| r>| r>t‚y�trN|jdƒt|ƒdkrjt dt|ƒƒ‚|d\}} } |tj krÌ| tj krÌt| ƒ|jdkr¢t ‚|j | ƒt|ƒd|dksÄt‚t|ƒSWnt tfk ræYnXt dƒ‚dS) z/Receive an array of fds over an AF_UNIX socket.rJrrLzreceived %d items of ancdatarrKzInvalid data receivedN)rMÚitemsizeZrecvmsgrPZ CMSG_SPACEÚEOFErrorrRr9rOrSrQr Ú ValueErrorZ frombytesÚAssertionErrorÚlistÚ IndexError) rTÚsizeÚaZ bytes_sizerUZancdataÚflagsZaddrZ cmsg_levelZ cmsg_typeZ cmsg_datarrrrH•s,          c Cs2tj|jƒtjtjƒ�}t||gƒWdQRXdS)z&Send a handle over a local connection.N)rPÚfromfdÚfilenoÚAF_UNIXÚ SOCK_STREAMrG)r:r4r;Úsrrrr®sc Cs0tj|jƒtjtjƒ�}t|dƒdSQRXdS)z)Receive a handle over a local connection.rrN)rPr_r`rarbrH)r:rcrrrr³scCsFtjƒ}|dk r |j|j|ƒƒStr:ddlm}|j|ƒStdƒ‚dS)zReturn a wrapper for an fd.Nr)Úresource_sharerz&SCM_RIGHTS appears not to be available)rZget_spawning_popenrFZduplicate_for_childÚHAVE_SEND_HANDLEÚrdrX)ÚfdZ popen_objrdrrrrF¸s  cCs2|jdkrt|j|jjffSt|j|jjffSdS)N)Ú__self__ÚgetattrrÚ__func__r#)ÚmrrrÚ_reduce_methodÇs rlc@seZdZdd„ZdS)Ú_CcCsdS)Nr)rrrrÚfÍsz_C.fN)r#r$r%rnrrrrrmÌsrmcCst|j|jffS)N)riÚ __objclass__r#)rkrrrÚ_reduce_method_descriptorÒsrpcCst|j|j|jpiffS)N)Ú_rebuild_partialÚfuncrÚkeywords)ÚprrrÚ_reduce_partialØsrucCstj|f|ž|ŽS)N)Ú functoolsÚpartial)rrrrsrrrrqÚsrqcCsddlm}t||ƒffS)Nr)Ú DupSocket)rdrxÚ_rebuild_socket)rcrxrrrÚ_reduce_socketãs rzcCs|jƒS)N)r=)ZdsrrrryæsrycCs"t|jƒƒ}t||j|j|jffS)N)rFr`ryÚfamilyrÚproto)rcÚdfrrrrzës cCs|jƒ}tj||||d�S)N)r`)r=rP)r}r{rr|rgrrrryîsc@sdeZdZdZeZeZeZeZeZe j dkr8e Z e Z e Z n eZeZeZeZeZeZeZeZdd„ZdS)ÚAbstractReducerz�Abstract base class for use in implementing a Reduction class suitable for use in replacing the standard reduction mechanism used in multiprocessing.r cGsNtttƒjƒtƒtttjƒtƒtttj ƒtƒtt j t ƒtt j tƒdS)N)r rrmrnrlrZÚappendrpÚintÚ__add__rvrwrurPrz)rrrrrr s  zAbstractReducer.__init__N)r#r$r%r&rr r rrÚsysÚplatformr/r.r-rGrHrFrlrprqrzryrrrrrr~ôs& r~)Ú metaclass)N)NF)/Úabcrrr'rvrr>r)rPr‚rfrÚ__all__rƒÚhasattrreZPicklerrr r r0r.r/rrÚobjectr-rMrRrGrHrFrlrmrrnrprZrr€r�rurqrwrzryr~rrrrÚ sb         #