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‚yxtrN|jdƒt|ƒdkrjt dt|ƒƒ‚|d\}} } |tj kr´| tj kr´t| ƒ|jdkr¢t ‚|j | ƒt|ƒSWnt tfk rÎYnXt dƒ‚dS)z/Receive an array of fds over an AF_UNIX socket.rJrrLzreceived %d items of ancdatarzInvalid data receivedN)rMÚitemsizeZrecvmsgrPZ CMSG_SPACEÚEOFErrorrRr9rOrSrQr Ú ValueErrorZ frombytesÚ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_r`rarH)r:rbrrrr³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ÚrcrX)ÚfdZ popen_objrcrrrrF¸s  cCs2|jdkrt|j|jjffSt|j|jjffSdS)N)Ú__self__ÚgetattrrÚ__func__r#)ÚmrrrÚ_reduce_methodÇs rkc@seZdZdd„ZdS)Ú_CcCsdS)Nr)rrrrÚfÍsz_C.fN)r#r$r%rmrrrrrlÌsrlcCst|j|jffS)N)rhÚ __objclass__r#)rjrrrÚ_reduce_method_descriptorÒsrocCst|j|j|jpiffS)N)Ú_rebuild_partialÚfuncrÚkeywords)ÚprrrÚ_reduce_partialØsrtcCstj|f|ž|ŽS)N)Ú functoolsÚpartial)rqrrrrrrrpÚsrpcCsddlm}t||ƒffS)Nr)Ú DupSocket)rcrwÚ_rebuild_socket)rbrwrrrÚ_reduce_socketãs rycCs|jƒS)N)r=)ZdsrrrrxæsrxcCs"t|jƒƒ}t||j|j|jffS)N)rFr_rxÚfamilyrÚproto)rbÚdfrrrryës cCs|jƒ}tj||||d�S)N)r_)r=rP)r|rzrr{rfrrrrxî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 rrlrmrkrYÚappendroÚintÚ__add__rurvrtrPry)rrrrrr s  zAbstractReducer.__init__N)r#r$r%r&rr r rrÚsysÚplatformr/r.r-rGrHrFrkrorpryrxrrrrrr}ôs& r})Ú metaclass)N)NF)/Úabcrrr'rurr>r)rPr�rerÚ__all__r‚ÚhasattrrdZPicklerrr r r0r.r/rrÚobjectr-rMrRrGrHrFrkrlrrmrorYr~rr€rtrprvryrxr}rrrrÚ sb         #