
    gS                    
   d dl m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 d dl	m
Z
mZ d dlZd dlmZ d dlmZ d d	                                D             Z ej        d
          Z G d d          Z G d d          ZdS )    )annotationsN)Pipe)socket)AnyCallable)get_subprocess)Configc                p    i | ]3}t          t          d |           t          t          d |           |4S )SIG)hasattrsignalgetattr).0xs     R/var/www/html/env/lib/python3.11/site-packages/uvicorn/supervisors/multiprocess.py
<dictcomp>r      sP       	vyQyy!!FI!II      z1INT TERM BREAK HUP QUIT TTIN TTOU USR1 USR2 WINCHzuvicorn.errorc                  |    e Zd Zdd	ZdddZddZddZd d!dZdddZddZ	ddZ
ddZddZed"d            ZdS )#Processconfigr	   target%Callable[[list[socket] | None], None]socketslist[socket]returnNonec                    || _         t                      \  | _        | _        t	          || j        |          | _        d S N)real_targetr   parent_conn
child_connr   r   process)selfr   r   r   s       r   __init__zProcess.__init__   s8     ",0FF)$/%fdk7CCr      timeoutfloatboolc                    | j                             d           | j                             |          r| j                                          dS dS )Ns   pingTF)r    sendpollrecvr#   r&   s     r   pingzProcess.ping%   sQ    g&&&  )) 	!!###4ur   c                l    | j                                          | j                             d           d S )Ns   pong)r!   r,   r*   r#   s    r   pongzProcess.pong,   s2    W%%%%%r   c                .    	 |                                   r   )r1   r0   s    r   always_pongzProcess.always_pong0   s    	IIKKK	r   Nlist[socket] | Noner   c                    t           j        dk    r t          j        t          j        d            t	          j        | j        d                                           |                     |          S )Nntc                >    t          j        t           j                  S r   )r   raise_signalSIGTERM)sigframes     r   <lambda>z Process.target.<locals>.<lambda>;   s    6#6v~#F#F r   T)r   daemon)	osnamer   SIGBREAK	threadingThreadr3   startr   )r#   r   s     r   r   zProcess.target4   si    7d?? MFF  
 	 0>>>DDFFF(((r   c                b    | j                                         sdS |                     |          S )NF)r"   is_aliver.   r-   s     r   rE   zProcess.is_aliveA   s/    |$$&& 	5yy!!!r   c                8    | j                                          d S r   )r"   rC   r0   s    r   rC   zProcess.startG   s    r   c                   | j         j        | j         j        J t          j        dk    r*t          j        | j         j        t          j                   n)t          j        | j         j        t          j                   t          
                    d| j         j         d           | j                                         | j                                         d S d S )Nr6   zTerminated child process [])r"   exitcodepidr>   r?   killr   CTRL_BREAK_EVENTr9   loggerinfor    closer!   r0   s    r   	terminatezProcess.terminateJ   s    < (<#///w$ (&*ABBBB(&.999KKHT\5EHHHIII""$$$O!!##### )(r   c                8    | j                                          d S r   )r"   rK   r0   s    r   rK   zProcess.killX   s     	r   c                    t                               d| j        j         d           | j                                         d S )NzWaiting for child process [rH   )rM   rN   r"   rJ   joinr0   s    r   rS   zProcess.join]   s?    E$,2BEEEFFFr   
int | Nonec                    | j         j        S r   )r"   rJ   r0   s    r   rJ   zProcess.pida   s    |r   r   r	   r   r   r   r   r   r   )r%   )r&   r'   r   r(   r   r   r   )r   r4   r   r   )r   rT   )__name__
__module____qualname__r$   r.   r1   r3   r   rE   rC   rP   rK   rS   propertyrJ    r   r   r   r      s       	D 	D 	D 	D    & & & &   ) ) ) ) )" " " " "   $ $ $ $   
          X     r   r   c                  ~    e Zd Zdd	Zdd
ZddZddZddZddZddZ	ddZ
ddZddZddZddZddZddZdS )Multiprocessr   r	   r   r   r   r   r   r   c                     | _         | _        | _        |j         _        g  _        t          j                     _        g  _	        t          D ]}t          j        | fd           d S )Nc                8    j                             |           S r   )signal_queueappend)r:   r;   r#   s     r   r<   z'Multiprocess.__init__.<locals>.<lambda>x   s    $2C2J2J32O2O r   )r   r   r   workersprocesses_num	processesrA   Eventshould_exitra   SIGNALSr   )r#   r   r   r   r:   s   `    r   r$   zMultiprocess.__init__g   s     #^(*$?,,') 	Q 	QCM#OOOOPPPP	Q 	Qr   c                    t          | j                  D ]P}t          | j        | j        | j                  }|                                 | j                            |           Qd S r   )	rangerd   r   r   r   r   rC   re   rb   )r#   _r"   s      r   init_processeszMultiprocess.init_processesz   sc    t)** 	+ 	+Adk4;EEGMMOOON!!'****	+ 	+r   c                B    | j         D ]}|                                 d S r   )re   rP   r#   r"   s     r   terminate_allzMultiprocess.terminate_all   s2    ~ 	  	 G	  	 r   c                B    | j         D ]}|                                 d S r   )re   rS   rn   s     r   join_allzMultiprocess.join_all   s,    ~ 	 	GLLNNNN	 	r   c                   t          | j                  D ]k\  }}|                                 |                                 t	          | j        | j        | j                  }|                                 || j        |<   ld S r   )		enumeratere   rP   rS   r   r   r   r   rC   )r#   idxr"   new_processs       r   restart_allzMultiprocess.restart_all   s    %dn55 	. 	.LCLLNNN!$+t{DLIIK"-DN3	. 	.r   c                *   dt          j                     d}d                    t          j        t          t          j                              dd                    }t                              |d|i           |                                  | j	        
                    d	          sB|                                  |                                  | j	        
                    d	          B|                                  |                                  d
