o w[e @sddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ej dkr.send)dup_resource_sharerregisterclose_id)selfsockrrrr__init__s zDupSocket.__init__cCsBt|j}|}t|WdS1swYdS)z1Get the socket. This should only be called once.N)rget_connectionr recv_bytessocket fromshare)rr r rrrdetach$s$zDupSocket.detachN__name__ __module__ __qualname____doc__rr rrrrrs DupFdc@r )r&z-Wrapper for fd which can be used at any time.cs4t|fdd}fdd}t|||_dS)Ncst||dSr )r send_handle)r rnew_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)rrrr recv_handle)rr rrrr 7s$z DupFd.detachNr!rrrrr&-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 threadingLock_lock _listener_address_threadrregister_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)r2r4_startr.r/)rrrrrrrHs  $z_ResourceSharer.registercCs<ddlm}|\}}||tjd}||tf|S)zr<rrr5joinis_aliver sub_warningr3r/itemsclear)rtimeoutr:rCrBrrrrrrZs*        "z_ResourceSharer.stopcCs\|jD] \}\}}|q|j|j|jdur#|jd|_d|_d|_dSr ) r/rGrHr2_at_fork_reinitr3rr4r5)rrBrrrrrr7os     z_ResourceSharer._afterforkcCsjddlm}|jdusJdtd|tjd|_|jj|_ t j |j d}d|_ |||_dS)Nr)ListenerzAlready have Listenerz0starting listener and thread for sending handlesr;)targetT)r=rKr3rdebugrr>r<rAr4r0Thread_servedaemonstartr5)rrKtrrrr8zs    z_ResourceSharer._startcCsttdrttjt zD|j5}|}|dur( WdWdS|\}}|j |\}}z |||W|n|wWdn1sMwYWnt sbt j t Yq)Npthread_sigmask)hasattrsignalrS SIG_BLOCK valid_signalsr3acceptrecvr/popr is_exitingsys excepthookexc_info)rr msgrBdestination_pidrrrrrrOs*    z_ResourceSharer._server ) r"r#r$r%rr staticmethodrrr7r8rOrrrrr-=s    r-)r*rUrr\r0rcontextrr__all__platformobjectrr&r-rrrrrrs"       \