o
    “Hbà.  ã                   @   s2  g d ¢Z ddlZddlZddlZddlZddlZddlmZ z
ej 	e 
¡ ¡ZW n ey3   dZY nw dd„ Zdd„ Zdd	„ Zd
d„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdaeƒ ae d¡aeƒ a[i Zeej  ¡ ƒD ]\Z!Z"e!dd… dkr“de!vr“de!› ee" < q{eƒ Z#dS ))ÚBaseProcessÚcurrent_processÚactive_childrenÚparent_processé    N)ÚWeakSetc                   C   ó   t S )z@
    Return process object representing the current process
    )Ú_current_process© r	   r	   ú./usr/lib/python3.10/multiprocessing/process.pyr   %   ó   r   c                   C   s   t ƒ  ttƒS )zN
    Return list of process objects corresponding to live child processes
    )Ú_cleanupÚlistÚ	_childrenr	   r	   r	   r
   r   +   s   r   c                   C   r   )z?
    Return process object representing the parent process
    )Ú_parent_processr	   r	   r	   r
   r   3   r   r   c                  C   s*   t tƒD ]} | j ¡ d urt | ¡ qd S ©N)r   r   Ú_popenÚpollÚdiscard)Úpr	   r	   r
   r   =   s
   
€þr   c                   @   sü   e Zd ZdZdd„ Zddddi fddœdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
d,dd„Zdd„ Zdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZejdd„ ƒZedd „ ƒZejd!d „ ƒZed"d#„ ƒZed$d%„ ƒZeZed&d'„ ƒZd(d)„ Zd,d*d+„ZdS )-r   z€
    Process objects represent activity that is run in a separate process

    The class is analogous to `threading.Thread`
    c                 C   s   t ‚r   )ÚNotImplementedError©Úselfr	   r	   r
   Ú_PopenM   ó   zBaseProcess._PopenNr	   )Údaemonc                C   s°   |d u sJ dƒ‚t tƒ}tj|f | _tj ¡ | _t ¡ | _tj	| _
d | _d| _|| _t|ƒ| _t|ƒ| _|pHt| ƒjd d dd„ | jD ƒ¡ | _|d urQ|| _t | ¡ d S )Nz#group argument must be None for nowFú-ú:c                 s   s    | ]}t |ƒV  qd S r   )Ústr)Ú.0Úir	   r	   r
   Ú	<genexpr>^   s   € z'BaseProcess.__init__.<locals>.<genexpr>)ÚnextÚ_process_counterr   Ú	_identityÚ_configÚcopyÚosÚgetpidÚ_parent_pidÚnameÚ_parent_namer   Ú_closedÚ_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_namer   Ú	_danglingÚadd)r   ÚgroupÚtargetr)   ÚargsÚkwargsr   Úcountr	   r	   r
   Ú__init__P   s"   


ÿzBaseProcess.__init__c                 C   s   | j rtdƒ‚d S )Nzprocess object is closed)r+   Ú
ValueErrorr   r	   r	   r
   Ú_check_closedc   s   ÿzBaseProcess._check_closedc                 C   s"   | j r| j | ji | j¤Ž dS dS )zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r,   r.   r0   r   r	   r	   r
   Úrung   s   ÿzBaseProcess.runc                 C   sz   |   ¡  | jdu sJ dƒ‚| jt ¡ ksJ dƒ‚tj d¡r"J dƒ‚tƒ  |  	| ¡| _| jj
