HEX
Server: nginx/1.24.0
System: Linux prod-btpayments-io 6.14.0-1018-aws #18~24.04.1-Ubuntu SMP Mon Nov 24 19:46:27 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.3.19
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/supervisor/__pycache__/process.cpython-312.pyc
�

�1�c�����ddlZddlZddlZddlZddlZddlZddlZddlmZddlm	Z	ddlm
Z
ddlmZddlm
ZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZmZddlmZddlmZddlmZddlm Z ejBGd�de"��Z#Gd�de#�Z$ejBGd�de"��Z%Gd�de%�Z&Gd�de&�Z'Gd�de%�Z(Gd�de"�Z)e)�Z)d �Z*y)!�N)�maxint)�as_bytes)�	as_string)�PY2)�asyncore_25)�
ProcessStates)�SupervisorStates)�getProcessStateDescription)�STOPPED_STATES)�decode_wait_status)�signame)�ProcessException�
BadCommand)�EventListenerStates)�events)�RestartUnconditionally)�
SocketManagerc�Z�eZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZdZdZdZd�Zd�Zd�Zd�Zd	�Zd
�Zej:ej>ej@ejBejDejFejHejJejLejNejPejRejTejVejXejZiZ.dd�Z/d�Z0d
�Z1d�Z2d�Z3d�Z4d�Z5d�Z6d�Z7d�Z8d�Z9d�Z:d�Z;d�Z<d�Z=d�Z>d�Z?d�Z@d�ZAd�ZBy) �
SubprocesszA class to manage a subprocess.rNFc�X�||_i|_i|_tj|_y)zDConstructor.

        Argument is a ProcessConfig instance.
        N)�config�dispatchers�pipesr�STOPPED�state��selfrs  �4/usr/lib/python3/dist-packages/supervisor/process.py�__init__zSubprocess.__init__;s'��
��������
�"�*�*��
�c�|�|jj�D]}t|d�s�|j��!y)N�
removelogs)r�values�hasattrr"�r�
dispatchers  rr"zSubprocess.removelogsE�6���*�*�1�1�3�	(�J��z�<�0��%�%�'�	(r c�|�|jj�D]}t|d�s�|j��!y)N�
reopenlogs)rr#r$r)r%s  rr)zSubprocess.reopenlogsJr'r c���|jj�D]C}|j�r|j�|j	�s�4|j��Ey�N)rr#�readable�handle_read_event�writable�handle_write_eventr%s  r�drainzSubprocess.drainOsR���*�*�1�1�3�	0�J�
�"�"�$��,�,�.��"�"�$��-�-�/�	0r c�r�|jr|jrttjd��|j
d}|�ttjd��|j|}|jrttjd��|xj|z
c_|j�y)NzProcess already closed�stdinzProcess has no stdin channelz Process' stdin channel is closed)
�pid�killing�OSError�errno�EPIPErr�closed�input_buffer�flush)r�chars�stdin_fdr&s    r�writezSubprocess.writeZs����x�x�4�<�<��%�+�+�'?�@�@��:�:�g�&�����%�+�+�'E�F�F��%�%�h�/�
�����%�+�+�'I�J�J����5�(�����r c	���	tj|jj�}|r|d}ntd��d|vr)|}	|jjj|�}ns|jj�}d}d}|D]I}tjj||�}	|jjj|�}n|�|}n|}|jjj|||�||fS#t$r3}td|jj�dt
|�����d}~wwxYw#t$rd}Y�wwxYw#t$rY��wxYw)z�Internal: turn a program name into a file name, using $PATH,
        make sure it exists / is executable, raising a ProcessException
        if not zcan't parse command �: Nrzcommand is empty�/)�shlex�splitr�command�
