§
    „hÞS  ã                   ó    — 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Zd dlZd dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZmZ  G d„ d¦  «        ZdS )é    N)Ú
HaltServerÚAppImportError)ÚPidfile)ÚsockÚsystemdÚutil)Ú__version__ÚSERVER_SOFTWAREc                   ó‚  — e Zd ZdZdZdZi Zg Zi Zg Z	g Z
d„ d                     ¦   «         D ¦   «         Z ed„  ee¦  «        D ¦   «         ¦  «        Zd„ Zd„ Zd	„ Z eee¦  «        Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d*d„Z&d„ Z'd+d „Z(d!„ Z)d"„ Z*d#„ Z+d$„ Z,d%„ Z-d&„ Z.d'„ Z/d(„ Z0d)„ Z1dS ),ÚArbiterz›
    Arbiter maintain the workers processes alive. It launches or
    kills them if needed. It also manages application reloading
    via SIGHUP/USR2.
    é   é   c                 ó>   — g | ]}t          t          d |z  ¦  «        ‘ŒS )zSIG%s)ÚgetattrÚsignal)Ú.0Úxs     úG/var/www/histauto/venv/lib/python3.11/site-packages/gunicorn/arbiter.pyú
<listcomp>zArbiter.<listcomp>+   s<   € ð Oð Oð OØõ •v˜w¨™{Ñ+Ô+ð Oð Oð Oó    z+HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCHc              #   ó¬   K  — | ]O}|d d…         dk    ¯|d         dk    ¯t          t          |¦  «        |dd …                              ¦   «         fV — ŒPd S )Nr   ÚSIGÚ_)r   r   Úlower)r   Únames     r   ú	<genexpr>zArbiter.<genexpr>-   sk   è è € ð ð Ø6:Ø���Œ8�uÒÐ  a¤¨C¢ õ 
•˜Ñ	Ô	  Q R R¤§¢Ñ 0Ô 0Ð1Ø!/   ðð r   c                 óŽ  — t           t          j        d<   d | _        d | _        d | _        |                      |¦  «         d | _        d| _        d| _	        d| _
        d| _        d| _        t          j        ¦   «         }t          j        d d …         }|                     dt          j        ¦  «         ||t          j        dœ| _        d S )Nr
   Fr   ÚMaster)ÚargsÚcwdr   )r
   ÚosÚenvironÚ_num_workersÚ _last_logged_active_worker_countÚlogÚsetupÚpidfiler   Ú
worker_ageÚ
reexec_pidÚ
master_pidÚmaster_namer   ÚgetcwdÚsysÚargvÚinsertÚ
executableÚ	START_CTX)ÚselfÚappr    r   s       r   Ú__init__zArbiter.__init__2   s¯   € Ý(7�Œ
Ð$Ñ%à ˆÔØ04ˆÔ-ØˆŒà�
Š
�3‰ŒˆàˆŒØˆŒØˆŒØˆŒØˆŒØ#ˆÔåŒk‰mŒmˆåŒx˜˜˜Œ{ˆØ�Š�A•s”~Ñ&Ô&Ð&ð ØÝŒ~ð
ð 
ˆŒˆˆr   c                 ó   — | j         S ©N)r#   ©r2   s    r   Ú_get_num_workerszArbiter._get_num_workersN   s   € ØÔ Ð r   c                 óZ   — | j         }|| _         | j                             | ||¦  «         d S r6   )r#   ÚcfgÚnworkers_changed)r2   ÚvalueÚ	old_values      r   Ú_set_num_workerszArbiter._set_num_workersQ   s2   € ØÔ%ˆ	Ø!ˆÔØŒ×!Ò! $¨¨yÑ9Ô9Ð9Ð9Ð9r   c                 ó2  — || _         |j        | _        | j        €$| j                             |j        ¦  «        | _        dt          j        v r| j                             ¦   «          | j        j        | _        | j        j        | _        | j        j	        | _
        | j        j        | _        | j        j        | _        | j                             d                     d                     d„ t!          | j        j                             ¦   «         d„ ¬¦  «        D ¦   «         ¦  «        ¦  «        ¦  «         | j        j        r3| j        j                             ¦   «         D ]\  }}|t          j        |<   Œ| j        j        r| j                              ¦   «          d S d S )NÚGUNICORN_PIDzCurrent configuration:
{0}ú
c              3   óR   K  — | ]"\  }}d                       ||j        ¦  «        V — Œ#dS )z
  {0}: {1}N)Úformatr<   )r   Úconfigr<   s      r   r   z Arbiter.setup.<locals>.<genexpr>i   sL   è è € ð ;ð ;á!�F˜Eð ×#Ò# F¨E¬KÑ8Ô8ð;ð ;ð ;ð ;ð ;ð ;r   c                 ó   — | d         S ©Né   © )Úsettings    r   ú<lambda>zArbiter.setup.<locals>.<lambda>m   s
   € ¨g°a¬j€ r   ©Úkey)r3   r:   r%   Úlogger_classr!   r"   Úreopen_filesÚworker_classÚaddressÚworkersÚnum_workersÚtimeoutÚ	proc_nameÚdebugrC   ÚjoinÚsortedÚsettingsÚitemsÚenvÚpreload_appÚwsgi)r2   r3   ÚkÚvs       r   r&   zArbiter.setupW   s~  € ØˆŒØ”7ˆŒàŒ8ÐØ”x×,Ò,¨S¬WÑ5Ô5ˆDŒHð �RœZÐ'Ð'ØŒH×!Ò!Ñ#Ô#Ð#à œHÔ1ˆÔØ”xÔ'ˆŒØœ8Ô+ˆÔØ”xÔ'ˆŒØœÔ+ˆŒàŒ�ŠÐ4×;Ò;Ø�IŠIð ;ð ;õ ˜$œ(Ô+×1Ò1Ñ3Ô3Ø8Ð8ð:ñ :ô :ð;ñ ;ô ;ñ ;ô ;ñ<ô <ñ 	=ô 	=ð 	=ð Œ8Œ<ð 	"Øœœ×*Ò*Ñ,Ô,ð "ð "‘��1Ø !•”