t          j                     d}d                    t          j        t          t          j                              dd                    }t                              |d|i           d S )NzStarted parent process [rH   zStarted parent process [{}]cyanT)fgboldcolor_message)extrag      ?zStopping parent process [zStopping parent process [{}])r>   getpidformatclickstylestrrM   rN   rl   rg   waithandle_signalskeep_subprocess_alivero   rq   )r#   messager{   s      r   runzMultiprocess.run   s]   ;RY[[;;;5<<U[RY[[IYIY^dko=p=p=pqqGO]#CDDD"'',, 	)!!!&&((( "'',, 	) 	<bikk<<<6==ek#bikkJZJZ_elp>q>q>qrrGO]#CDDDDDr   c                   | j                                         rd S t          | j                  D ]\  }}|                                r|                                 |                                 | j                                         r d S t                              d|j	         d           t          | j        | j        | j                  }|                                 || j        |<   d S )NzChild process [z] died)rg   is_setrs   re   rE   rK   rS   rM   rN   rJ   r   r   r   r   rC   )r#   rt   r"   s      r   r   z"Multiprocess.keep_subprocess_alive   s    ""$$ 	F%dn55 	* 	*LC!! LLNNNLLNNN&&(( KK='+===>>>dk4;EEGMMOOO")DN3	* 	*r   c                $   t          | j                  D ]z}| j                            |           t          |         }t	          | d|                                 d           }| |             \t                              d| d           {d S )Nhandle_zReceived signal z#, but no handler is defined for it.)tuplera   removerh   r   lowerrM   debug)r#   r:   sig_namesig_handlers       r   r   zMultiprocess.handle_signals   s    *++ 	_ 	_C$$S)))s|H!$(D(..2B2B(D(DdKKK&]]]]^^^^	_ 	_r   c                l    t                               d           | j                                         d S )NzReceived SIGINT, exiting.rM   rN   rg   setr0   s    r   
handle_intzMultiprocess.handle_int   s0    /000r   c                l    t                               d           | j                                         d S )NzReceived SIGTERM, exiting.r   r0   s    r   handle_termzMultiprocess.handle_term   s0    0111r   c                l    t                               d           | j                                         d S )NzReceived SIGBREAK, exiting.r   r0   s    r   handle_breakzMultiprocess.handle_break   s0    1222r   c                b    t                               d           |                                  d S )Nz&Received SIGHUP, restarting processes.)rM   rN   rv   r0   s    r   
handle_hupzMultiprocess.handle_hup   s-    <===r   c                    t                               d           | xj        dz  c_        t          | j        | j        | j                  }|                                 | j        	                    |           d S )Nz5Received SIGTTIN, increasing the number of processes.   )
rM   rN   rd   r   r   r   r   rC   re   rb   rn   s     r   handle_ttinzMultiprocess.handle_ttin   si    KLLLa$+t{DLAAg&&&&&r   c                *   t                               d           | j        dk    rt                               d           d S | xj        dz  c_        | j                                        }|                                 |                                 d S )Nz1Received SIGTTOU, decreasing number of processes.r   zMAlready reached one process, cannot decrease the number of processes anymore.)rM   rN   rd   re   poprP   rS   rn   s     r   handle_ttouzMultiprocess.handle_ttou   s    GHHH""KKghhhFa.$$&&r   NrV   rW   )rX   rY   rZ   r$   rl   ro   rq   rv   r   r   r   r   r   r   r   r   r   r\   r   r   r^   r^   f   s8       Q Q Q Q&+ + + +          . . . .E E E E$* * * *&_ _ _ _            ' ' ' '     r   r^   )
__future__r   loggingr>   r   rA   multiprocessingr   r   typingr   r   r   uvicorn._subprocessr   uvicorn.configr	   splitrh   	getLoggerrM   r   r^   r\   r   r   <module>r      sR   " " " " " "  				                                         . . . . . . ! ! ! ! ! ! @FFHH   
	?	+	+J  J  J  J  J  J  J  J Zx x x x x x x x x xr   