B HxLK@sddlZddlZddlZddlZddlZddlZddlmZddlm Z ddddd d d d d ddddddgZ dZ dZ dZ dZdZdZdZdadaddZddZddZddZdd Zd>d d Zd!d"Zd#d$ZeZd%d&Zd'd ZeZ e!Z"d(d)Z#d*d Z$iZ%e!Z&Gd+dde'Z(d?d,d-Z)d.d Z*da+eee)e j,e j-fd/d0Z.e/e.Gd1dde'Z0Gd2ddej1Z2ye3d3Z4Wne5k rd4Z4YnXd5dZ6d6d7Z7d8d9Z8d:d;Z9dt|||_n|dkrNtd||_ ||_ |p`i|_ |t t f|_t|_|t|j<dS)Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None)r2intr5formattypeweakrefref_weakref ValueError _callback_args_kwargsrK_finalizer_counter_keyosgetpid_pid_finalizer_registry)selfrHcallbackrkwargsr=rrr__init__s  zFinalize.__init__cCsy ||j=Wntk r(|dYnbX|j|krD|dd}n$|d|j|j|j|j|j|j}d|_|_|_|_|_|SdS)Nzfinalizer no longer registeredz+finalizer ignored because different processz/finalizer calling %s with args %s and kwargs %s)rYKeyErrorr\rUrVrWrS)r^Zwrr]rr[Zresrrr__call__s  zFinalize.__call__cCsDy t|j=Wntk r Yn Xd|_|_|_|_|_dS)N)r]rYrbrSrUrVrW)r^rrrcancels  zFinalize.cancelcCs |jtkS)N)rYr])r^rrr still_activeszFinalize.still_activec Csy |}Wnttfk r(d}YnX|dkr>d|jjSd|jjt|jd|jf}|jrr|dt|j7}|j r|dt|j 7}|j ddk r|dt|j d7}|dS) Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z , kwargs=rz, exitprority=>) rSAttributeErrorr5 __class__rfgetattrrUrVr4rWrY)r^rHxrrr__repr__s    zFinalize.__repr__)rNN) rf __module__ __qualname__rar]rrZr[rcrdrerlrrrrrs  c stdkr dSdkrddn fddfddttD}|jddxX|D]P}t|}|dk rRtd|y |WqRtk rd dl}|YqRXqRWdkrtdS) NcSs |ddk S)Nrr)prrrz!_run_finalizers..cs|ddk o|dkS)Nrr)ro) minpriorityrrrprqcsg|]}|r|qSrr).0key)frr #sz#_run_finalizers..T)reversez calling %sr) r]rArDr>rrE traceback print_excclear)rrkeysrt finalizerrxr)rurrr_run_finalizers s$       r}cCs tp tdkS)N)_exitingrrrrr 8scCstsda|d|d|d|dk rzx*|D] }|jr2|d|j|jq2Wx"|D]}|d|j|q^W|d|dS)NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0rz!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)r~ZdaemonnameZ_popenZ terminatejoin)rrr}active_childrenr8rorrrr&@s       r&c@s,eZdZddZddZddZddZd S) rcCs|t|tjdS)N)_resetr r)r^rrrraqszForkAwareThreadLock.__init__cCs"t|_|jj|_|jj|_dS)N) threadingZLock_lockacquirerelease)r^rrrrus  zForkAwareThreadLock._resetcCs |jS)N)r __enter__)r^rrrrzszForkAwareThreadLock.__enter__cGs |jj|S)N)r__exit__)r^rrrrr}szForkAwareThreadLock.__exit__N)rfrmrnrarrrrrrrrpsc@seZdZddZddZdS)rcCst|dddS)NcSs |jS)N)__dict__rz)rHrrrrprqz)ForkAwareLocal.__init__..)r )r^rrrraszForkAwareLocal.__init__cCs t|dfS)Nr)rP)r^rrr __reduce__szForkAwareLocal.__reduce__N)rfrmrnrarrrrrrs SC_OPEN_MAXcCsRt|dtg}|x4tt|dD] }t||d||dq*WdS)Nr)rAMAXFDrDrangelenrZ closerange)Zfdsirrrrsc CstjdkrdSytjWnttfk r4YnXy@ttjtj}yt|ddt_Wnt|YnXWnttfk rYnXdS)NF)closefd) r.stdincloseOSErrorrTrZopendevnullO_RDONLY)fdrrr _close_stdins   rc CsTytjWnttfk r&YnXytjWnttfk rNYnXdS)N)r.stdoutflushrhrTstderrrrrr_flush_std_streamssrcCstddl}tttt|}t\}}z2||t|gd|dddddddd||dddSt |t |XdS)NrTrF) _posixsubprocesstuplesortedmaprNrZpipeZ fork_execfsencoder)pathrZpassfdsrZ errpipe_readZ errpipe_writerrrspawnv_passfdss   rcCsDddlm}tddlm}|jt| | dS)Nr)support) forkserver) ZtestrrZ_cleanuprrZ _forkserverZ_stopr}Z gc_collectZ reap_children)rrrrr_cleanup_testss   r)N)N);rZ itertoolsr.rQr%r subprocessrr__all__ZNOTSETrrr rr#r*rr+rrrrr r r0r6Zabstract_sockets_supportedr;r ZWeakValueDictionaryrBcountrLrJr r]rXobjectrr}r r~rr8r&r'rZlocalrsysconfrrErrrrrrrrr sp        V ,(