˜1‘�àŒ8Ôð 	ØŒH�MŠM‰OŒOˆOˆOˆOð	ð 	r   c                 óº  — | j                              dt          ¦  «         dt          j        v rGt          t          j                             d¦  «        ¦  «        | _        | j        dz   | _        d| _	        t          j
        ¦   «         | _        | j        j        �O| j        j        }| j        dk    r|dz  }t          |¦  «        | _        | j                             | j        ¦  «         | j                             | ¦  «         |                      ¦   «          | j        sËd}t'          j        ¦   «         }|r/d| _        t+          t&          j        t&          j        |z   ¦  «        }n`| j        rYg }t          j                             d¦  «                             d	¦  «        D ]$}|                     t          |¦  «        ¦  «         Œ%t5          j        | j        | j         |¦  «        | _        d	                     d
„ | j        D ¦   «         ¦  «        }| j                              d¦  «         | j                              d|| j        ¦  «         | j                              d| j        j        ¦  «         t'          j        d| j         ¦  «         tA          | j!        d¦  «        r%| j!         "                    | j        | j         ¦  «         | j         #                    | ¦  «         dS )zS        Initialize the arbiter. Start listening and set pidfile if needed.
        zStarting gunicorn %sr@   z.2zMaster.2Nr   TÚGUNICORN_FDú,c                 ó,   — g | ]}t          |¦  «        ‘ŒS rH   ©Ústr©r   Úlnrs     r   r   z!Arbiter.start.<locals>.<listcomp>œ   s   € Ð!EÐ!EÐ!E¨s¥# c¡(¤(Ð!EÐ!EÐ!Er   zArbiter bootedzListening at: %s (%s)zUsing worker: %sz&READY=1
STATUS=Gunicorn arbiter bootedÚcheck_config)$r%   Úinfor	   r!   r"   ÚintÚgetr*   rT   r+   ÚgetpidÚpidr:   r'   r   ÚcreateÚon_startingÚinit_signalsÚ	LISTENERSr   Ú
listen_fdsÚrangeÚSD_LISTEN_FDS_STARTÚpopÚsplitÚappendr   Úcreate_socketsrV   rU   Úworker_class_strÚ	sd_notifyÚhasattrrO   rg   Ú
when_ready)r2   ÚpidnameÚfdsrq   ÚfdÚlisteners_strs         r   ÚstartzArbiter.startw   sw  € ð 	Œ�ŠÐ,­kÑ:Ô:Ð:à�RœZÐ'Ð'Ý!¥"¤*§.¢.°Ñ"@Ô"@ÑAÔAˆDŒOØ!œ^¨dÑ2ˆDŒNØ)ˆDÔå”9‘;”;ˆŒØŒ8ÔÐ'Ø”hÔ&ˆGØŒ !Ò#Ð#Ø˜4‘�Ý" 7Ñ+Ô+ˆDŒLØŒL×Ò ¤Ñ)Ô)Ð)ØŒ×Ò˜TÑ"Ô"Ð"à×ÒÑÔÐàŒ~ð 	JØˆCÝ Ô+Ñ-Ô-ˆJØð (Ø#�”Ý�GÔ7Ý#Ô7¸*ÑDñFô F��ð ”ð (Ø�Ýœ*Ÿ.š.¨Ñ7Ô7×=Ò=¸cÑBÔBð (ð (�BØ—J’J�s 2™wœwÑ'Ô'Ð'Ð'å!Ô0°´¸4¼8ÀSÑIÔIˆDŒNàŸšÐ!EÐ!E°d´nÐ!EÑ!EÔ!EÑFÔFˆØŒ�ŠÐ'Ñ(Ô(Ð(ØŒ�ŠÐ-¨}¸d¼hÑGÔGÐGØŒ�ŠÐ(¨$¬(Ô*CÑDÔDÐDÝÔÐCÀTÄXÑNÔNÐNõ �4Ô$ nÑ5Ô5ð 	?ØÔ×*Ò*¨4¬8°T´XÑ>Ô>Ð>àŒ×Ò˜DÑ!Ô!Ð!Ð!Ð!r   c                 ó’  — | j         D ]}t          j        |¦  «         Œt          j        ¦   «         x| _         }|D ]*}t	          j        |¦  «         t	          j        |¦  «         Œ+| j                             ¦   «          | j        D ]}t          j	        || j	        ¦  «         Œt          j	        t          j
        | j        ¦  «         dS )z‚        Initialize master signal handling. Most of the signals
        are queued. Child signals only wake up the master.
        N)ÚPIPEr!   ÚcloseÚpiper   Úset_non_blockingÚclose_on_execr%   ÚSIGNALSr   ÚSIGCHLDÚhandle_chld)r2   ÚpÚpairÚss       r   ro   zArbiter.init_signals¨   sÇ   € ð ”ð 	ð 	ˆAÝŒH�Q‰KŒKˆKˆKõ œ7™9œ9Ð$ˆŒ	�DØð 	"ð 	"ˆAÝÔ! !Ñ$Ô$Ð$ÝÔ˜qÑ!Ô!Ð!Ð!àŒ×ÒÑ Ô Ð ð ”ð 	*ð 	*ˆAÝŒM˜!˜Tœ[Ñ)Ô)Ð)Ð)ÝŒ•f”n dÔ&6Ñ7Ô7Ð7Ð7Ð7r   c                 ó–   — t          | j        ¦  «        dk     r0| j                             |¦  «         |                      ¦   «          d S d S )Né   )ÚlenÚ	SIG_QUEUErv   Úwakeup©r2   ÚsigÚframes      r   r   zArbiter.signal¾   sF   € ÝˆtŒ~ÑÔ Ò"Ð"ØŒN×!Ò! #Ñ&Ô&Ð&Ø�KŠK‰MŒMˆMˆMˆMð #Ð"r   c                 óˆ  — |                       ¦   «          t          j        d| j        z  ¦  «         	 |                      ¦   «          	 |                      ¦   «          | j        r| j                             d¦  «        nd}|€=|                      ¦   «          |  	                    ¦   «          |                      ¦   «          Œw|| j
        vr| j                             d|¦  «         Œœ| j
                             |¦  «        }t          | d|z  d¦  «        }|s| j                             d|¦  «         Œè| j                             d|¦  «          |¦   «          |                      ¦   «          �Œ"# t"          t$          f$ r |                      ¦   «          Y dS t(          $ r,}|                      |j        |j        ¬	¦  «         Y d}~dS d}~wt.          $ r ‚ t0          $ ri | j                             d