ValueErrorr�str�options�statr5�get_path�os�path�join�check_execv_args)	r�commandargs�e�program�filename�strJ�found�dirs	         r�get_execv_argszSubprocess.get_execv_argsisc��	/��+�+�d�k�k�&9�&9�:�K�
�!�!�n�G��/�0�0��'�>��H�
��[�[�(�(�-�-�h�7��
�;�;�'�'�)�D��E��B��
�������S�'�2������,�,�1�1�%�8�B��
��z�"�� ��
	
�����,�,�X�{�B�G���$�$��M�	/�����$�$�c�!�f�.�/�
/��	/���
���
������s;�)D	�%E�/%E�		E�.E�E�E�E�	E%�$E%c�N�|j}||ury||_|tjk(r=tj�}|xjdz
c_||jz|_|jj|�}|� ||||�}tj|�yy)NF�)
rr�BACKOFF�time�backoff�delay�	event_map�getr�notify)r�	new_state�expected�	old_state�now�event_class�events       r�change_statezSubprocess.change_state�s����J�J�	��	�!����
��
�-�-�-��)�)�+�C��L�L�A��L��t�|�|�+�D�J��n�n�(�(��3���"���i��:�E��M�M�%� �#r c���|j|vrgt|j�}djtt|��}t	|j
j�}td|�d|�d|����y)N� zAssertion failed for r?z not in )rr
rK�maprr�name�AssertionError)r�states�
current_state�allowable_states�processnames     r�_assertInStatezSubprocess._assertInState�sf���:�:�V�#�6�t�z�z�B�M�"�x�x��,F��(O�P��#�D�K�K�$4�$4�5�K� ��]�,<�">�?�
?�	$r c�v�||_|jjjj	d|z�y)Nzspawnerr: %s)�spawnerrrrF�logger�info�r�msgs  r�record_spawnerrzSubprocess.record_spawnerr�s,����
������"�"�'�'���(<�=r c�(�|jj}t|jj�}|jr!d|z}|j
j
|�yd|_d|_d|_	d|_
d|_tj�|_
|jtj tj"tj$tj&�|j)tj*�	|j-�\}}	|jj5|�\|_|_	|jG�}	|	dk7r|jO|	�S|jQ||�S#t.$rf}|j1|j2d�|jtj*�|j)tj$�Yd}~yd}~wwxYw#t:t<f$r�}|j2d}|t>j@k(rd|z}n&d|�dt>jBjE||���}|j1|�|jtj*�|j)tj$�Yd}~yd}~wwxYw#t:$r�}|j2d}|t>jHk(rd|z}n&d	|�dt>jBjE||���}|j1|�|jtj*�|j)tj$�|jK|j8�|jM|j8�Yd}~yd}~wwxYw)
z�Start the subprocess.  It must not be running already.

        Return the process id.  If the fork() call fails, return None.
        zprocess '%s' already runningNFrz!too many open files to spawn '%s'z&unknown error making dispatchers for 'z': z1Too many processes in process table to spawn '%s'zunknown error during fork for '))rrFrrhr3rq�warnr4rp�
exitstatus�system_stop�administrative_stoprX�	laststartrnr�EXITED�FATALrWrrd�STARTINGrTrru�args�make_dispatchersrrr5�IOErrorr6�EMFILE�	errorcoder\�fork�EAGAIN�close_parent_pipes�close_child_pipes�_spawn_as_parent�_spawn_as_child)
rrFrmrtrP�argv�what�why�coder3s
          r�spawnzSubprocess.spawn�s���
