
y X                 @   s#  d  d l  m Z d  d l Z d  d l Z y d  d l Z Wn e k
 rX e d   Yn Xe j d k  rw e d   n  d  d l m Z m	 Z	 d  d l
 m Z d  d	 l m Z d  d l Z d  d
 l m Z d  d l m Z d d   Z d d   Z d d   Z d d   Z Gd d   d e  Z d S)    )partialNz/You need eventlet installed to use this worker.	      zYou need eventlet >= 0.9.7)hubsgreenthread)GreenSocket)
trampoline)sendfile)AsyncWorkerc             C   sv   xo y t  |  | | |  SWq t k
 rm } z1 | j d t j k rX t |  d d n   WYd  d  } ~ Xq Xq Wd  S)Nr   writeT)
o_sendfileOSErrorargserrnoEAGAINr   )fdoutZfdinoffsetnbytese r   J/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/geventlet.py_eventlet_sendfile   s    r   c             C   s   t  j j |  } t  j j   } x yM |  j   \ } } | j | | |  } | j t | |  d \ } } } Wq$ t  j	 k
 r |  j
   | j   d SYq$ Xq$ Wd S)z
    Serve requests forever.

    This code is nearly identical to ``eventlet.convenience.serve`` except
    that it attempts to join the pool at the end, which allows for gunicorn
    graceful shutdowns.
    N)NNN)eventletZ	greenpoolZ	GreenPoolr   Z
getcurrentacceptspawnlink_eventlet_stop	StopServecloseZwaitall)sockhandleZconcurrencypoolZ	server_gtconnaddrgtr   r   r   _eventlet_serve'   s    

r%   c             C   sc   y  z |  j    Wd | j   XWn< t j k
 r7 Yn( t k
 r^ t j | t j    Yn Xd S)z
    Stop a greenlet handling a request and close its connection.

    This code is lifted from eventlet so as not to depend on undocumented
    functions in the library.
    N)	waitr   greenletZGreenletExit	Exceptionr   killsysexc_info)clientserverr"   r   r   r   r   >   s    r   c              C   s3   d d l  m }  t d  k	 r/ t |  d t  n  d  S)Nr   )wsgir	   )Zgunicorn.httpr.   r   setattrr   )r.   r   r   r   patch_sendfileP   s    r0   c                   sj   e  Z d  Z d d   Z   f d d   Z   f d d   Z d d   Z   f d	 d
   Z d d   Z   S)EventletWorkerc             C   s%   t  j   t j d d  t   d  S)NosF)r   Zuse_hubr   Zmonkey_patchr0   )selfr   r   r   patchY   s    
zEventletWorker.patchc                s!   |  j    t t |   j   d  S)N)r4   superr1   init_process)r3   )	__class__r   r   r6   ^   s    
zEventletWorker.init_processc                s#   t  j t t |   j | |  d  S)N)r   r   r5   r1   handle_quit)r3   sigframe)r7   r   r   r8   b   s    zEventletWorker.handle_quitc             C   s   t  j |  j j p d  d  S)NF)r   Timeoutcfg	keepalive)r3   r   r   r   timeout_ctxe   s    zEventletWorker.timeout_ctxc                sM   |  j  j r- t j | d d |  j  j } n  t t |   j | | |  d  S)Nserver_sideT)r<   Zis_sslr   Zwrap_sslZssl_optionsr5   r1   r    )r3   Zlistenerr,   r#   )r7   r   r   r    h   s    zEventletWorker.handlec             C   sA  g  } xq |  j  D]f } t |  } | j d  t |  j |  } t j t | | |  j  } | j	 |  t j
 d  q Wx$ |  j r |  j   t j
 d  q} W|  j   yD t j |  j j  ) } d d   | D d d   | D Wd  QXWnK t j k
 r<} z( | | k r  n  d d   | D WYd  d  } ~ Xn Xd  S)N   g        g      ?c             S   s%   g  |  ] } | j  t j     q Sr   )r)   r   r   ).0ar   r   r   
<listcomp>   s   	 z&EventletWorker.run.<locals>.<listcomp>c             S   s   g  |  ] } | j     q Sr   )r&   )rA   rB   r   r   r   rC      s   	 c             S   s   g  |  ] } | j     q Sr   )r)   )rA   rB   r   r   r   rC      s   	 )Zsocketsr   setblockingr   r    r   r   r%   Zworker_connectionsappendsleepalivenotifyr;   r<   Zgraceful_timeout)r3   Z	acceptorsr   ZgsockZhfunZacceptortter   r   r   runo   s*    

zEventletWorker.run)	__name__
__module____qualname__r4   r6   r8   r>   r    rK   r   r   )r7   r   r1   W   s   r1   )r   r   r   )	functoolsr   r   r*   r   ImportErrorRuntimeErrorversion_infor   r   Zeventlet.greenior   Zeventlet.hubsr   r'   Zgunicorn.http.wsgir	   r   Zgunicorn.workers.asyncr
   r   r%   r   r0   r1   r   r   r   r   <module>   s&   