d¬¦  «         |                      d¦  «         | j        �| j                             ¦   «          t9          j        d¦  «         Y dS w xY w)zMain master loop.úmaster [%s]Tr   NzIgnoring unknown signal: %sz	handle_%szUnhandled signal: %szHandling signal: %s)ÚreasonÚexit_statusz Unhandled exception in main loop©Úexc_infoFéÿÿÿÿ)r€   r   Ú_setproctitlerT   Úmanage_workersÚmaybe_promote_masterr�   rt   ÚsleepÚmurder_workersÚ	SIG_NAMESr%   rh   rj   r   Úerrorr‘   ÚStopIterationÚKeyboardInterruptÚhaltr   r—   r˜   Ú
SystemExitÚ	ExceptionÚstopr'   Úunlinkr-   Úexit)r2   r“   ÚsignameÚhandlerÚinsts        r   ÚrunzArbiter.runÃ   s^  € à�
Š
‰ŒˆÝÔ˜=¨4¬>Ñ9Ñ:Ô:Ð:ð%	Ø×ÒÑ!Ô!Ð!ðØ×)Ò)Ñ+Ô+Ð+à/3¬~ÐG�d”n×(Ò(¨Ñ+Ô+Ð+À4�Ø�;Ø—J’J‘L”L�LØ×'Ò'Ñ)Ô)Ð)Ø×'Ò'Ñ)Ô)Ð)Øà˜dœnÐ,Ð,Ø”H—M’MÐ"?ÀÑEÔEÐEØàœ.×,Ò,¨SÑ1Ô1�Ý! $¨°gÑ(=¸tÑDÔD�Øð Ø”H—N’NÐ#9¸7ÑCÔCÐCØØ”—’Ð3°WÑ=Ô=Ð=Ø�‘	”	�	Ø—’‘”�ñ+øõ, Õ0Ð1ð 	ð 	ð 	Ø�IŠI‰KŒKˆKˆKˆKˆKÝð 	Hð 	Hð 	HØ�IŠI˜Tœ[°dÔ6FˆIÑGÔGÐGÐGÐGÐGÐGÐGÐGøøøøÝð 	ð 	ð 	ØÝð 	ð 	ð 	ØŒH�NŠNÐ=Ø$(ð ñ *ô *ð *à�IŠI�eÑÔÐØŒ|Ð'Ø”×#Ò#Ñ%Ô%Ð%ÝŒH�R‰LŒLˆLˆLˆLˆLð	øøøs%   ²D7E) Å)%IÆ	IÆ!GÇA<IÉ Ic                 óV   — |                       ¦   «          |                      ¦   «          dS )zSIGCHLD handlingN)Úreap_workersr‘   r’   s      r   r‰   zArbiter.handle_chldï   s%   € à×ÒÑÔÐØ�Š‰Œˆˆˆr   c                 ón   — | j                              d| j        ¦  «         |                      ¦   «          dS )z¶        HUP handling.
        - Reload configuration
        - Start the new worker processes with a new configuration
        - Gracefully shutdown the old worker processes
        zHang up: %sN)r%   rh   r+   Úreloadr7   s    r   Ú