�+�+�%�%������ 0� 0�1���8�8�2�[�@�C��N�N����$�������
���� ���#(�� ����������M�0�0�-�2E�2E�)�1�1�=�3H�3H�	J�	
���-�0�0�1�	�!�0�0�2�N�H�d�
	�+/�;�;�+G�+G��+M�(�D��d�j�	��,�,�.�C�"�!�8��(�(��-�-��'�'��$�7�7��W �	�� � ����1��.����
� 6� 6�7����m�3�3�4���		����!�	��8�8�A�;�D��u�|�|�#�;�k�I��$�
"�5�?�?�#6�#6�t�T�#B�D��� � ��%����
� 6� 6�7����m�3�3�4���	���	��8�8�A�;�D��u�|�|�#�M�#�$��$�"�5�?�?�#6�#6�t�T�#B�D��� � ��%����
� 6� 6�7����m�3�3�4��&�&�t�z�z�2��%�%�d�j�j�1���	�sK�F�(G2�J+�	G/�	AG*�*G/�2J(�BJ#�#J(�+	N�4CN�Nc�~�||_|jj}|j|j�|j
j
dt|jj��d|���d|_	tj�|jjz|_||j|<|S)Nz
spawned: 'z' with pid )r3rrFr�rrqrrrrhrprX�	startsecsrZ�
pidhistory)rr3rFs   rr�zSubprocess._spawn_as_parents�������+�+�%�%���!�!�$�*�*�-������Y�t�{�{�GW�GW�=X�Z]�^�_���
��Y�Y�[�4�;�;�#8�#8�8��
�"&����3���
r c��|jj}|j|jdd�|j|jdd�|jjr |j|jdd�n|j|jdd�td|j�D]}|j|��y)N�child_stdinr�child_stdoutrV��child_stderr�)rrF�dup2r�redirect_stderr�range�minfds�close_fd)rrF�is   r�_prepare_child_fdszSubprocess._prepare_child_fdss����+�+�%�%�����T�Z�Z�
�.��2����T�Z�Z��/��3��;�;�&�&��L�L����N�3�Q�7��L�L����N�3�Q�7��q�'�.�.�)�	 �A����Q��	 r c�6�|jj}	|j�|j�|j	�}|rY|jj
}d|�d|�d�}|j
dd|z�	|j
dd�|jd�ytjj�}d|d	<|jj}|� |jjj}|r||d
<|jj|d<|jr#|jjj|d<|jj�%|j|jj�|jj }		|	�|j#|	�	|jj.�%|j1|jj.�|j3|||�|j
dd�|jd�y#t$$r�}
t&j(j+|
j,d
|
j,d
�}d|	�d|�d�}|j
dd|z�Yd}
~
|j
dd�|jd�yd}
~
wwxYw#t$$rf}
t&j(j+|
j,d
|
j,d
�}d|d
�d|�d�}|j
dd|z�Yd}
~
��d}
~
wt5j6�\\}}
}}}}|�d|�d|�d|��}d|�d|�d�}|j
dd|z�Y��oxYw#|j
dd�|jd�wxYw)Nzcouldn't setuid to r?�
r�zsupervisor: z*supervisor: child process was not spawned
��1�SUPERVISOR_ENABLED�SUPERVISOR_SERVER_URL�SUPERVISOR_PROCESS_NAME�SUPERVISOR_GROUP_NAMErzcouldn't chdir to zcouldn't exec z, z: file: z line: )rrF�setpgrpr��set_uid�uidr=�_exitrI�environ�copy�	serverurlrh�group�environment�update�	directory�chdirr5r6r�r\r�umask�setumask�execve�asyncore�compact_traceback)rrPr�rF�
setuid_msgr�rt�envr��cwdr�r��file�fun�line�t�v�tbinfo�errors                   rr�zSubprocess._spawn_as_childs����+�+�%�%��C	�
�O�O���#�#�%�����J���k�k�o�o��7:�J�G���
�
�a��#�!5�6��\
�M�M�!�J�K��M�M�#��Y�*�*�/�/�#�C�(+�C�$�%����-�-�I�� � �K�K�/�/�9�9�	��/8��+�,�-1�[�[�-=�-=�C�)�*��z�z�/3�z�z�/@�/@�/E�/E��+�,��{�{�&�&�2��
�
�4�;�;�2�2�3��+�+�'�'�C�
��?��M�M�#�&�
7��;�;�$�$�0��$�$�T�[�[�%6�%6�7����x��s�3�
�M�M�!�J�K��M�M�#���5�
����*�*�3�8�8�A�;������D��69�4�@���
�
�a��#�!5�6��*
�M�M�!�J�K��M�M�#���5
���
7����*�*�3�8�8�A�;������D��26�q�'�4�@���
�
�a��#�!5�6�6��
7�08�0J�0J�0L�-�!��s�D�1�Q�v�78�!�T�4�H��2:�E�B���
�
�a��#�!5�6��
�M�M�!�J�K��M�M�#��s_�A&M3�#C;M3�H%�3AJ6�%	J3�.AJ.�M3�.J3�3M3�6	M0�?AL �M3� A
M0�-M3�3%Nc���|jtjk(rl||jkr||_|jdkDrF||j|j
jz
kr||j
jz|_yyy|jtjk(rV||jkDrF||j|j
jzkr||j
jz
|_yyy|jtjk(rl||jkr||_	|jdkDrF||j|j
jz
kr||j
jz|_yyy|jtjk(rB|jdkDr2||j|jz
kr||jz|_yyyy)z�
        Check if system clock has rolled backward beyond test_time. If so, set
        affected timestamps to test_time.
        rN)
rrr~r{rZrr��RUNNING�STOPPING�laststopreport�stopwaitsecsrWrY)r�	test_times  r�+_check_and_adjust_for_system_clock_rollbackz6Subprocess._check_and_adjust_for_system_clock_rollbackes|��
�:�:��/�/�/��4�>�>�)�!*����z�z�A�~�)�t�z�z�D�K�K�<Q�<Q�/Q�"R�&����)>�)>�>��
�#S�~�
�Z�Z�=�0�0�
0��4�>�>�)�i�4�>�>�D�K�K�La�La�;a�.b�!*�T�[�[�-B�-B�!B���/c�)�
�Z�Z�=�1�1�
1��4�.�.�.�&/��#��z�z�A�~�)�t�z�z�D�K�K�<T�<T�/T�"U�&����)A�)A�A��
�#V�~�
�Z�Z�=�0�0�
0��z�z�A�~�)�t�z�z�D�L�L�/H�"I�&����5��
�#J�~�1r c�h�d|_d|_|j|jj�S)z Administrative stop Tr)rzr��killr�
stopsignal�rs r�stopzSubprocess.stop{s+��#'�� �����y�y����/�/�0�0r c�\�|jtjk(r�tj�}|j	|�||j
dzkDrW|jjjjdt|jj�z�||_yyy)z8 Log a 'waiting for x to stop' message with throttling. r�zwaiting for %s to stopN)rrr�rXr�r�rrFrqrrrrh)rras  r�stop_reportzSubprocess.stop_report�s����:�:��/�/�/��)�)�+�C��<�<�S�A��d�)�)�A�-�.����#�#�*�*�/�/�,�y����9I�9I�/J�J�L�&)��#�/�0r c��d|_d|_d|_|jtj
�|j
tj�y)NrT)rZrYryrnrrWrdr}r�s r�give_upzSubprocess.give_up�s@����
����������M�1�1�2����-�-�-�.r c��tj�}|jj}t|jj�}|j
tjk(r@d|z}|jj|�|jtj�y|js/d|�dt|��d�}|jj|�|S|j
tjk(r|jj}n|jj }d}|rd}|jjd|�d	|j�d
|�dt|����d|_||jj$z|_|j)tj*tj,tj�|jtj�|j}|r
|j}		|j/||�y#t0$ra}	|	j2t2j4k(r>d
|�d	|j�dt7|	���}|jj|�Yd}	~	y�d}	~	wwxYw#t9j:�}
d|�d|j�d|
��}|jj=|�|jtj>�d|_d|_|cYSxYw)aSend a signal to the subprocess with the intention to kill
        it (to make it exit).  This may or may not actually kill it.

        Return None if the signal was sent, or an error message string
        if an error occurred or if the subprocess is not running.
        z0Attempted to kill %s, which is in BACKOFF state.Nzattempted to kill z
 with sig � but it wasn't running�zprocess group zkilling � (pid z) zwith signal T�unable to signal z'), it probably just exited on its own: zunknown problem killing � (�):Fr) rXrrFrrhrrrWrq�debugrdrr3r
