B
    H/\                  @   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d e d< dgZG dd deZdd Ze  ddlmZ ee d dS )zO
Internal module, support for the linkable protocol for "event" like objects.

    )absolute_import)division)print_functionN)get_hub_noargs)InvalidSwitchError)TimeoutZgreenlet
getcurrentc               C   s   d S )N r	   r	   r	   8lib/python3.7/site-packages/gevent/_abstract_linkable.py<lambda>   s    r   greenlet_initAbstractLinkablec               @   sf   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
efddZdd ZdddZdS )r   )hub_links	_notifier_notify_all__weakref__c             C   s   t  | _d | _d| _d | _d S )NT)setr   r   r   r   )selfr	   r	   r
   __init__    s    zAbstractLinkable.__init__c             C   s
   t | jS )N)lenr   )r   r	   r	   r
   	linkcountH   s    zAbstractLinkable.linkcountc             C   s   t d S )N)NotImplementedError)r   r	   r	   r
   readyL   s    zAbstractLinkable.readyc             C   s<   |   r8| jr8| js8| jd kr&t | _| jj| j| _d S )N)r   r   r   r   get_hubZloopZrun_callback_notify_links)r   r	   r	   r
   _check_and_notifyP   s    
z"AbstractLinkable._check_and_notifyc             C   s.   t |std|f | j| |   dS )a   
        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.
        zExpected callable: %rN)callable	TypeErrorr   addr   )r   callbackr	   r	   r
   rawlinkX   s    zAbstractLinkable.rawlinkc             C   s*   | j | | j s&| jdk	r&| j  dS )z*Remove the callback set by :meth:`rawlink`N)r   discardr   stop)r   r    r	   r	   r
   unlinkf   s    zAbstractLinkable.unlinkc             C   s   | j }t| j}zxz|D ]r}| js,|  s,P || jkr8qz8y||  W n&   | jj|| fft   Y nX W d t	|dd r| 
| X qW W d | j |kstd | _ X | js|| jkr|   d S )NZauto_unlink)r   r   r   r   r   r   Zhandle_errorsysexc_infogetattrr$   AssertionErrorr   )r   ZnotifierZtodolinkr	   r	   r
   r   r   s$    


$zAbstractLinkable._notify_linksc             C   s   t  j}| | z~t|j}y6| jd kr4t | _| j }|| k	rTtd|f dS  |k
r } z||k	rr dS d }~X Y nX W d Q R X W d | | X d S )Nz$Invalid switch into Event.wait(): %rTF)	r   switchr!   r   Z_start_new_or_dummyr   r   r   r$   )r   timeoutZcatchr*   Ztimerresultexr	   r	   r
   
_wait_core   s     


 zAbstractLinkable._wait_corec             C   s   d S )Nr	   )r   ZwaitedZwait_successr	   r	   r
   _wait_return_value   s    z#AbstractLinkable._wait_return_valueNc             C   s*   |   r| ddS | |}| d|S )NFT)r   r/   r.   )r   r+   Zgotitr	   r	   r
   _wait   s    
zAbstractLinkable._wait)N)__name__
__module____qualname__	__slots__r   r   r   r   r!   r$   r   r   r.   r/   r0   r	   r	   r	   r
   r      s   (+c               C   s
   t   d S )N)r   r	   r	   r	   r
   _init   s    r5   )import_c_accelzgevent.__abstract_linkable)__doc__Z
__future__r   r   r   r%   Zgevent._hub_localr   r   Zgevent.exceptionsr   Zgevent.timeoutr   
__import__r   locals__all__objectr   r5   Zgevent._utilr6   globalsr	   r	   r	   r
   <module>   s     +