U
    )–€h{  ã                   @  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rštdƒ‚d
}| jd
kr¶|| |ƒ �nŒ| j
rÊt| j| jƒ tdƒ}d‰ | ¡ ‰dddœ‡ ‡fdd„}g }	ˆ �rìt tjtj¡ t|	| ||ˆ|ƒ dD ]$}
tt|
ƒ�r$t tt|
ƒ|¡ �q$| j
�r¼tƒ }tdd„ |	D ƒdd�}t|ƒ}|�r¤ˆ ¡  |	D ]}| ¡  �qˆˆ ¡  �qÎt|ƒ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 )NZ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© ú1/tmp/pip-unpacked-wheel-mge4popt/hypercorn/run.pyÚshutdown:   s    zrun.<locals>.shutdown>   ÚSIGTERMÚSIGINTÚSIGBREAKc                 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    








rE   zList[BaseProcess]r   r   Ú	EventTyper   r   )r@   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š™™™™™¹?)Úranger/   r8   ÚProcessÚdaemonÚstartr   r0   ÚappendÚplatformÚsystemÚtimeÚsleep)	r@   r   r<   r=   r   r?   Ú_r+   Úerrorr    r    r!   r3   o   s"    
þÿþ
r3   )r@   r   c                 C  sP   d}t tt| ƒƒƒD ]6}| | }|jd k	r| ¡  |dkr@|jn|}| |= q|S )Nr   )ÚreversedrJ   r8   r>   r6   )r@   r>   ÚindexZworkerr    r    r!   r9   ˆ   s    
r9   )!Ú
__future__r   rO   r1   rQ   Úmultiprocessingr   Zmultiprocessing.connectionr   Zmultiprocessing.contextr   Zmultiprocessing.processr   Zmultiprocessing.synchronizer   rF   Úpickler   Útypingr	   r
   r   r   r   r   Úutilsr   r   r   r   rE   r3   r9   r    r    r    r!   Ú<module>   s    \