handle_hupzArbiter.handle_hupô   s.   € ð 	Œ�Š�m TÔ%5Ñ6Ô6Ð6Ø�Š‰Œˆˆˆr   c                 ó   — t           ‚)zSIGTERM handling)r£   r7   s    r   Úhandle_termzArbiter.handle_termþ   s   € åÐr   c                 ó:   — |                       d¦  «         t          ‚)zSIGINT handlingF©r¨   r£   r7   s    r   Ú
handle_intzArbiter.handle_int  ó   € à�	Š	�%ÑÔÐÝÐr   c                 ó:   — |                       d¦  «         t          ‚)zSIGQUIT handlingFr·   r7   s    r   Úhandle_quitzArbiter.handle_quit  r¹   r   c                 óN   — | xj         dz  c_         |                      ¦   «          dS )zR        SIGTTIN handling.
        Increases the number of workers by one.
        rG   N©rR   r�   r7   s    r   Úhandle_ttinzArbiter.handle_ttin  s0   € ð
 	ÐÔ˜AÑÐÔØ×ÒÑÔÐÐÐr   c                 óh   — | j         dk    rdS | xj         dz  c_         |                      ¦   «          dS )zR        SIGTTOU handling.
        Decreases the number of workers by one.
        rG   Nr½   r7   s    r   Úhandle_ttouzArbiter.handle_ttou  sC   € ð
 Ô˜qÒ Ð ØˆFØÐÔ˜AÑÐÔØ×ÒÑÔÐÐÐr   c                 óv   — | j                              ¦   «          |                      t          j        ¦  «         dS )zU        SIGUSR1 handling.
        Kill all workers by sending them a SIGUSR1
        N)r%   rN   Úkill_workersr   ÚSIGUSR1r7   s    r   Úhandle_usr1zArbiter.handle_usr1  s4   € ð
 	Œ×ÒÑÔÐØ×Ò�&œ.Ñ)Ô)Ð)Ð)Ð)r   c                 ó.   — |                       ¦   «          dS )zà        SIGUSR2 handling.
        Creates a new arbiter/worker set as a fork of the current
        arbiter without affecting old workers. Use this to do live
        deployment with the ability to backout a change.
        N)Úreexecr7   s    r   Úhandle_usr2zArbiter.handle_usr2&  s   € ð 	�Š‰Œˆˆˆr   c                 óÖ   — | j         j        rB| j                             d¦  «         d| _        |                      t          j        ¦  «         dS | j                             d¦  «         dS )zSIGWINCH handlingzgraceful stop of workersr   z SIGWINCH ignored. Not daemonizedN)	r:   Údaemonr%   rh   rR   rÂ   r   ÚSIGTERMrU   r7   s    r   Úhandle_winchzArbiter.handle_winch/  sb   € àŒ8Œ?ð 	?ØŒH�MŠMÐ4Ñ5Ô5Ð5Ø ˆDÔØ×Ò�fœnÑ-Ô-Ð-Ð-Ð-àŒH�NŠNÐ=Ñ>Ô>Ð>Ð>Ð>r   c                 óv  — | j         dk    rd S | j         t          j        ¦   «         k    r�| j                             d¦  «         d| _        d| _         | j        j        | _        t          j        d= | j	        �$| j	         
                    | j        j	        ¦  «         t          j        d| j        z  ¦  «         d S d S )Nr   zMaster has been promoted.r   r@   r–   )r*   r!   Úgetppidr%   rh   r+   r:   rT   r"   r'   Úrenamer   rœ   r7   s    r   rž   zArbiter.maybe_promote_master8  sª   € ØŒ?˜aÒÐØˆFàŒ?�bœj™lœlÒ*Ð*ØŒH�MŠMÐ5Ñ6Ô6Ð6à'ˆDÔØˆDŒOØ!œXÔ/ˆDŒNÝ”
˜>Ð*àŒ|Ð'Ø”×#Ò# D¤HÔ$4Ñ5Ô5Ð5åÔ˜}¨t¬~Ñ=Ñ>Ô>Ð>Ð>Ð>ð +Ð*r   c                 ó¸   — 	 t          j        | j        d         d¦  «         dS # t          $ r+}|j        t          j        t          j        fvr‚ Y d}~dS d}~ww xY w)z;        Wake up the arbiter by writing to the PIPE
        rG   ó   .N)r!   Úwriter‚   ÚOSErrorÚerrnoÚEAGAINÚEINTR)r2   Úes     r   r‘   zArbiter.wakeupI  sq   € ð	ÝŒH�T”Y˜q”\ 4Ñ(Ô(Ð(Ð(Ð(øÝð 	ð 	ð 	ØŒw�uœ|­U¬[Ð9Ð9Ð9Øð :Ð9Ð9Ð9Ð9Ð9øøøøð	øøøs   ‚ $ ¤
A® AÁANr   c                 óD  — |                       ¦   «          |dk    r| j        j        n| j        j        } |d| j        ¦  «         |� |d|¦  «         | j        �| j                             ¦   «          | j                             | ¦  «         t          j
        |¦  «         dS )z halt arbiter r   zShutting down: %sNz
Reason: %s)r¨   r%   rh   r¢   r+   r'   r©   r:   Úon_exitr-   rª   )r2   r—   r˜   Úlog_funcs       r   r¥   zArbiter.haltS  s    € à�	Š	‰Œˆà$/°1Ò$4Ð$4�4”8”=�=¸$¼(¼.ˆØˆÐ$ dÔ&6Ñ7Ô7Ð7ØÐØˆH�\ 6Ñ*Ô*Ð*àŒ<Ð#ØŒL×ÒÑ!Ô!Ð!ØŒ×Ò˜ÑÔÐÝŒ�ÑÔÐÐÐr   c                 óÄ  — 	 t          j         | j        d         gg g d¦  «        }|d         sdS t          j        | j        d         d¦  «        r#	 t          j        | j        d         d¦  «        °!dS dS # t          $ rB}t          |d|j        d         ¦  «        }|t          j        t          j	        fvr‚ Y d}~dS d}~wt          $ r t          j        ¦   «          Y dS w xY w)zm        Sleep until PIPE is readable or we timeout.
        A readable PIPE means a signal occurred.
        r   g      ð?NrG   rÓ   )Úselectr‚   r!   ÚreadrÒ   r   r   rÓ   rÔ   rÕ   r¤   r-   rª   )r2   ÚreadyrÖ   Úerror_numbers       r   rŸ   zArbiter.sleepa  s  € ð
	Ý”M 4¤9¨Q¤< .°"°b¸#Ñ>Ô>ˆEØ˜”8ð Ø�Ý”'˜$œ) Aœ,¨Ñ*Ô*ð Øõ ”'˜$œ) Aœ,¨Ñ*Ô*ð ð ð ð ð øåð 	ð 	ð 	å" 1 g¨q¬v°a¬yÑ9Ô9ˆLØ¥E¤Lµ%´+Ð#>Ð>Ð>Øð ?Ð>Ð>Ð>Ð>Ð>øøøøå ð 	ð 	ð 	ÝŒH‰JŒJˆJˆJˆJˆJð	øøøs#   ‚+A4 ¯AA4 Á4
CÁ>7B;Â; CÃCTc                 ó"  — | j         | j        cxk    odk    nc o| j         o| j        j         }t          j        | j        |¦  «         g | _        t          j	        }|st          j
        }t          j        ¦   «         | j        j        z   }|                      |¦  «         | j        rIt          j        ¦   «         |k     r2t          j        d¦  «         | j        rt          j        ¦   «         |k     °2|                      t          j        ¦  «         dS )z°        Stop workers

        :attr graceful: boolean, If True (the default) workers will be
        killed gracefully  (ie. trying to wait for the current connection)
        r   çš™™™™™¹?N)r)   r*   r   r:   Ú
