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;Z9dr?rrrr s  c Csjtt}|xP|D]H\\}}}}y ||Wqtk r`}ztd|Wdd}~XYqXqWdS)Nz after forker raised exception %s)list_afterfork_registryitemssort Exceptionr)rBindexZidentfuncobjerrr_run_after_forkerss  rIcCs|tttt||f<dS)N)rAnext_afterfork_counterid)rGrFrrrr sc@sFeZdZdZdddZdeeejfddZ dd Z d d Z d d Z dS)rzA Class which supports object finalization using weakrefs rNcCs|dk r&t|ts&td|t||dk r>t|||_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)r1intr4formattypeweakrefref_weakref ValueError _callback_args_kwargsrJ_finalizer_counter_keyosgetpid_pid_finalizer_registry)selfrGcallbackrkwargsr<rrr__init__s  zFinalize.__init__cCsy ||j=Wntk r(|dYnbX|j|krD|dd}n$|d|j|j|j|j|j|j}d|_|_|_|_|_|SdS)zQ Run the callback unless it has already been called or cancelled zfinalizer no longer registeredz+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %s)rXKeyErrorr[rTrUrVrR)r]Zwrr\rrZZresrrr__call__s  zFinalize.__call__cCsDy t|j=Wntk r Yn Xd|_|_|_|_|_dS)z3 Cancel finalization of the object N)r\rXrarRrTrUrV)r]rrrcancels  zFinalize.cancelcCs |jtkS)zS Return whether this finalizer is still waiting to invoke callback )rXr\)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=>) rRAttributeErrorr4 __class__regetattrrTrUr3rVrX)r]rGxrrr__repr__s    zFinalize.__repr__)rNN) re __module__ __qualname____doc__r`r\rrYrZrbrcrdrkrrrrrs  c stdkr dSdkrddn fddfddttD}|jddxX|D]P}t|}|dk rRtd |y |WqRtk rd dl}|YqRXqRWdkrtdS) z Run all finalizers whose exit priority is not None and at least minpriority Finalizers with highest priority are called first; finalizers with the same priority will be called in reverse order of creation. 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\r@rCr=rrD traceback print_excclear)rrkeysrt finalizerrxr)rurrr_run_finalizers s$       r}cCs tp tdkS)z6 Returns true if the process is shutting down 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_childrenr7rorrrr&@s       r&c@s,eZdZddZddZddZddZd S) rcCs|t|tjdS)N)_resetr r)r]rrrr`qszForkAwareThreadLock.__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)rerlrmr`rrrrrrrrpsc@seZdZddZddZdS)rcCst|dddS)NcSs |jS)N)__dict__rz)rGrrrrprqz)ForkAwareLocal.__init__..)r )r]rrrr`szForkAwareLocal.__init__cCs t|dfS)Nr)rO)r]rrr __reduce__szForkAwareLocal.__reduce__N)rerlrmr`rrrrrrs SC_OPEN_MAXcCsft|dtg}||dtks,tdx4tt|dD] }t||d||dq>WdS)Nz fd too larger)r@MAXFDrCAssertionErrorrangelenrY closerange)Zfdsirrrrs c CstjdkrdSytjWnttfk r4YnXy@ttjtj}yt|ddt_Wnt|YnXWnttfk rYnXdS)NF)closefd) r-stdincloseOSErrorrSrYopendevnullO_RDONLY)fdrrr _close_stdins   rc CsTytjWnttfk r&YnXytjWnttfk rNYnXdS)N)r-stdoutflushrgrSstderrrrrr_flush_std_streamssrcCstddl}tttt|}t\}}z2||t|gd|dddddddd||dddSt |t |XdS)NrTrF) _posixsubprocesstuplesortedmaprMrYpipeZ fork_execfsencoder)pathrZpassfdsrZ errpipe_readZ errpipe_writerrrspawnv_passfdss   rcCsDddlm}tddlm}|jt| | dS)zKCleanup multiprocessing resources when multiprocessing tests completed.r)support) forkserverN) ZtestrrZ_cleanuprrZ _forkserverZ_stopr}Z gc_collectZ reap_children)rrrrr_cleanup_testss   r)N)N);rY itertoolsr-rPr%r subprocessrr__all__ZNOTSETrrr rr#r*rr+rrrrr r r/r5Zabstract_sockets_supportedr:r ZWeakValueDictionaryrAcountrKrIr r\rWobjectrr}r r~rr7r&r'rZlocalrsysconfrrDrrrrrrrrr sp        V ,(