U
    ){f{                     @  s   d dl m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
 d dlmZ d dlmZ d dlmZ d d	lmZmZ d
dlmZmZ d
dlmZ d
dlmZmZmZmZ dddddZddddddddddZdddddZ dS )    )annotationsN)get_context)wait)BaseContext)BaseProcess)Event)PicklingError)AnyList   )ConfigSockets)
WorkerFunc)check_for_updatesfiles_to_watchload_applicationwrite_pid_filer   int)configreturnc                   sF  | j d k	rt| j  | jdkr0ddlm} |}nJ| jdkrLddlm} |}n.| jdkrhddlm} |}ntd| j d	| 	 }| j
r| jd
krtdd
}| jd
kr|| | n| j
rt| j| j td}d | ddd fdd}g }	 rttjtj t|	| ||| dD ]$}
tt|
r$ttt|
| q$| j
rt }tdd |	D dd}t|}|r  |	D ]}|  q  qt|d
krXqΐqXntdd |	D  t|	}|d
kr  d q|	D ]}|   q|d
krt|	n|}|j!D ]}|"  q|j#D ]}|"  q2|S )Nasyncior   )asyncio_workerZuvloop)uvloop_workerZtrio)trio_workerzNo worker of class z existsr   zCannot reload without workersspawnTr	   None)argsr   c                    s      d d S )NF)set)r   activeshutdown_event L/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/run.pyshutdown:   s    zrun.<locals>.shutdown>   SIGTERMSIGBREAKSIGINTc                 s  s   | ]}|j V  qd S Nsentinel.0processr!   r!   r"   	<genexpr>O   s     zrun.<locals>.<genexpr>)timeoutc                 s  s   | ]}|j V  qd S r'   r(   r*   r!   r!   r"   r-   Z   s     F)$Zpid_pathr   Zworker_classZasyncio.runr   r   Ztrio.runr   
ValueErrorZcreate_socketsZuse_reloaderworkersRuntimeErrorr   Zapplication_pathZwsgi_max_body_sizer   r   signalr&   SIG_IGN	_populatehasattrgetattrr   r   r   r   joinclearlen_join_exited	terminateZsecure_socketscloseZinsecure_sockets)r   r   worker_funcr   r   socketsexitcodectxr#   	processesZsignal_namefilesfinishedupdatedr,   sockr!   r   r"   run   sp    








rF   zList[BaseProcess]r   r   	EventTyper   r   )rA   r   r=   r>   r    r@   r   c           	      C  s   t |jt|  D ]z}|j||||dd}d|_z|  W n, tk
rj } ztd|W 5 d }~X Y nX | | t	
 dkrtd qd S )N)r   r    r>   )targetkwargsTz\Cannot pickle the config, see https://docs.python.org/3/library/pickle.html#pickle-picklableWindowsg?)ranger0   r9   Processdaemonstartr   r1   appendplatformsystemtimesleep)	rA   r   r=   r>   r    r@   _r,   errorr!   r!   r"   r4   o   s"    

r4   )rA   r   c                 C  sP   d}t tt| D ]6}| | }|jd k	r|  |dkr@|jn|}| |= q|S )Nr   )reversedrK   r9   r?   r7   )rA   r?   indexZworkerr!   r!   r"   r:      s    
r:   )!
__future__r   rP   r2   rR   multiprocessingr   Zmultiprocessing.connectionr   Zmultiprocessing.contextr   Zmultiprocessing.processr   Zmultiprocessing.synchronizer   rG   pickler   typingr	   r
   r   r   r   r   utilsr   r   r   r   rF   r4   r:   r!   r!   r!   r"   <module>   s    \