reuse_portr   Úclose_socketsrp   r   rÊ   ÚSIGQUITÚtimeÚgraceful_timeoutrÂ   ÚWORKERSrŸ   ÚSIGKILL)r2   Úgracefulr©   r“   Úlimits        r   r¨   zArbiter.stopt  s  € ð ŒO˜tœÐ3Ð3Ò3Ð3°!Ò3Ð3Ð3Ð3ð (Ø”LÐ ð(à”HÔ'Ð'ð 	õ
 	Ô˜4œ>¨6Ñ2Ô2Ð2àˆŒÝŒnˆØð 	!Ý”.ˆCÝ”	‘”˜dœhÔ7Ñ7ˆà×Ò˜#ÑÔÐàŒlð 	�tœy™{œ{¨UÒ2Ð2ÝŒJ�s‰OŒOˆOð Œlð 	�tœy™{œ{¨UÒ2Ð2ð 	×Ò�&œ.Ñ)Ô)Ð)Ð)Ð)r   c                 ó(  — | j         dk    r| j                             d¦  «         dS | j        dk    r| j                             d¦  «         dS t	          j        ¦   «         }t	          j        ¦   «         | _         | j         dk    rdS | j                             | ¦  «         | j        j	         
                    ¦   «         }t          |¦  «        |d<   | j        rHt          t	          j        ¦   «         ¦  «        |d<   t          t          | j        ¦  «        ¦  «        |d<   n'd                     d	„ | j        D ¦   «         ¦  «        |d
<   t	          j        | j        d         ¦  «         t	          j        | j        d         | j        d         |¦  «         dS )z1        Relaunch the master and workers.
        r   z"USR2 signal ignored. Child exists.Nz#USR2 signal ignored. Parent exists.r@   Ú
