3 \# @sdddgZddlZddlZddlZddlZddlmZyejjej Z Wne k rbdZ YnXddZ ddZ dd ZGd ddeZGd d d eZGd ddeZeaejdaea[iZxSsz'BaseProcess.__init__..)next_process_counterr _identity_configcopyosgetpid _parent_pidr _targettuple_argsdict_kwargstype__name__join_namer _danglingadd)rgrouptargetnameargskwargsrcountrrr__init__Gs    zBaseProcess.__init__cCs|jr|j|j|jdS)zQ Method to be run in sub-process; can be overridden in sub-class N)r"r$r&)rrrrrunXszBaseProcess.runcCs6t|j||_|jj|_|`|`|`tj |dS)z% Start child process N) r rr sentinel _sentinelr"r$r&r r,)rrrrstart_s    zBaseProcess.startcCs|jjdS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r terminate)rrrrr8pszBaseProcess.terminatecCs"|jj|}|dk rtj|dS)z5 Wait until child process terminates N)r waitr r)rZtimeoutresrrrr)vs zBaseProcess.joincCsB|tkr dS|jdkrdS|jj}|dkr0dStj|dSdS)z1 Return whether process is alive TNF)rr r r r)r returncoderrris_alives   zBaseProcess.is_alivecCs|jS)N)r*)rrrrr/szBaseProcess.namecCs ||_dS)N)r*)rr/rrrr/scCs|jjddS)z4 Return whether process is a daemon rF)rget)rrrrrszBaseProcess.daemoncCs||jd<dS)z1 Set whether process is a daemon rN)r)rZdaemonicrrrrscCs |jdS)Nauthkey)r)rrrrr>szBaseProcess.authkeycCst||jd<dS)z2 Set authorization key of process r>N)AuthenticationStringr)rr>rrrr>scCs|jdkr|jS|jjS)zM Return exit code of process or `None` if it has yet to stop N)r r )rrrrexitcodes zBaseProcess.exitcodecCs"|tkrtjS|jo|jjSdS)zU Return identifier (PID) of process or `None` if it has yet to start N)rrr r pid)rrrridentszBaseProcess.identc Cs(y|jStk r"tdYnXdS)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)r6AttributeError ValueError)rrrrr5szBaseProcess.sentinelcCs|tkrd}n>|jtjkr"d}n*|jdkr2d}n|jjdk rH|j}nd}t|tkrv|dkrfd}ndt j ||}dt|j |j ||j rdpd fS) NZstartedunknowninitialrZstoppedz stopped[%s]z<%s(%s, %s%s)>z daemon)rr!rr r r r@r'int_exitcode_to_namer=r(r*r)rZstatusrrr__repr__s  zBaseProcess.__repr__c CsJddlm}m}zy||jdk r,|j|jtjdata |j t }|a z|j j |jWd~X|jdz|jd}Wd|jXWntk r}zL|jsd}n:t|jdtr|jd}ntjjt|jddd}WYdd}~Xn2d}ddl}tjjd|j|jYnXWd|jd||jX|S)N)utilcontextz child process calling self.run()r z Process %s: z process exiting with exitcode %d)rGrLrMZ _start_methodZ_force_start_method itertoolsr2rsetr Z _close_stdinrZ_finalizer_registryclearZ_run_after_forkersinfor4Z_exit_function SystemExitr0 isinstancerHsysstderrwriter tracebackr/ print_excZ_flush_std_streams)rrLrMZ old_processr@erXrrr _bootstrapsB        zBaseProcess._bootstrap)N)r( __module__ __qualname____doc__rr3r4r7r8r)r<propertyr/setterrr>r@rBrAr5rJr[rrrrr>s*       c@seZdZddZdS)r?cCs,ddlm}|dkrtdtt|ffS)NrK)get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rMra TypeErrorr?bytes)rrarrr __reduce__s   zAuthenticationString.__reduce__N)r(r\r]rdrrrrr?sr?c@seZdZddZdS) _MainProcesscCs2f|_d|_d|_d|_ttjddd|_dS)NZ MainProcess z/mp)r>Z semprefix)rr*r!r r?rurandomr)rrrrr3-s  z_MainProcess.__init__N)r(r\r]r3rrrrre+srerKZSIG_) __all__rrUsignalrO _weakrefsetrpathabspathgetcwdZ ORIGINAL_DIROSErrorrrr objectrrcr?rerr2rrPr rIr __dict__itemsr/Zsignumr+rrrr s2     `