σ
ΠH/\c           @` sλ   d  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 e d	  j e   d
 <d   e   d <d g Z d e f d     YZ d   Z e   d d l m Z e e   d  d S(   sO   
Internal module, support for the linkable protocol for "event" like objects.

i    (   t   absolute_import(   t   division(   t   print_functionN(   t   get_hub_noargs(   t   InvalidSwitchError(   t   Timeoutt   greenlett
   getcurrentc           C` s   d  S(   N(   t   None(    (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   <lambda>   s    t   greenlet_initt   AbstractLinkablec           B` sn   e  Z d Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z	 e
 d  Z d   Z d d  Z RS(   t   hubt   _linkst	   _notifiert   _notify_allt   __weakref__c         C` s+   t    |  _ d  |  _ t |  _ d  |  _ d  S(   N(   t   setR   R   R   t   TrueR   R   (   t   self(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   __init__    s    		c         C` s   t  |  j  S(   N(   t   lenR   (   R   (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt	   linkcountH   s    c         C` s
   t   d  S(   N(   t   NotImplementedError(   R   (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   readyL   s    c         C` s_   |  j    r[ |  j r[ |  j r[ |  j d  k r= t   |  _ n  |  j j j |  j  |  _ n  d  S(   N(	   R   R   R   R   R   t   get_hubt   loopt   run_callbackt   _notify_links(   R   (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   _check_and_notifyP   s    c         C` s@   t  |  s" t d | f   n  |  j j |  |  j   d S(   s   
        Register a callback to call when this object is ready.

        *callback* will be called in the :class:`Hub
        <gevent.hub.Hub>`, so it must not use blocking gevent API.
        *callback* will be passed one argument: this instance.
        s   Expected callable: %rN(   t   callablet	   TypeErrorR   t   addR   (   R   t   callback(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   rawlinkX   s    c         C` s=   |  j  j |  |  j  r9 |  j d k	 r9 |  j j   n  d S(   s*   Remove the callback set by :meth:`rawlink`N(   R   t   discardR   R   t   stop(   R   R!   (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   unlinkf   s    c         C` s
  |  j  } t |  j  } z¦ x | D] } |  j rC |  j   rC Pn  | |  j k rX q" n  z; y | |   Wn& |  j j | |  f t j    n XWd  t	 | d d   rΈ |  j |  n  Xq" WWd  |  j  | k sΦ t  d  |  _  X|  j r| |  j k r|  j   n  d  S(   Nt   auto_unlink(   R   R   R   R   R   R   t   handle_errort   syst   exc_infot   getattrR   R%   t   AssertionErrorR   (   R   t   notifiert   todot   link(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyR   r   s&    	 '
c      	   C` sΚ   t    j } |  j |  z t j |   } yW |  j d  k rO t   |  _ n  |  j j   } | |  k	 r t d | f   n  t	 SWn& | k
 r­ } | | k	 r©   n  t
 SXWd  QXWd  |  j |  Xd  S(   Ns$   Invalid switch into Event.wait(): %r(   R   t   switchR"   R   t   _start_new_or_dummyR   R   R   R   R   t   FalseR%   (   R   t   timeoutt   catchR/   t   timert   resultt   ex(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt
   _wait_core   s     c         C` s   d  S(   N(   R   (   R   t   waitedt   wait_success(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   _wait_return_valueΆ   s    c         C` s;   |  j    r |  j t t  S|  j |  } |  j t |  S(   N(   R   R:   R1   R7   R   (   R   R2   t   gotit(    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   _waitΌ   s    (   R   R   R   R   R   N(   t   __name__t
   __module__t	   __slots__R   R   R   R   R"   R%   R   R   R7   R:   R   R<   (    (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyR      s   	(						+	c           C` s   t    d  S(   N(   R
   (    (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   _initΓ   s    (   t   import_c_accels   gevent.__abstract_linkable(   t   __doc__t
   __future__R    R   R   R(   t   gevent._hub_localR   R   t   gevent.exceptionsR   t   gevent.timeoutR   t
   __import__R   t   localst   __all__t   objectR   R@   t   gevent._utilRA   t   globals(    (    (    s8   lib/python2.7/site-packages/gevent/_abstract_linkable.pyt   <module>   s   	ͺ	