r��killasgroup�stopasgroupr4r�rZrnr�r~r�r5r6�ESRCHrE�	traceback�
format_exc�critical�UNKNOWN)r�sigrarFrmrtr��as_groupr3�exc�tbs           rr�zSubprocess.kill�s[���i�i�k���+�+�%�%������ 0� 0�1��
�:�:��.�.�.�E���C��N�N� � ��%����m�3�3�4���x�x�����/�C��N�N� � ��%��J��:�:��/�/�/��+�+�1�1�K��+�+�1�1�K����'�H������ +� $��� (� '���	.�	�����4�;�;�3�3�3��
�	
���M�1�1�)�2�2�)�2�2�	4�	
���-�0�0�1��h�h����8�8�)�C�	�

����S�#�&�(��'�
��9�9����+�/:�D�H�H�c�#�h�P�C��N�N�(�(��-� ���
��	��%�%�'�B�:E�:>�(�(�B�H�C��N�N�#�#�C�(����m�3�3�4� �D�L��D�J��J�s2�
H�	J�&AJ�<J
�J�J�J
�
A5Lc
��|jj}t|jj�}|js/d|�dt|��d�}|jj|�|S|jjd|�d|j�dt|����|jtjtjtj�		|j|j|�y	#t$ra}|jtj k(r>d|�d|j�dt#|���}|jj|�Yd	}~y	�d	}~wwxYw#t%j&�}d
|�d|j�d|��}|jj)|�|j+tj,�|cYSxYw)
z�Send a signal to the subprocess, without intending to kill it.

        Return None if the signal was sent, or an error message string
        if an error occurred or if the subprocess is not running.
        zattempted to send z sig r�zsending r�z) sig r�z+), it probably just now exited on its own: Nzunknown problem sending sig r�r�)rrFrrhr3r