| _| `| `| `t | ¡ dS )z%
        Start child process
        Nzcannot start a process twicez:can only start a process object created by current processr   z3daemonic processes are not allowed to have children)r>   r   r(   r&   r'   r   r$   Úgetr   r   ÚsentinelÚ	_sentinelr,   r.   r0   r   r6   r   r	   r	   r
   Ústartn   s   ÿÿ
zBaseProcess.startc                 C   ó   |   ¡  | j ¡  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r>   r   Ú	terminater   r	   r	   r
   rE   €   ó   zBaseProcess.terminatec                 C   rD   )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)r>   r   Úkillr   r	   r	   r
   rG   ‡   rF   zBaseProcess.killc                 C   sV   |   ¡  | jt ¡ ksJ dƒ‚| jdusJ dƒ‚| j |¡}|dur)t | ¡ dS dS )z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)r>   r(   r&   r'   r   Úwaitr   r   )r   ÚtimeoutÚresr	   r	   r
   r3   Ž   s   ÿzBaseProcess.joinc                 C   s\   |   ¡  | tu r
dS | jt ¡ ksJ dƒ‚| jdu rdS | j ¡ }|du r'dS t | ¡ dS )z1
        Return whether process is alive
        Tzcan only test a child processNF)	r>   r   r(   r&   r'   r   r   r   r   )r   Ú
returncoder	   r	   r
   Úis_alive™   s   


zBaseProcess.is_alivec                 C   sH   | j dur| j  ¡ du rtdƒ‚| j  ¡  d| _ | `t | ¡ d| _dS )zÂ
        Close the Process object.

        This method releases resources held by the Process object.  It is
        an error to call this method if the child process is still running.
        Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)r   r   r=   ÚcloserB   r   r   r+   r   r	   r	   r
   rM   ¬   s   



zBaseProcess.closec                 C   ó   | j S r   )r4   r   r	   r	   r
   r)   ½   ó   zBaseProcess.namec                 C   s   t |tƒs	J dƒ‚|| _d S )Nzname must be a string)Ú
isinstancer   r4   )r   r)   r	   r	   r
   r)   Á   s   
c                 C   s   | j  dd¡S )z4
        Return whether process is a daemon
        r   F)r$   r@   r   r	   r	   r
   r   Æ   s   zBaseProcess.daemonc                 C   s    | j du s	J dƒ‚|| jd< dS )z1
        Set whether process is a daemon
        Nzprocess has already startedr   )r   r$   )r   Zdaemonicr	   r	   r
   r   Í   s   c                 C   s
   | j d S )NÚauthkey)r$   r   r	   r	   r
   rQ   Õ   s   
zBaseProcess.authkeyc                 C   s   t |ƒ| jd< dS )z2
        Set authorization key of process
        rQ   N)ÚAuthenticationStringr$   )r   rQ   r	   r	   r
   rQ   Ù   s   c                 C   s"   |   ¡  | jdu r| jS | j ¡ S )zM
        Return exit code of process or `None` if it has yet to stop
        N)r>   r   r   r   r	   r	   r
   Úexitcodeà   s   

zBaseProcess.exitcodec                 C   s&   |   ¡  | tu rt ¡ S | jo| jjS )zU
        Return identifier (PID) of process or `None` if it has yet to start
        )r>   r   r&   r'   r   Úpidr   r	   r	   r
   Úidentê   s   zBaseProcess.identc                 C   s*   |   ¡  z| jW S  ty   tdƒd‚w )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)r>   rB   ÚAttributeErrorr=   r   r	   r	   r
   rA   ÷   s   
ÿzBaseProcess.sentinelc                 C   sè   d }| t u r	d}n&| jrd}n | jt ¡ krd}n| jd u r!d}n| j ¡ }|d ur-d}nd}t| ƒjd| j	 g}| jd urG| 
d| jj ¡ | 
d| j ¡ | 
|¡ |d uret ||¡}| 
d	| ¡ | jrm| 
d
¡ dd |¡ S )NZstartedÚclosedÚunknownÚinitialZstoppedzname=%rzpid=%sz	parent=%szexitcode=%sr   z<%s>ú )r   r+   r(   r&   r'   r   r   r1   r2   r4   ÚappendrT   Ú_exitcode_to_namer@   r   r3   )r   rS   ÚstatusÚinfor	   r	   r
   Ú__repr__  s0   




zBaseProcess.__repr__c              
   C   sÖ  ddl m}m} zÒzT| jd ur| | j¡ t d¡atƒ a	| 
