o
    Df/+                     @   s6  d dl 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 d dlm	Z
 z
e je  ZW n ey9   dZY nw g dZdd Zdd Zd	d
 Zdd ZefddZG dd dZG dd deZG dd deZe aedae a[eZi Z ej!" D ]\Z#Z$e#dd dkrde#vre#e e$ < qe Z%dS )    N)WeakSetprocess)BaseProcessProcesscurrent_processactive_childrenc                   C      t S )z@
    Return process object representing the current process
    )_current_process r   r   I/home/ubuntu/webapp/venv/lib/python3.10/site-packages/billiard/process.pyr   #   s   r   c                 C   s   |  a t_ d S N)r
   _mprocr   r   r   r   _set_current_process*   s   r   c                  C   s*   t tD ]} | j d urt|  qd S r   )list	_children_popenpolldiscard)pr   r   r   _cleanup/   s
   
r   c              
   C   s*   z|    W d S  tttfy   Y d S w r   )flushAttributeErrorEnvironmentErrorNotImplementedError)fr   r   r   _maybe_flush6   s
   r   c                 C   s(   z|   W ttS  t y   g  Y S w )zN
    Return list of process objects corresponding to live child processes
    )	TypeErrorr   r   )r   r   r   r   r   =   s   r   c                   @   s2  e Zd ZdZdd Zddddi dfddZdd	 Zd
d Zdd Zdd Z	dd Z
d5d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ed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zd1d2 Zd3d4 ZdS )6r   z
    Process objects represent activity that is run in a separate process

    The class is analogous to `threading.Thread`
    c                 C   s   t  r   )r   selfr   r   r   _PopenP   s   zBaseProcess._PopenNr   c           	      K   s   |d u sJ dt t}tj|f | _tj | _t | _d | _	|| _
t|| _t|| _|pAt| jd ddd | jD  | _|d urJ|| _td urSt|  d| _d S )Nz#group argument must be None for now-:c                 s   s    | ]}t |V  qd S r   )str).0ir   r   r   	<genexpr>`   s    z'BaseProcess.__init__.<locals>.<genexpr>F)next_process_counterr
   	_identity_configcopyosgetpid_parent_pidr   _targettuple_argsdict_kwargstype__name__join_namedaemon	_danglingadd_controlled_termination)	r   grouptargetnameargskwargsr8   _kwcountr   r   r   __init__S   s$   




zBaseProcess.__init__c                 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/   r1   r3   r   r   r   r   runi   s   zBaseProcess.runc                 C   sR   | j du s	J d| jt ks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 process)
r   r.   r,   r-   r   r    sentinel	_sentinelr   r:   r   r   r   r   startp   s   
zBaseProcess.startc                 C   s   | j d ur| j   d S d S r   )r   closer   r   r   r   rH   |   s   
zBaseProcess.closec                 C   s   | j   dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   	terminater   r   r   r   rI      s   zBaseProcess.terminatec                 C   s   d| _ |   d S )NT)r;   rI   r   r   r   r   terminate_controlled   s   z BaseProcess.terminate_controlledc                 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   waitr   r   rH   )r   timeoutresr   r   r   r6      s   
zBaseProcess.joinc                 C   sF   | t u rdS | jt ksJ d| jdu rdS | j  | jjdu S )z1
        Return whether process is alive
        Tzcan only test a child processNF)r
   r.   r,   r-   r   r   
returncoder   r   r   r   is_alive   s   

zBaseProcess.is_alivec                 C   s   | j d u rdS | j  d u S )NFr   r   r   r   r   r   	_is_alive   s   
zBaseProcess._is_alivec                 C      | j S r   )r7   r   r   r   r   r>      s   zBaseProcess.namec                 C   s   t |ts	J d|| _d S )Nzname must be a string)
isinstancer#   r7   )r   r>   r   r   r   r>      s   
c                 C   s   | j ddS )z4
        Return whether process is a daemon
        r8   Fr*   getr   r   r   r   r8      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 startedr8   )r   r*   )r   daemonicr   r   r   r8      s   c                 C   s
   | j d S )Nauthkey)r*   r   r   r   r   rW      s   
