ó
ÐH/\c           @@ s¢  d  Z  d d l m Z m Z d d l Z d d l 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	 l m Z d d
 l m Z d d l m Z d d l m Z d d l m Z e j Z e j Z g  Z d e f d „  ƒ  YZ e e e e d d d g ƒ Z d d l m Z e Z d d l m  Z! e! j" Z" e j# Z$ e j% Z& d „  Z' d „  Z( d „  Z) e e ƒ d e f d „  ƒ  Yƒ Z* d S(   s   
libuv loop implementation
i    (   t   absolute_importt   print_functionN(   t   defaultdict(   t
   namedtuple(   t   delitem(   t   _dbg(   t   AbstractLoop(   t	   _corecffi(   t   assign_standard_callbacks(   t   AbstractCallbacks(   t   implementer(   t   ILoopt
   _Callbacksc           B@ s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C@ s,   t  j d | ƒ j } | r( |  j | ƒ Sd  S(   Ns   uv_handle_t*(   t   ffit   castt   datat   from_handlet   None(   t   selft   watcher_ptrt   loop_handle(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _find_loop_from_c_watcher   s    c         C@ s&   |  j  t j d | ƒ j ƒ j ƒ  d  S(   Ns   uv_handle_t*(   R   R   R   R   t   _sigchld_callback(   R   R   t   _signum(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   python_sigchld_callback"   s    c         C@ s   |  j  | ƒ S(   N(   t   python_prepare_callback(   R   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   python_timer0_callback%   s    c         C@ s/   | j  } |  j | ƒ } | j j | | ƒ d  S(   N(   R   R   t   loopt   _queue_callback(   R   R   t   reventst   watcher_handlet   the_watcher(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   python_queue_callback(   s    	(   t   __name__t
   __module__R   R   R   R    (    (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR      s   			R   R   R    (   t   EVENTS(   t   watcherc          C@ sD   t  j t j ƒ  ƒ }  t |  t ƒ s6 |  j d ƒ } n |  } d | S(   Nt   asciis   libuv-(   R   t   stringt   libuvt   uv_version_stringt
   isinstancet   strt   decode(   t   uv_bytest   uv_str(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   get_version?   s
    c           C@ s   d t  j t  j t  j f S(   Ns   libuv-%d.%d.%d(   R'   t   UV_VERSION_MAJORt   UV_VERSION_MINORt   UV_VERSION_PATCH(    (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   get_header_versionI   s    c           C@ s   d g S(   Nt   default(    (    (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   supported_backendsL   s    R   c           B@ sm  e  Z d  Z d" Z d Z d Z d Z e Z d" d" 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 e Z d „  Z e e d „ Z d „  Z  d „  Z! d „  Z" d" Z# d" Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) e* d" d  „ Z+ e* d" d! „ Z, RS(#   gü©ñÒMbP?s   uv_check_t *s   uv_prepare_t *s   void(*)(void*)c         C@ s†   t  j |  t t t | | ƒ t j ƒ  |  _ t t	 ƒ |  _
 t ƒ  |  _ t ƒ  |  _ t j ƒ  |  _ |  j t j ƒ  k |  _ g  |  _ d  S(   N(   R   t   __init__R   R'   t	   _watcherst   ost   getpidt   _loop__loop_pidR   t   listt   _child_watcherst   dictt   _io_watcherst   sett   _fork_watcherst   _pidt   _ptrt   uv_default_loopt   _defaultt   _queued_callbacks(   R   t   flagsR3   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR5   `   s    c         C@ s   |  j  j | | f ƒ d  S(   N(   RD   t   append(   R   R   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR   j   s    c         C@ sX   | d  k r t } n  | r* t j ƒ  } n t j ƒ  } | sK t d ƒ ‚ n  | | _ | S(   Ns   Failed to get loop(   R   t   TrueR'   RB   t   uv_loop_newt   SystemErrorR   (   R   RE   R3   t   ptr(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt
   _init_loopm   s    		c         C@ sµ   t  j |  j |  j ƒ t  j |  j t  j ƒ t  j |  j ƒ t j d ƒ |  _	 t  j
 |  j |  j	 ƒ |  j |  j	 _ t j d t  j ƒ } t  j |  j	 | d d ƒ t  j |  j	 ƒ d  S(   Ns   uv_timer_t*s   void(*)(uv_timer_t*)i,  (   R'   t   uv_check_initRA   t   _checkt   uv_check_startt   python_check_callbackt   uv_unrefR   t   newt   _signal_idlet   uv_timer_initt   _handle_to_selfR   R   t   uv_timer_start(   R   t   sig_cb(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _init_and_start_check†   s    c         C@ sk   t  j ƒ  } | |  j k rE | |  _ x |  j D] } | j ƒ  q. Wn  |  j ƒ  |  _ t t |  ƒ j	 ƒ  d  S(   N(
   R7   R8   R@   R?   t   _on_forkt   _loop__run_queued_callbackst   _prepare_ran_callbackst   superR   t   _run_callbacks(   R   t   curpidR$   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR\   ¢   s    	c         C@ s@   t  j |  j |  j ƒ t  j |  j t  j ƒ t  j |  j ƒ d  S(   N(   R'   t   uv_prepare_initRA   t   _preparet   uv_prepare_startR   RP   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _init_and_start_prepareÃ   s    c         C@ s   t  j |  j |  j ƒ d  S(   N(   R'   RL   RA   t   _timer0(   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _init_callback_timerÈ   s    c         C@ s   t  j |  j ƒ d  S(   N(   R'   t   uv_check_stopRb   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _stop_callback_timerË   s    c         C@ s   t  j |  j t  j ƒ d  S(   N(   R'   RN   Rb   R   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _start_callback_timerÎ   s    Vc         C@ s¡   |  j  s t ‚ |  j s t ‚ |  j s- t ‚ t j |  j  ƒ t j |  j  ƒ t j |  j ƒ t j |  j ƒ t j |  j ƒ t j |  j ƒ t j |  j	 ƒ d  S(   N(
   R_   t   AssertionErrorRM   RR   R'   t   uv_prepare_stopt   uv_refRd   t   uv_timer_stopRb   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _stop_aux_watchers'  s    c         C@ s   |  j  ƒ  t j |  j ƒ d  S(   N(   Rf   R'   Ri   Rb   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _setup_for_run_callback6  s    
c         C@ s   | j  S(   N(   R   (   R   RJ   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _can_destroy_loop;  s    c         C@ s&  t  j | _ t j | ƒ t j | ƒ t j | ƒ } | r« | t j k sP t ‚ t j	 | t j
 ƒ } | r t j	 | t j ƒ n  t j | ƒ } | d k s« t | ƒ ‚ n  t j |  j ƒ t j |  j ƒ t j |  j ƒ t j |  j ƒ |  ` |  ` |  ` |  ` t j | ƒ |  ` |  ` |  ` d  S(   Ni    (   R   t   NULLR   R'   t   uv_stopt   gevent_close_all_handlest   uv_loop_closet   UV_EBUSYRg   t   uv_runt   UV_RUN_ONCEt   UV_RUN_NOWAITt   gevent_zero_checkRM   Rb   t   gevent_zero_prepareR_   t   gevent_zero_timerRR   t   gevent_zero_loopR=   R?   R;   (   R   RJ   t   closed_failedt   ran_has_more_callbacks(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _destroy_loopC  s.    c         @ sb   t  d d d d d d d g ƒ ‰  g  ‰ ‡  ‡ f d †  } t j |  j t j d	 | ƒ t j ƒ ˆ S(
   sL   
        Return all the handles that are open and their ref status.
        t   HandleStatet   handlet   typeR$   t   reft   activet   closingc      	   @ s}   |  j  } | r! t j | ƒ } n d  } ˆ j ˆ  |  t j t j |  j ƒ ƒ | t j	 |  ƒ t j
 |  ƒ t j |  ƒ ƒ ƒ d  S(   N(   R   R   R   R   RF   R&   R'   t   uv_handle_type_nameR   t
   uv_has_reft   uv_is_activet   uv_is_closing(   R~   t   _argR   R$   (   t   handle_statet   handles(    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   walkw  s    	s   void(*)(uv_handle_t*,void*)(   R   R'   t   uv_walkRA   R   t   callbackRn   (   R   RŠ   (    (   Rˆ   R‰   s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   debugi  s    	
c         C@ s   d  S(   N(    (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR€   Š  s    c         C@ s   d  S(   N(    (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   unref  s    c         C@ s   t  j |  j ƒ d  S(   N(   R'   Ro   RA   (   R   t   how(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   break_‘  s    c         C@ s   t  j |  j ƒ d  S(   N(   R'   t   uv_loop_forkRA   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   reinit”  s    c         C@ sõ   |  j  s t St |  j  ƒ } g  |  _  xÉ | D]Á \ } } | j } | sc t j | ƒ s, t ‚ q, n  t j | | ƒ } | d k r” t j	 | | ƒ q, | d k r, t j | ƒ sí | j | k rÚ | j rç t j
 d  ƒ qç qê t j
 | ƒ qí q, q, Wt S(   Niÿÿÿÿi   (   RD   t   FalseR:   R   R'   R…   Rg   t
   _callbackst   python_callbackt   python_handle_errort   python_stopR   RG   (   R   t   cbsR   t   argR~   t   val(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   __run_queued_callbacks®  s&    				c         C@ sÒ   t  j } | r t  j } n  | r- t  j } n  | t  j k r¯ xl |  j rª |  j j rª |  j ƒ  t |  _ t  j	 |  j t  j ƒ } |  j
 ƒ  } | r? | r? |  j r? | Sq? Wd St  j	 |  j | ƒ } |  j
 ƒ  | S(   Ni    (   R'   t   UV_RUN_DEFAULTRt   Ru   RA   R   R\   R“   RZ   Rs   RY   (   R   t   nowaitt   oncet   modet
   ran_statust   ran_callbackst   result(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   runÈ  s"    	
	
c         C@ s   t  j |  j ƒ } | d S(   Ng     @@(   R'   t   uv_nowRA   (   R   t   now(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR¥   í  s    c         C@ s   t  j |  j ƒ d  S(   N(   R'   t   uv_update_timeRA   (   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt
   update_nowô  s    c         C@ s2   |  j  r. t j |  j  ƒ } | d k r. | Sn  d  S(   Ni    (   RA   R'   t   uv_backend_fd(   R   t   fd(    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   fileno÷  s    	c         C@ sq   |  j  s d  S|  j r d  St j d ƒ |  _ t j |  j |  j ƒ |  j |  j _ t j	 |  j t j
 t j ƒ d  S(   Ns   uv_signal_t*(   R3   t   _sigchld_watcherR   RQ   R'   t   uv_signal_initRA   RT   R   t   uv_signal_startR   t   signalt   SIGCHLD(   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   install_sigchld   s    		c         C@ sE   |  j  s |  j r d  St j |  j ƒ t j j |  j ƒ |  ` d  S(   N(   R3   R«   R'   t   uv_signal_stopR6   R$   t   _watcher_ffi_close(   R   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   reset_sigchld  s
    c         C@ s±   xª t  r¬ y t j t j ƒ \ } } } Wn t k
 r< Pn X| d k rM Pn  |  j j | g  ƒ |  j j d g  ƒ } x$ | D] } |  j | j | | ƒ q| Wg  |  j d <q Wd  S(   Ni    (	   RG   R7   t   wait3t   WNOHANGt   OSErrorR;   t   gett   run_callbackt   _set_waitpid_status(   R   t   pidt   statust   _usaget   children_watchersR$   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR     s    	(c         C@ s   |  j  | j j | ƒ d  S(   N(   R;   R@   RF   (   R   R$   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _register_child_watcher/  s    c         C@ sg   y |  j  | j j | ƒ Wn t k
 r. n Xx1 t |  j  ƒ D]  } |  j  | s? |  j  | =q? q? Wd  S(   N(   R;   R@   t   removet
   ValueErrorR:   (   R   R$   Rº   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   _unregister_child_watcher2  s    c         @ sˆ   |  j  ‰ y' ˆ ˆ  } | j s/ t d | ƒ ‚ WnH t k
 rz |  j j |  ˆ  d ƒ } | ˆ ˆ  <‡  ‡ f d †  | _ n X| j | ƒ S(   Ns)   IO Watcher %s unclosed but should be deadi    c           @ s   t  ˆ ˆ  ƒ S(   N(   R   (    (   R©   t   io_watchers(    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   <lambda>N  s    (   R=   t   _multiplex_watchersRg   t   KeyErrorR6   t   iot   _no_more_watcherst	   multiplex(   R   R©   t   eventsR€   t   priorityt
   io_watcher(    (   R©   RÂ   s0   lib/python2.7/site-packages/gevent/libuv/loop.pyRÆ   ?  s    	

c         C@ s   t  d ƒ ‚ d  S(   Nsh   prepare watchers are not currently supported in libuv. If you need them, please contact the maintainers.(   t	   TypeError(   R   R€   RÊ   (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   prepareR  s    N(-   R!   R"   t   approx_timer_resolutionR   t   error_handlert   _CHECK_POINTERt   _PREPARE_POINTERt   _PREPARE_CALLBACK_SIGt   _TIMER_POINTERR5   R   RK   RR   RW   R\   Ra   Rc   Re   Rf   Rk   Rl   Rm   R|   R   R€   RŽ   R   R’   R“   RZ   RY   R£   R¥   R§   Rª   R«   t   _sigchld_callback_ffiR°   R³   R   R¾   RÁ   RG   RÆ   RÍ   (    (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyR   O   sP   
				!				Y				&	!				%								(   R   N(   R   N(   R    N(+   t   __doc__t
   __future__R    R   R7   t   collectionsR   R   t   operatorR   R®   t   gevent._ffiR   t   gevent._ffi.loopR   t   gevent.libuvR   R   R	   t   gevent._utilR
   t   gevent._interfacesR   R   t   libR'   t   __all__R   R   R”   R#   t   GEVENT_CORE_EVENTSR$   R6   t   _events_to_strt   UV_READABLEt   READt   UV_WRITABLEt   WRITER.   R2   R4   R   (    (    (    s0   lib/python2.7/site-packages/gevent/libuv/loop.pyt   <module>   sB   							
		