o ?Og @sddlZddlZddlZddlZddlZddlmZddlmZddlm Z dgZ ej dkr.send)dup_resource_sharerregisterclose_id)selfZsockrrr r__init__s zDupSocket.__init__cCsD t|j}|}t|WdS1swYdSr )rget_connectionrZ recv_bytessocketZ fromshare)rr r rrrdetach$s $zDupSocket.detachN__name__ __module__ __qualname__rrrrrrrs DupFdc@r)rcs4t|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|WdS1swYdSr )rrrrZ recv_handle)rr rrrr7s$z DupFd.detachNrrrrrr-s c@sLeZdZ ddZddZeddZddd Zd d Zd d Z ddZ dS)_ResourceSharercCs: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__cCsh |j&|jdur||jd7_||f|j|j<|j|jfWdS1s-wYdS)Nr)r'r)_startr$r%)rrrrrrrHs  $z_ResourceSharer.registercCs> ddlm}|\}}||tjd}||tf|S)NrClientauthkey) connectionr.rcurrent_processr0rr!getpid)Zidentr.addresskeycrrrrQs  z_ResourceSharer.get_connectionNcCs ddlm}|j[|jdur]||jtjd}|d||j ||j r3t d|jd|_ d|_d|_|jD] \}\}}|qF|jWddSWddS1shwYdS)Nrr-r/z._ResourceSharer thread did not stop when asked)r1r.r'r)rr2r0rrr*joinZis_aliverZ sub_warningr(r%itemsclear)rZtimeoutr.r6r5rrrrrrZs,        "z_ResourceSharer.stopcCs\|jD] \}\}}|q|j|j|jdur#|jd|_d|_d|_dSr ) r%r8r9r'_at_fork_reinitr(rr)r*)rr5rrrrrr+os     z_ResourceSharer._afterforkcCsXddlm}td|tjd|_|jj|_ t j |j d}d|_ |||_dS)Nr)Listenerz0starting listener and thread for sending handlesr/)targetT)r1r;rdebugrr2r0r(r4r)r&ZThread_serveZdaemonstartr*)rr;trrrr,zs    z_ResourceSharer._startcCsttdrttjt zD|j5}|}|dur( WdWdS|\}}|j |\}}z |||W|n|wWdn1sMwYWnt sbt j t Yq)Npthread_sigmask)hasattrsignalrA SIG_BLOCK valid_signalsr(ZacceptZrecvr%poprZ is_exitingsys excepthookexc_info)rr msgr5Zdestination_pidrrrrrr>s*    z_ResourceSharer._server ) rrrrr staticmethodrrr+r,r>rrrrr#=s    r#)r!rCrrGr&rcontextrr__all__platformobjectrrr#rrrrrrs"       \