o ?Og @sddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ej dkr.send)dup_resource_sharerregisterclose_id)selfZsockrrr r__init__s zDupSocket.__init__cCsBt|j}|}t|WdS1swYdS)z1Get the socket. This should only be called once.N)rget_connectionrZ recv_bytessocketZ fromshare)rr r rrrdetach$s$zDupSocket.detachN__name__ __module__ __qualname____doc__rrrrrrrs DupFdc@r)r z-Wrapper for fd which can be used at any time.cs4t|fdd}fdd}t|||_dS)Ncst||dSr )rZ send_handle)r r Znew_fdrrr1szDupFd.__init__..sendcstdSr )osrrr!rrr3szDupFd.__init__..close)r"rrrr)rfdrrrr!rr/s   zDupFd.__init__cCs:t|j }t|WdS1swYdS)z-Get the fd. This should only be called once.N)rrrrZ recv_handle)rr rrrr7s$z DupFd.detachNrrrrrr -s c@sNeZdZdZddZddZeddZdd d Zd d Z d dZ ddZ dS)_ResourceSharerz.Manager for resources using background thread.cCs:d|_i|_t|_d|_d|_d|_t |t j dS)Nr) _key_cache threadingZLock_lock _listener_address_threadrZregister_after_forkr$ _afterfork)rrrrr?s z_ResourceSharer.__init__cCsf|j&|jdur ||jd7_||f|j|j<|j|jfWdS1s,wYdS)z+Register resource, returning an identifier.Nr)r(r*_startr%r&)rrrrrrrHs  $z_ResourceSharer.registercCs<ddlm}|\}}||tjd}||tf|S)zs"       \