rqr�rnrr�r~r�r�r5r6r�rEr�r�r�rdr�)rr�rFrmrtr�r�s       r�signalzSubprocess.signal�sn���+�+�%�%������ 0� 0�1���x�x�����/�C��N�N� � ��%��J������ +� $��� '���.�	�	
���M�1�1�)�2�2�)�2�2�	4�	�
����T�X�X�s�+�&��%�	
��9�9����+�/:�D�H�H��s�8�%�C��N�N�(�(��-� ���	
��	��%�%�'�B� +�T�X�X�r�;�C��N�N�#�#�C�(����m�3�3�4��J�s2�'D�	E.�
AE)�#E1�(E)�)E.�.E1�1A'Gc�$�|j�t|�\}}tj�}|j|�||_t|jj�}||jkDr'||jz
|jjk}nBd}|jjjjd|�d|j�d��||jjv}|jr�d|_d|_||_d|�d|�d�}|j%t&j(�|j+t&j,�|r1|jjjj/|��n�|jjjj|��n�|r�d	|_d
|_d|�d|dz�d�}|j%t&j2�|j+t&j4�|jjjj|��n5d|_d|_||_|j8t&j2k(r|j+t&j:�|j%t&j:�|r]d|�d|d
z�d�}|j+t&j<d��|jjjj/|�nfd|z|_d|�d|dz�d�}|j+t&j<d��|jjjj|�d|_
|jjj?|j@�i|_ i|_!|jD�;tGjHtGjJ||jD��d	|_"y	y	)zK The process was reaped and we need to report and manage its state
        Fz	process '�' (zr) laststart time is in the future, don't know how long process was running so assuming it did not exit too quicklyrz	stopped: r��)Nz1Exited too quickly (process log may have details)zexited: z; not expectedz