¡  t}| at| j| j|ƒatjr6t ¡  ¡  z|j ¡  | ¡  W ~n~w | d¡ z|  ¡  d}W | ¡  n| ¡  w W nY tyŽ } z%|jd u rmd}nt|jtƒrw|j}ntj  t!|jƒd ¡ d}W Y d }~n?d }~w   d}dd l"}tj  d| j# ¡ | $¡  Y W t %¡  | d| ¡ | &¡  |S W t %¡  | d| ¡ | &¡  |S W t %¡  | d| ¡ | &¡  |S t %¡  | d| ¡ | &¡  w )Né   )ÚutilÚcontextz child process calling self.run()r   Ú
zProcess %s:
z process exiting with exitcode %d)'Ú ra   rb   Z_start_methodZ_force_start_methodÚ	itertoolsr;   r"   Úsetr   Z_close_stdinr   Ú_ParentProcessr*   r(   r   Ú	threadingZ_HAVE_THREAD_NATIVE_IDZmain_threadZ_set_native_idZ_finalizer_registryÚclearZ_run_after_forkersr^   r?   Z_exit_functionÚ
SystemExitÚcoderP   ÚintÚsysÚstderrÚwriter   Ú	tracebackr)   Ú	print_excZ	_shutdownZ_flush_std_streams)r   Zparent_sentinelra   rb   Zold_processrS   Úerp   r	   r	   r
   Ú
_bootstrap"  sj   


ÿ



€í€üü
zBaseProcess._bootstrapr   )r2   Ú
__module__Ú__qualname__Ú__doc__r   r<   r>   r?   rC   rE   rG   r3   rL   rM   Úpropertyr)   Úsetterr   rQ   rS   rU   rT   rA   r_   rs   r	   r	   r	   r
   r   G   sF    ÿ







	


r   c                   @   s   e Zd Zdd„ ZdS )rR   c                 C   s,   ddl m} |ƒ d u rtdƒ‚tt| ƒffS )Nr`   )Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rb   ry   Ú	TypeErrorrR   Úbytes)r   ry   r	   r	   r
   Ú
__reduce__X  s   
ÿzAuthenticationString.__reduce__N)r2   rt   ru   r|   r	   r	   r	   r
   rR   W  s    rR   c                   @   s6   e Zd Zdd„ Zdd„ Zedd„ ƒZd
dd	„ZeZdS )rg   c                 C   s4   d| _ || _|| _d | _d | _d| _|| _i | _d S )Nr	   F)r#   r4   Ú_pidr(   r   r+   rB   r$   )r   r)   rT   rA   r	   r	   r
   r<   h  s   
z_ParentProcess.__init__c                 C   s   ddl m} || jgdd S )Nr   ©rH   ©rI   ©Zmultiprocessing.connectionrH   rB   )r   rH   r	   r	   r
   rL   r  s   z_ParentProcess.is_alivec                 C   rN   r   )r}   r   r	   r	   r
   rU   v  rO   z_ParentProcess.identNc                 C   s    ddl m} || jg|d dS )z6
        Wait until parent process terminates
        r   r~   r   Nr€   )r   rI   rH   r	   r	   r
   r3   z  s   z_ParentProcess.joinr   )	r2   rt   ru   r<   rL   rw   rU   r3   rT   r	   r	   r	   r
   rg   f  s    


rg   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_MainProcessc                 C   s8   d| _ d| _d | _d | _d| _tt d¡ƒddœ| _d S )Nr	   ZMainProcessFé    z/mp)rQ   Z	semprefix)	r#   r4   r(   r   r+   rR   r&   Úurandomr$   r   r	   r	   r
   r<   ‰  s   ÿz_MainProcess.__init__c                 C   s   d S r   r	   r   r	   r	   r
   rM   ›  r   z_MainProcess.closeN)r2   rt   ru   r<   rM   r	   r	   r	   r
   r   ‡  s    r   r`   é   ZSIGÚ_r   )$Ú__all__r&   rm   Úsignalre   rh   Z_weakrefsetr   ÚpathÚabspathÚgetcwdZORIGINAL_DIRÚOSErrorr   r   r   r   Úobjectr   r{   rR   rg   r   r   r   r;   r"   rf   r   r\   r   Ú__dict__Úitemsr)   Zsignumr5   r	   r	   r	   r
   Ú<module>   sB   	ÿ

  !
€