LISTEN_PIDÚ
LISTEN_FDSra   c              3   óX   K  — | ]%}t          |                     ¦   «         ¦  «        V — Œ&d S r6   )rd   Úfilenore   s     r   r   z!Arbiter.reexec.<locals>.<genexpr>©  sC   è è € ð .=ð .=Ø&)•�C—J’J‘L”LÑ!Ô!ð.=ð .=ð .=ð .=ð .=ð .=r   r`   r    r   )r)   r%   Úwarningr*   r!   rk   Úforkr:   Úpre_execÚenv_origÚcopyrd   r   r�   rp   rV   Úchdirr1   Úexecvpe)r2   r*   r"   s      r   rÆ   zArbiter.reexec�  sv  € ð Œ?˜aÒÐØŒH×ÒÐAÑBÔBÐBØˆFàŒ?˜aÒÐØŒH×ÒÐBÑCÔCÐCØˆFå”Y‘[”[ˆ
Ýœ'™)œ)ˆŒØŒ?˜aÒÐØˆFàŒ×Ò˜$ÑÔÐà”(Ô#×(Ò(Ñ*Ô*ˆÝ"% j¡/¤/ˆ�ÑàŒ<ð 	=Ý$'­¬	©¬Ñ$4Ô$4ˆG�LÑ!Ý$'­¨D¬NÑ(;Ô(;Ñ$<Ô$<ˆG�LÑ!Ð!à%(§X¢Xð .=ð .=Ø-1¬^ð.=ñ .=ô .=ñ &=ô &=ˆG�MÑ"õ 	Œ�” Ô&Ñ'Ô'Ð'õ 	Œ
�4”> !Ô$ d¤n°VÔ&<¸gÑFÔFÐFÐFÐFr   c                 óT  — | j         j        }| j         j        D ]N}|| j         j        v r | j         j        |         t          j        |<   Œ0	 t          j        |= Œ?# t          $ r Y ŒKw xY w| j                             ¦   «          |  	                    | j        ¦  «         | j
                             ¦   «          || j         j        k    r�| j        D ]}|                     ¦   «          Œt          j        | j         | j
        ¦  «        | _        d                     d„ | j        D ¦   «         ¦  «        }| j
                             d|¦  «         | j                              | ¦  «         | j        �| j                             ¦   «          | j         j        �=t+          | j         j        ¦  «        | _        | j                             | j        ¦  «         t1          j        d| j        z  ¦  «         t7          | j         j        ¦  «        D ]}|                      ¦   «          Œ|                      ¦   «          d S )Nra   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rH   rc   re   s     r   r   z"Arbiter.reload.<locals>.<listcomp>Ï  s   € Ð%IÐ%IÐ%I°3¥c¨#¡h¤hÐ%IÐ%IÐ%Ir   zListening at: %sr–   )r:   rP   rZ   rò   r!   r"   ÚKeyErrorr3   r²   r&   r%   rN   rp   rƒ   r   rw   rV   rh   Ú	on_reloadr'   r©   r   rm   rl   r   rœ   rT   rr   rQ   Úspawn_workerr�   )r2   Úold_addressr]   rf   r   r   s         r   r²   zArbiter.reload±  s  € Ø”hÔ&ˆð ””ð 
	ð 
	ˆAØ�D”HÔ%Ð%Ð%ð !%¤Ô 1°!Ô 4•”
˜1‘�ðÝœ
 1˜˜øÝð ð ð Ø�Dðøøøð 	Œ�ŠÑÔÐØ�
Š
�4”8ÑÔÐð 	Œ×ÒÑÔÐð ˜$œ(Ô*Ò*Ð*à”~ð ð �Ø—	’	‘”��å!Ô0°´¸4¼8ÑDÔDˆDŒNØŸHšHÐ%IÐ%I¸$¼.Ð%IÑ%IÔ%IÑJÔJˆMØŒH�MŠMÐ,¨mÑ<Ô<Ð<ð 	Œ×Ò˜4Ñ Ô Ð ð Œ<Ð#ØŒL×ÒÑ!Ô!Ð!ð Œ8ÔÐ'Ý" 4¤8Ô#3Ñ4Ô4ˆDŒLØŒL×Ò ¤Ñ)Ô)Ð)õ 	Ô˜=¨4¬>Ñ9Ñ:Ô:Ð:õ �t”xÔ'Ñ(Ô(ð 	 ð 	 ˆAØ×ÒÑÔÐÐð 	×ÒÑÔÐÐÐs   Á
AÁ
A%Á$A%c                 óè  — | j         sdS t          | j                             ¦   «         ¦  «        }|D ]¿\  }}	 t	          j        ¦   «         |j                             ¦   «         z
  | j         k    rŒ=n# t          t          f$ r Y ŒQw xY w|j
        sC| j                             d|¦  «         d|_
        |                      |t          j        ¦  «         ŒŸ|                      |t          j        ¦  «         ŒÀdS )z)        Kill unused/idle workers
        NzWORKER TIMEOUT (pid:%s)T)rS   Úlistræ   rY   rä   Ú	monotonicÚtmpÚlast_updaterÒ   Ú
ValueErrorÚabortedr%   ÚcriticalÚkill_workerr   ÚSIGABRTrç   )r2   rQ   rl   Úworkers       r   r    zArbiter.murder_workersè  s  € ð Œ|ð 	ØˆFÝ�t”|×)Ò)Ñ+Ô+Ñ,Ô,ˆØ$ð 	6ð 	6‰MˆS�&ðÝ”>Ñ#Ô# f¤j×&<Ò&<Ñ&>Ô&>Ñ>À$Ä,ÒNÐNØð Oøå�ZÐ(ð ð ð Ø�ðøøøð ”>ð 6Ø”×!Ò!Ð";¸SÑAÔAÐAØ!%�”Ø× Ò  ¥f¤nÑ5Ô5Ð5Ð5à× Ò  ¥f¤nÑ5Ô5Ð5Ð5ð	6ð 	6s   ¸6A0Á0BÂBc                 ó²  — 	 	 t          j        dt           j        ¦  «        \  }}|sdS | j        |k    r	d| _        �nl|dz	  }|dk    r| j                             d||¦  «         || j        k    rd}t          || j        ¦  «        ‚|| j        k    rd}t          || j        ¦  «        ‚|dk    r| j                             d||¦  «         n‹|dk    r…	 t          j
        |¦  «        j        }n%# t          $ r d	                     |¦  «        }Y nw xY wd
                     ||¦  «        }|t          j        k    r|dz  }| j                             |¦  «         | j                             |d¦  «        }|s�Œs|j                             ¦   «          | j                             | |¦  «         �Œ¨# t*          $ r!}|j        t,          j        k    r‚ Y d}~dS d}~ww xY w)z7        Reap workers to avoid zombie processes
        Tr›   r   é   z#Worker (pid:%s) exited with code %szWorker failed to boot.zApp failed to load.z$Worker (pid:%s) exited with code %s.zcode {}zWorker (pid:{}) was sent {}!z Perhaps out of memory?N)r!   ÚwaitpidÚWNOHANGr)   r%   r¢   ÚWORKER_BOOT_ERRORr   ÚAPP_LOAD_ERRORr   ÚSignalsr   r  rC   rç   ræ   rt   rÿ   rƒ   r:   Ú
child_exitrÒ   rÓ   ÚECHILD)	r2   ÚwpidÚstatusÚexitcoder—   Úsig_nameÚmsgr  rÖ   s	            r   r°   zArbiter.reap_workersý  s-  € ð1	ð-6Ý!œz¨"­b¬jÑ9Ô9‘��fØð Ø�EØ”? dÒ*Ð*Ø&'�D”O‘Oð
  &¨™{�HØ 1’}�}ØœŸšÐ'LÈdÐT\Ñ]Ô]Ð]Ø 4Ô#9Ò9Ð9Ø!9˜Ý(¨°Ô1GÑHÔHÐHØ 4Ô#6Ò6Ð6Ø!6˜Ý(¨°Ô1DÑEÔEÐEà !’|�|ð œŸšÐ'MØ'+¨Xñ7ô 7ð 7ð 7à !š˜ð@Ý'-¤~°fÑ'=Ô'=Ô'B˜H˜HøÝ)ð @ð @ð @Ø'0×'7Ò'7¸Ñ'?Ô'?˜H˜H˜Hð@øøøà<×CÒCØ  (ñ,ô ,˜ð "¥V¤^Ò3Ð3ØÐ#<Ñ<˜CØœŸš sÑ+Ô+Ð+à!œ\×-Ò-¨d°DÑ9Ô9�FØ!ð !Ù Ø”J×$Ò$Ñ&Ô&Ð&Ø”H×'Ò'¨¨fÑ5Ô5Ð5ñ[-6øõ\ ð 	ð 	ð 	ØŒw�%œ,Ò&Ð&Øð 'Ð&Ð&Ð&Ð&Ð&øøøøð	øøøsB   ‚%F+ ©B(F+ ÃC, Ã+F+ Ã,DÄF+ ÄDÄBF+ Æ+
GÆ5GÇGc                 ó:  — t          | j        ¦  «        | j        k     r|                      ¦   «          | j                             ¦   «         }t          |d„ ¬¦  «        }t          |¦  «        | j        k    rP|                     d¦  «        \  }}|                      |t          j	        ¦  «         t          |¦  «        | j        k    °Pt          |¦  «        }| j
        |k    r<|| _
        | j                             d                     |¦  «        d|ddœ¬¦  «         d	S d	S )
z[        Maintain the number of workers by spawning or killing
        as required.
        c                 ó   — | d         j         S rF   )Úage)Úws    r   rJ   z(Arbiter.manage_workers.<locals>.<lambda>=  s   € °°!´´€ r   rK   r   z{0} workerszgunicorn.workersÚgauge)Úmetricr<   Úmtype)ÚextraN)r�   ræ   rR   Úspawn_workersrY   rW   rt   r  r   rÊ   r$   r%   rU   rC   )r2   rQ   rl   r   Úactive_worker_counts        r   r�   zArbiter.manage_workers4  s%  € õ
 ˆtŒ|ÑÔ˜tÔ/Ò/Ð/Ø×ÒÑ Ô Ð à”,×$Ò$Ñ&Ô&ˆÝ˜Ð&8Ð&8Ð9Ñ9Ô9ˆÝ�'‰lŒl˜TÔ-Ò-Ð-Ø—{’{ 1‘~”~‰HˆS�!Ø×Ò˜S¥&¤.Ñ1Ô1Ð1õ �'‰lŒl˜TÔ-Ò-Ð-õ " '™lœlÐØÔ0Ð4GÒGÐGØ4GˆDÔ1ØŒH�NŠN˜=×/Ò/Ð0CÑDÔDØ,>Ø+>Ø+2ð"4ð "4ð ñ 5ô 5ð 5ð 5ð 5ð HÐGr   c           	      óø  — | xj         dz  c_         |                      | j         | j        | j        | j        | j        dz  | j        | j        ¦  «        }| j                             | |¦  «         t          j
        ¦   «         }|dk    r||_        || j        |<   |S | j                             ¦   «         D ]}|j                             ¦   «          Œt          j        ¦   «         |_        	 t!          j        d| j        z  ¦  «         | j                             d|j        ¦  «         | j                             | |¦  «         |                     ¦   «          t-          j        d¦  «         në# t0          $ r ‚ t2          $ r{}| j                             dd¬¦  «         t7          d	|z  t,          j        ¬
¦  «         t,          j                             ¦   «          t-          j        | j        ¦  «         Y d }~nad }~wt>          $ rQ | j                              d¦  «         |j!        st-          j        | j"        ¦  «         t-          j        d¦  «         Y nw xY w| j                             d|j        ¦  «         	 |j                             ¦   «          | j         #                    | |¦  «         d S # t>          $ r0 | j         $                    dtK          j&        ¦   «         ¦  «         Y d S w xY w# | j                             d|j        ¦  «         	 |j                             ¦   «          | j         #                    | |¦  «         w # t>          $ r/ | j         $                    dtK          j&        ¦   «         ¦  «         Y w w xY wxY w)NrG   g       @r   zworker [%s]zBooting worker with pid: %sz'Exception while loading the applicationTr™   z%s)ÚfilezException in worker processr›   zWorker exiting (pid: %s)z Exception during worker exit:
%s)'r(   rO   rl   rp   r3   rS   r:   r%   Úpre_forkr!   rð   ræ   Úvaluesrÿ   rƒ   rk   r   rœ   rT   rh   Ú	post_forkÚinit_processr-   rª   r¦   r   rU   ÚprintÚstderrÚflushr  r§   Ú	exceptionÚbootedr  Úworker_exitrï   Ú	tracebackÚ
format_exc)r2   r  rl   ÚsiblingrÖ   s        r   rú   zArbiter.spawn_workerJ  s‡  € ØˆŒ˜1ÑˆŒØ×"Ò" 4¤?°D´H¸d¼nØ#'¤8¨T¬\¸CÑ-?Ø#'¤8¨T¬Xñ7ô 7ˆð 	Œ×Ò˜$ Ñ'Ô'Ð'ÝŒg‰iŒiˆØ�!Š8ˆ8ØˆFŒJØ &ˆDŒL˜ÑØˆJð ”|×*Ò*Ñ,Ô,ð 	 ð 	 ˆGØŒK×ÒÑÔÐÐõ ”Y‘[”[ˆŒ
ð	9ÝÔ˜}¨t¬~Ñ=Ñ>Ô>Ð>ØŒH�MŠMÐ7¸¼ÑDÔDÐDØŒH×Ò˜t VÑ,Ô,Ð,Ø×ÒÑ!Ô!Ð!ÝŒH�Q‰KŒKˆKˆKøÝð 	ð 	ð 	ØÝð 	*ð 	*ð 	*ØŒH�NŠNÐDØ$(ð ñ *ô *ð *å�$˜‘(¥¤Ð,Ñ,Ô,Ð,ÝŒJ×ÒÑÔÐÝŒH�TÔ(Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)øøøøÝð 	ð 	ð 	ØŒH×ÒÐ<Ñ=Ô=Ð=Ø”=ð 1Ý”˜Ô/Ñ0Ô0Ð0ÝŒH�R‰LŒLˆLˆLˆLð		øøøð ŒH�MŠMÐ4°f´jÑAÔAÐAð9Ø”
× Ò Ñ"Ô"Ð"Ø”×$Ò$ T¨6Ñ2Ô2Ð2Ð2Ð2øÝð 9ð 9ð 9Ø”× Ò Ð!DÝ!*Ô!5Ñ!7Ô!7ñ9ô 9ð 9ð 9ð 9ð 9ð9øøøøð	 ŒH�MŠMÐ4°f´jÑAÔAÐAð9Ø”
× Ò Ñ"Ô"Ð"Ø”×$Ò$ T¨6Ñ2Ô2Ð2Ð2øÝð 9ð 9ð 9Ø”× Ò Ð!DÝ!*Ô!5Ñ!7Ô!7ñ9ô 9ð 9ð 9ð 9ð9øøøøøøsu   Ã'A?E' Å&K& Å'IÅ;A1G1Ç,K& Ç1AIÉK& ÉIÉK& É34J) Ê)6K#Ë"K#Ë&!M9Ì4L=Ì<M9Ì=6M6Í3M9Í5M6Í6M9c                 óÖ   — t          | j        t          | j        ¦  «        z
  ¦  «        D ]>}|                      ¦   «          t          j        dt          j        ¦   «         z  ¦  «         Œ?dS )z‰        Spawn new workers as needed.

        This is where a worker process leaves the main loop
        of the master process.
        rà   N)rr   rR   r�   ræ   rú   rä   rŸ   Úrandom)r2   r   s     r   r  zArbiter.spawn_workersx  sg   € õ �tÔ'­#¨d¬lÑ*;Ô*;Ñ;Ñ<Ô<ð 	.ð 	.ˆAØ×ÒÑÔÐÝŒJ�s�Vœ]™_œ_Ñ,Ñ-Ô-Ð-Ð-ð	.ð 	.r   c                 óˆ   — t          | j                             ¦   «         ¦  «        }|D ]}|                      ||¦  «         ŒdS )z^        Kill all workers with the signal `sig`
        :attr sig: `signal.SIG*` value
        N)rý   ræ   Úkeysr  )r2   r“   Úworker_pidsrl   s       r   rÂ   zArbiter.kill_workers„  sQ   € õ
 ˜4œ<×,Ò,Ñ.Ô.Ñ/Ô/ˆØð 	'ð 	'ˆCØ×Ò˜S #Ñ&Ô&Ð&Ð&ð	'ð 	'r   c                 ód  — 	 t          j        ||¦  «         dS # t          $ rŒ}|j        t          j        k    rq	 | j                             |¦  «        }|j                             ¦   «          | j	         
                    | |¦  «         Y d}~dS # t          t          f$ r Y Y d}~dS w xY w‚ d}~ww xY w)zj        Kill a worker

        :attr pid: int, worker pid
        :attr sig: `signal.SIG*` value
         N)r!   ÚkillrÒ   rÓ   ÚESRCHræ   rt   rÿ   rƒ   r:   r*  rø   )r2   rl   r“   rÖ   r  s        r   r  zArbiter.kill_worker�  sÒ   € ð	ÝŒG�C˜ÑÔÐÐÐøÝð 		ð 		ð 		ØŒw�%œ+Ò%Ð%ðØ!œ\×-Ò-¨cÑ2Ô2�FØ”J×$Ò$Ñ&Ô&Ð&Ø”H×(Ò(¨¨vÑ6Ô6Ð6Ø�F�F�F�F�FøÝ ¥'Ð*ð ð ð Ø�F�F�F�F�F�Fðøøøàøøøøð		øøøs2   ‚ ™
B/£B*¹ABÂB&ÂB*Â%B&Â&B*Â*B/)Nr   )T)2Ú__name__Ú
__module__Ú__qualname__Ú__doc__r  r  r1   rp   ræ   r‚   r�   ru   r‡   ÚdictÚdirr   r¡   r4   r8   r>   ÚpropertyrR   r&   r€   ro   r®   r‰   r³   rµ   r¸   r»   r¾   rÀ   rÄ   rÇ   rË   rž   r‘   r¥   rŸ   r¨   rÆ   r²   r    r°   r�   rú   r  rÂ   r  rH   r   r   r   r      sµ  € € € € € ðð ð Ðð €Nà€Ià€IØ€GØ€Dð €IðOð OØE×KÒKÑMÔMðOñ Oô O€Gà�ð ð Ø>A¸cÀ&¹k¼kðñ ô ñ ô €Ið

ð 
ð 
ð8!ð !ð !ð:ð :ð :ð �(Ð+Ð-=Ñ>Ô>€Kðð ð ð@/"ð /"ð /"ðb8ð 8ð 8ð,ð ð ð
*ð *ð *ðXð ð ð
ð ð ðð ð ðð ð ð
ð ð ð
ð ð ðð ð ð*ð *ð *ðð ð ð?ð ?ð ?ð?ð ?ð ?ð"ð ð ðð ð ð ðð ð ð&*ð *ð *ð *ð6 Gð  Gð  GðD5ð 5ð 5ðn6ð 6ð 6ð*5ð 5ð 5ðn5ð 5ð 5ð,,9ð ,9ð ,9ð\
.ð 
.ð 
.ð'ð 'ð 'ðð ð ð ð r   r   )rÓ   r!   r/  rÛ   r   r-   rä   r+  Úgunicorn.errorsr   r   Úgunicorn.pidfiler   Úgunicornr   r   r   r	   r
   r   rH   r   r   ú<module>r@     sî   ðð €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø $Ð $Ð $Ð $Ð $Ð $Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ðK
ð K
ð K
ð K
ð K
ñ K
ô K
ð K
ð K
ð K
r   