; expectedT)r_zBad exit code %s)&r0rrXr��laststoprrrhr{r�rFrqrwr3�	exitcodesr4rZrxrnrr�rdrrrrpr~rWrYrr�r|r�rrrcrr]�EventRejectedEvent)	rr3�sts�esrtrarm�too_quickly�
exit_expecteds	         r�finishzSubprocess.finishs��	
�
�
��$�S�)���C��i�i�k���8�8��=���
����� 0� 0�1�����������.����1F�1F�F�K��K��K�K���&�&�+�+�+6�t�x�x�A�
B�
�d�k�k�3�3�3�
��<�<�!�D�L��D�J� �D�O�(3�S�9�C����
� 6� 6�7����m�3�3�4�����#�#�*�*�/�/��4����#�#�*�*�/�/��4��#�D�O�O�D�M�'2�C�:J�4J�K�C����
� 6� 6�7����m�3�3�4��K�K���&�&�+�+�C�0��D�J��D�L� �D�O�
�z�z�]�3�3�3��!�!�-�"7�"7�8����
� 5� 5�6��+6��l�8J�K���!�!�-�"6�"6��!�F����#�#�*�*�/�/��4�!3�R� 7��
�+6��>N�8N�O���!�!�-�"6�"6��!�G����#�#�*�*�/�/��4���������.�.�t�z�z�:���
����
�:�:�!�
�M�M�&�3�3�D�$�*�*�E�F��D�J�	"r c��|jj�y|jjj|jj�}|Sr+)rr�rF�drop_privilegesrss  rr�zSubprocess.set_uidus:���;�;�?�?�"���k�k�!�!�1�1�$�+�+�/�/�B���
r c�\�|jj|jjkSr+�r�priority�r�others  r�__lt__zSubprocess.__lt__{�!���{�{�#�#�e�l�l�&;�&;�;�;r c�\�|jj|jjk(Sr+r�r�s  r�__eq__zSubprocess.__eq__~s!���{�{�#�#�u�|�|�'<�'<�<�<r c	���|jj}trt|�j	d�}dt|��d|�dt
|j���d�S)N�unicode-escapez<Subprocess at z with name z
 in state �>)rrhrr�encode�idr
�	get_state�rrhs  r�__repr__zSubprocess.__repr__�sO���{�{������T�?�)�)�*:�;�D���t�H��&�t�~�~�'7�8�:�	:r c��|jSr+)rr�s rrzSubprocess.get_state�s���z�z�r c���tj�}|j}|j|�|jjj
}|jjjtjkD�r$|tjk(rv|jjr�|jjtur|j�n�|j|jjvr�|j�n�|tj k(r3|j"s'|jj$rf|j�nU|tj&k(rB|j(|jj*kr||j,kDr|j�t/|jj0�}|tj2k(r�||j"z
|jj4kDr|d|_d|_|j7tj2�|j9tj:�d|jj4z}|j=d|�d|���|tj&k(rN|j(|jj*kDr*|j?�d}|j=d|�d|���yy|tj@k(ru|j,|z
}|dkr`|jjj
jCd|�d|jD�d	��|jGtHjJ�yyy)
NrzNentered RUNNING state, process has stayed up for > than %s seconds (startsecs)z	success: rfz7entered FATAL state, too many start retries too quicklyz	gave up: z	killing 'r�z) with SIGKILL)&rXrr�rrFrq�moodr	�
RESTARTINGrr|�autorestartrr�rxr�rr{�	autostartrWrY�startretriesrZrrhr~r�rnrdr�rrr�r�rwr3r�r��SIGKILL)rrarrqrmrt�	time_lefts       r�
transitionzSubprocess.transition�st���i�i�k���
�
���8�8��=����$�$�+�+���;�;���#�#�&6�&A�&A�A��
�,�,�,��;�;�*�*��{�{�.�.�2H�H��
�
���?�?�$�+�+�2G�2G�G� �J�J�L��-�/�/�/�����;�;�(�(��J�J�L��-�/�/�/��<�<�4�;�;�#;�#;�;��T�Z�Z�'��
�
������ 0� 0�1���M�*�*�*��T�^�^�#�d�k�k�&;�&;�;���
� ����#�#�M�$:�$:�;��!�!�-�"7�"7�8�4�6:�k�k�6K�6K�L������S�A�B��M�)�)�)��|�|�d�k�k�6�6�6�����!������S�A�B�
7��m�,�,�
,��
�
�S�(�I��A�~����#�#�*�*�/�/�:E�:>�(�(�D�E��	�	�&�.�.�)��-r )T)C�__name__�
__module__�__qualname__�__doc__r3rr�listener_statercr{r�r�rZrzryr4rYrrrxrpr�rr"r)r0r=rTrrWr�ProcessStateBackoffEventr}�ProcessStateFatalEventr��ProcessStateUnknownEventr�ProcessStateStoppedEventr|�ProcessStateExitedEventr��ProcessStateRunningEventr~�ProcessStateStartingEventr��ProcessStateStoppingEventr[rdrnrur�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r rrr!s���*��C�
�F��E��N��E��I��H��N�
�E����K��G��G��K��E��J��H��E�+�(�
(�
	0�
�,%�^	���v�>�>����v�<�<����v�>�>����v�>�>����v�=�=����v�>�>����� @� @����� @� @�	
�I�!�"?�>�G8�R	�	 �E�N6�,1�
*�/�S�j-�^[�z�<�=�	:��>*r rc�4�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	y)	�FastCGISubprocessz7Extends Subprocess class to handle FastCGI subprocessesc�>�tj||�d|_yr+)rr�	fcgi_sockrs  rrzFastCGISubprocess.__init__�s�����D�&�)���r c��|j�td��t|jd�s.td|j�dt|j�����|jjj�|_y)zU
        The FastCGI socket needs to be created by the parent before we fork
        Nz"No group set for FastCGISubprocess�socket_managerzNo SocketManager set for �:)r��NotImplementedErrorr$rSr"�
get_socketr r�s r�before_spawnzFastCGISubprocess.before_spawn�si���:�:��%�&J�K�K��t�z�z�#3�4�%�15���S����_�'N�O�
O����2�2�=�=�?��r c�b�|j�tj|�}|�d|_|S)zR
        Overrides Subprocess.spawn() so we can hook in before it happens
        N)r&rr�r )rr3s  rr�zFastCGISubprocess.spawn�s1��	
�������t�$���;�!�D�N��
r c��d|_y)zM
        Releases reference to FastCGI socket when process is reaped
        N)r r�s r�after_finishzFastCGISubprocess.after_finish�s��
��r c�T�tj|||�}|j�|S)zR
        Overrides Subprocess.finish() so we can hook in after it happens
        )rr�r))rr3r��retvals    rr�zFastCGISubprocess.finish�s)���"�"�4��c�2�������
r c���|jj�}|jj}|j	|d�|j	|j
dd�|jjr |j	|j
dd�n|j	|j
dd�td|j�D]}|j|��y)z�
        Overrides Subprocess._prepare_child_fds()
        The FastCGI socket needs to be set to file descriptor 0 in the child
        rr�rVr�r�r�N)
r �filenorrFr�rr�r�r�r�)r�sock_fdrFr�s    rr�z$FastCGISubprocess._prepare_child_fds�s���
�.�.�'�'�)���+�+�%�%�����W�a� ����T�Z�Z��/��3��;�;�&�&��L�L����N�3�Q�7��L�L����N�3�Q�7��q�'�.�.�)�	 �A����Q��	 r N)
rrrrrr&r�r)r�r�rr rrr�s$��A��	@�	��� r rc�H�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zy)�ProcessGroupBasec��||_i|_|jjD]*}|j|�|j|j<�,yr+)r�	processes�process_configs�make_processrh)rr�pconfigs   rrzProcessGroupBase.__init__sH���������{�{�2�2�	F�G�+2�+?�+?��+E�D�N�N�7�<�<�(�	Fr c�\�|jj|jjkSr+r�r�s  rr�zProcessGroupBase.__lt__r�r c�\�|jj|jjk(Sr+r�r�s  rr�zProcessGroupBase.__eq__s!���{�{�#�#�u�|�|�'<�'<�<�<r c��|jj}trt|�j	d�}d|j
�dt
|��d|�d�S)Nr��<z
 instance at z named r�)rrhrrr�	__class__rrs  rrzProcessGroupBase.__repr__sF���{�{������T�?�)�)�*:�;�D��15����D��15�7�	7r c�b�|jj�D]}|j��yr+)r2r#r"�r�processs  rr"zProcessGroupBase.removelogs%�*���~�~�,�,�.�	!�G���� �	!r c�b�|jj�D]}|j��yr+)r2r#r)r<s  rr)zProcessGroupBase.reopenlogs)r>r c��t|jj��}|j�|j	�|D]~}|j�}|tjk(r|j��7|tjk(r|j��[|tjk(s�o|j���yr+)�listr2r#�sort�reverserrr�r�r~rWr�)rr2�procrs    r�stop_allzProcessGroupBase.stop_all-s�������.�.�0�1�	����������
	�D��N�N�$�E��
�-�-�-��	�	���-�0�0�0��	�	���-�/�/�/�����
	r c��|jj�D�cgc]}|j�tvs�|��c}Scc}w)z@ Processes which aren't in a state that is considered 'stopped' )r2r#rr)r�xs  r�get_unstopped_processesz(ProcessGroupBase.get_unstopped_processes>s;�� �N�N�1�1�3�"�q�q�{�{�}��8 ��"�	"��"s
�A�Ac�~�i}|jj�D]}|j|j��|Sr+)r2r#r�r)rrr=s   r�get_dispatchersz ProcessGroupBase.get_dispatchersCs=�����~�~�,�,�.�	4�G����w�2�2�3�	4��r c��yr+rr�s r�
before_removezProcessGroupBase.before_removeIs��r N)
rrrrr�r�rr"r)rErHrJrLrr rr0r0
s5��F�<�=�7�!�!��""�
�
r r0c��eZdZd�Zy)�ProcessGroupc�b�|jj�D]}|j��yr+)r2r#r)rrDs  rrzProcessGroup.transitionMs(���N�N�)�)�+�	�D��O�O��	r N)rrrrrr rrNrNLs��r rNc��eZdZd�Zy)�FastCGIProcessGroupc�`�tj||�|jdt�}||j|j
j��|_	|jj�y#t$r.}td|jj��d|����d}~wwxYw)N�
socketManager)rqz Could not create FastCGI socket r?)rNrr\r�
socket_configrFrqr"r%�	ExceptionrDr)rr�kwargs�sockManagerKlassrNs     rrzFastCGIProcessGroup.__init__Ss������d�F�+�!�:�:�o�}�E��.�v�/C�/C�6<�n�n�6K�6K�M���	����*�*�,���	���'�'�.�.�0�!�5��
��	�s�A6�6	B-�?)B(�(B-N�rrrrrr rrQrQQs��
r rQc�J�eZdZd�Zd�Zd�Zd�Zd�Zdd�Zd�Z	d�Z
d	�Zd
�Zy)
�EventListenerPoolc��tj||�g|_d|_d|_d|_|j
�y)N���r)r0r�event_buffer�serial�
last_dispatch�dispatch_throttle�
_subscribers  rrzEventListenerPool.__init__cs;���!�!�$��/����������!"������r c��|j}|jj�}||vr|j|jd��yy)NT��head)r=r2r#�_acceptEventrc)rrcr=�procss    r�handle_rejectedz!EventListenerPool.handle_rejectedksA���-�-�����%�%�'���e�����e�k�k���5�r c��|jj�}d}|D]P}|j�|jtj
k(s�1|jtjk(s�Od}�R|rd|jrGtj�}||jkr||_||jz
|jkry|j�yy)NFT)
r2r#rrrr�rr�READYr`rXr_�dispatch)rr2�dispatch_capabler=ras     rrzEventListenerPool.transitionrs����N�N�)�)�+�	� �� �	,�G���� ��}�}�
� 5� 5�5��)�)�-@�-F�-F�F�'+�$�
	,���%�%��i�i�k����+�+�+�*-�D�&���+�+�+�d�.D�.D�D���M�M�O�r c�$�|j�yr+)�_unsubscriber�s rrLzEventListenerPool.before_remove�s�����r c���|jrO|jjd�}|j|�}|s|j|d��n