zBaseProcess.authkeyc                 C   s   t || jd< dS )z2
        Set authorization key of process
        rW   N)AuthenticationStringr*   )r   rW   r   r   r   rW      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
        NrP   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   pidr   r   r   r   ident   s   zBaseProcess.identc                 C   s    z| j W S  ty   tdw )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not started)rF   r   
ValueErrorr   r   r   r   rE      s
   zBaseProcess.sentinelc                 C   r	   r   )r(   r   r   r   r   _counter      zBaseProcess._counterc                 C   r	   r   )r   r   r   r   r   r      r^   zBaseProcess._childrenc                 C   rR   r   )rW   r   r   r   r   _authkey      zBaseProcess._authkeyc                 C   rR   r   )r8   r   r   r   r   	_daemonic   r`   zBaseProcess._daemonicc                 C   s   | j dS )NtempdirrT   r   r   r   r   _tempdir   s   zBaseProcess._tempdirc                 C   s   | t u rd}n| jt krd}n| jd u rd}n| j d ur$| j}nd}t|tu r;|dkr3d}ndt	
|| }dt| j| j|| jrHdpId	f S )
Nstartedunknowninitialr   stoppedzstopped[%s]z<%s(%s, %s%s)>z daemon )r
   r.   r,   r-   r   r   rY   r4   int_exitcode_to_namerU   r5   r7   r8   )r   statusr   r   r   __repr__  s    
zBaseProcess.__repr__c                 C   s  ddl m}m} z7z| jd ur|| j tdat a	t
jd ur=zt
j  ttjt
_W n tttfy<   Y nw t}t|  tjjj}t| }|d  |D ]}|rat|| tjsnt|jD ]}|   qgqUt!" t_#z|j$%  |&  W ~n~w |'d| j( z| )  d}W |*  n|*  w W ny t+y }	 z8|	j,sd}n,t|	j,d t-r|	j,d }nt
j./t0|	j,d d  t1t
j. t|	j,d t0rdnd}W Y d }	~	nOd }	~	w   d}|j2d| j3ddsdd l4}
t
j./d	| j3  |
5  Y W |'d
| j(| t1t
j6 t1t
j. |S W |'d
| j(| t1t
j6 t1t
j. |S W |'d
| j(| t1t
j6 t1t
j. |S |'d
| j(| t1t
j6 t1t
j. w )N   )utilcontextz#child process %s calling self.run()r   
z
Process %sT)exc_infozProcess %s:
z#process %s exiting with exitcode %d)7rh   rn   ro   _start_method_force_start_method	itertoolsrB   r(   setr   sysstdinrH   openr,   devnullr   OSErrorr\   r
   r   loggingLoggermanager
loggerDictr   keysappendrS   PlaceHolder	getLoggerhandlers
createLock	threadingRLock_lock_finalizer_registryclear_run_after_forkersinforZ   rD   _exit_function
SystemExitr?   ri   stderrwriter#   r   errorr>   	traceback	print_excstdout)r   rn   ro   old_processr~   logger_namesr>   handlerrY   excr   r   r   r   
_bootstrap  s   

















zBaseProcess._bootstrapr   )r5   
__module____qualname____doc__r    rC   rD   rG   rH   rI   rJ   r6   rO   rQ   propertyr>   setterr8   rW   rY   r[   rZ   rE   r]   r   r_   ra   rc   rl   r   r   r   r   r   r   I   sZ    









	






r   c                   @      e Zd Zdd ZdS )rX   c                 C   s,   ddl m} | d u rtdtt| ffS )Nrm   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)ro   r   r   rX   bytes)r   r   r   r   r   
__reduce__e  s   
zAuthenticationString.__reduce__N)r5   r   r   r   r   r   r   r   rX   c      rX   c                   @   r   )_MainProcessc                 C   s2   d| _ d| _d | _d | _ttddd| _d S )Nr   MainProcess    z/mp)rW   	semprefix)r)   r7   r.   r   rX   r,   urandomr*   r   r   r   r   rC   u  s   z_MainProcess.__init__N)r5   r   r   rC   r   r   r   r   r   s  r   r   rm      SIG_)&r,   rv   signalrt   r{   r   _weakrefsetr   multiprocessingr   r   pathabspathgetcwdORIGINAL_DIRrz   __all__r   r   r   r   r   r   r   rX   r   r
   rB   r(   ru   r   r   rj   __dict__itemsr>   signumr9   r   r   r   r   <module>   sF     