|jr�Ot	j�|_y)NrTrc)r]�pop�_dispatchEventrerXr_)rrc�oks   rrjzEventListenerPool.dispatch�sg������%�%�)�)�!�,�E��$�$�U�+�B���!�!�%�d�!�3�����"�Y�Y�[��r c��t|jj�}t|d�st	t
�|_t|d�si|_|jj|jvr-t	|�|j|jj<ng|jjjjd|j|t|j�|jjfz�t|j�|jjk\rf|jrZ|jjd�}|jjjjd|�d|j���|r|jj!d|�y|jj#|�y)Nr^�pool_serialsz6rebuffering event %s for pool %s (buf size=%d, max=%d)rzpool z+ event buffer overflowed, discarding event )rrrhr$�
new_serial�GlobalSerialr^rsrFrqr��lenr]�buffer_sizeror��insert�append)rrcrdrm�discarded_events     rrezEventListenerPool._acceptEvent�s`�� ���� 0� 0�1���u�h�'�%�l�3�E�L��u�n�-�!#�E���;�;���5�#5�#5�5�3=�d�3C�E���t�{�{�/�/�0��K�K���&�&�,�,�H����{�C��0A�0A�,B����'�'�)�*�
+�
�t� � �!�T�[�[�%<�%<�<�� � �"&�"3�"3�"7�"7��":�����#�#�*�*�0�0� �/�"8�"8�;�<�����$�$�Q��.����$�$�U�+r c	��|j|jj}|jj	�D�]}|j
tjk7r�"|jtjk(s�@t|jj�}|j�}	|j}|j}|j||||�}|j!t#|��tj2|_||_|jj,j.j1d|j�d|���yy#t$$rl}	|	j&dt(j*k7r�|jj,j.j1d|j�d|�d��Yd}	~	���d}	~	wwxYw)	Nrz#epipe occurred while sending event z
 to listener z, listener state unchangedzevent z sent to listener TF)rsrrhr2r#rrr�rrrir�payloadr:r^�_eventEnveloper=rr5rr6r7rFrqr��BUSYrc)
rrc�pool_serialr=rmr|�
event_typer^�enveloper�s
          rrpz EventListenerPool._dispatchEvent�sl���(�(����)9�)9�:���~�~�,�,�.�	�G��}�}�
� 5� 5�5���%�%�)<�)B�)B�B�'����(;�(;�<���-�-�/���!&���J�"�\�\�F�#�2�2�:�v�3>�� I�H��M�M�(�8�"4�5�*=�)A�)A��&� %��
����#�#�*�*�0�0��L�L�+�/�0��7	�:��#���x�x��{�e�k�k�1���K�K�'�'�.�.�4�4����k�3�4����s�.AE�	G�A!G�Gc	���tj|�}t|�}d|jjj
||jj||||d�}d|zS)Nz3.0)�ver�sidr^�	pool_namer�
event_namervr|z�ver:%(ver)s server:%(sid)s serial:%(serial)s pool:%(pool_name)s poolserial:%(pool_serial)s eventname:%(event_name)s len:%(len)s
%(payload)s)r�getEventNameByTypervrrF�
identifierrh)rr�r^rr|r��payload_len�Ds        rr}z EventListenerPool._eventEnvelope�si���.�.�z�:�
��'�l����+�+�%�%�0�0�����(�(�%�#���	
��D�FG�H�	Ir c���|jjD]"}tj||j��$tjtj
|j�yr+)r�pool_eventsr�	subscriberer�rg�rr�s  rrazEventListenerPool._subscribe�sM���+�+�1�1�	<�J����Z��):�):�;�	<�����2�2�D�4H�4H�Ir c���|jjD]"}tj||j��$tjtj
|j�yr+)rr�r�unsubscriberer�rgr�s  rrmzEventListenerPool._unsubscribe�sM���+�+�1�1�	>�J����z�4�+<�+<�=�	>����6�4�4�d�6J�6J�Kr N)F)
rrrrrgrrLrjrerpr}rarmrr rrZrZbs8���6��.�
)�,�: �DI�"J�
Lr rZc��eZdZd�Zy)ruc��d|_y)Nr\)r^r�s rrzGlobalSerial.__init__�s	����r NrXrr rruru�s��r ruc�x�|jtk(rd|_|xjdz
c_|jS)Nr\rV)r^r)�insts rrtrt�s-���{�{�f������K�K�1��K��;�;�r )+r6�	functoolsrIr�rArXr��supervisor.compatrrrr�supervisor.medusarr��supervisor.statesrr	r
r�supervisor.optionsrr
rr�supervisor.dispatchersr�
supervisorr�supervisor.datatypesr�supervisor.socket_managerr�total_ordering�objectrrr0rNrQrZrurtrr r�<module>r�s�����	�
����$�&�'�!�5�+�.�8�,�1�&�;�6��7�3�
���l
*��l
*��l
*�\; �
�; �z���<
�v�<
��<
�|�#��
�,��"NL�(�NL�b�6���~��r