
    CNh                     \    d Z ddlZddlZddlZddlmZ d Z G d dej                        Zy)z?
Asyncio-based hub, originally implemented by Miguel Grinberg.
    N)hubc                       y)z
    Indicate whether this hub is available, since some hubs are
    platform-specific.

    Python always has asyncio, so this is always ``True``.
    T r       7/usr/lib/python3/dist-packages/eventlet/hubs/asyncio.pyis_availabler      s     r   c                   V     e Zd ZdZ fdZ fdZd Z fdZ fdZ fdZ	d Z
 xZS )	Hubz?An Eventlet hub implementation on top of an asyncio event loop.c                     t         |           t        j                         | _        t        j
                  | j                         t        j                         | _        y )N)super__init__asyncionew_event_looploopset_event_loopEventsleep_event)self	__class__s    r   r   zHub.__init__   s@     **,	tyy)"==?r   c                 X    t         |   |       | j                  j                          y)zX
        Register a ``Timer``.

        Typically not called directly by users.
        N)r   	add_timerr   set)r   timerr   s     r   r   zHub.add_timer!   s$     	% r   c                     	  ||       | j                  j                          y# | j                   $ r   | j                  |t        j                                Y RxY w)zU
        Callback called by ``asyncio`` when a file descriptor has an event.
        N)SYSTEM_EXCEPTIONSsquelch_exceptionsysexc_infor   r   )r   cbfilenos      r   _file_cbzHub._file_cb*   sR    	;vJ
 		 %% 		;""63<<>:s	   % 5Ac                    	 t        j                  |       | j                  |   j                  |      du}t        |   |||||      }|se|t        j                  k(  r*| j                  j                  || j                  ||       |S | j                  j                  || j                  ||       |S # t        $ r t        d      w xY w)z
        Add a file descriptor of given event type to the ``Hub``.  See the
        superclass for details.

        Typically not called directly by users.
        zInvalid file descriptorN)osfstatOSError
ValueError	listenersgetr   addr   READr   
add_readerr!   
add_writer)	r   evtyper    r   tbmark_as_closedalready_listeninglistenerr   s	           r   r)   zHub.add6   s    	8HHV !NN6266v>dJ7;vvr2~F !		$$VT]]BG  		$$VT]]BG  	8677	8s   B4 4C	c                 &   t         |   |       |j                  }|j                  }| j                  |   j                  |      sK|t        j                  k(  r| j                  j                  |       y| j                  j                  |       yy)z
        Remove a listener from the ``Hub``.  See the superclass for details.

        Typically not called directly by users.
        N)r   remover-   r    r'   r(   r   r*   r   remove_readerremove_writer)r   r1   r-   r    r   s       r   r3   z
Hub.removeJ   so     	x ~~f%))&1!		''/		''/	 2r   c                 J   | j                   t        j                     j                  |      }| j                   t        j                     j                  |      }t
        |   |       |r| j                  j                  |       |r| j                  j                  |       yy)zv
        Remove a file descriptor from the ``asyncio`` loop.

        Typically not called directly by users.
        N)
r'   r   r*   r(   WRITEr   remove_descriptorr   r4   r5   )r   r    	have_read
have_writer   s       r   r8   zHub.remove_descriptorY   s{     NN388,008	^^CII.226:
!&)II##F+II##F+ r   c                 P      fd} j                   j                   |              y)zL
        Start the ``Hub`` running. See the superclass for details.
        c                    K   j                   rt        d      	 d_         d_        j                  sXj                  rj	                          j                  rj                          j                  rj                          j                  j                                j                  rj                          j                          j                         } | j                         }n| j                         z
  }|dkD  rR	 t        j                  j                  j!                         |       d {    j                  j%                          nt        j&                  d       d {    j                  sXd_        j*                  d d = j,                  d d = 	 d_         d_        y 7 # t        j"                  $ r Y w xY w7 b# d_         d_        w xY ww)NzAlready running!TFr   )runningRuntimeErrorstoppingclosed	close_oneprepare_timersdebug_blockingblock_detect_prefire_timersclockblock_detect_postsleep_untildefault_sleepr   wait_forr   waitTimeoutErrorclearsleeptimers_canceledtimersnext_timers)wakeup_when
sleep_timer   s     r   	async_runzHub.run.<locals>.async_runk   s    ||"#566"&# %--++( ++ '')**--/$$TZZ\2**..0'')"&"2"2"4K"*%)%7%7%9
%04::<%?
!A~!")"2"243C3C3H3H3J3=#? ? ? ((..0%mmA...1 --4 ,-D(A((+$ %?&33 ! ! /  % %sl   G4AG!  B2G! 1G GG 	3G! <G=G! %G! 5G4G GG! GG! !G11G4N)r   run_until_complete)r   akwrT   s   `   r   runzHub.rung   s    %	&N 			$$Y[1r   )__name__
__module____qualname____doc__r   r   r!   r)   r3   r8   rX   __classcell__)r   s   @r   r
   r
      s)    I+
(0,+2r   r
   )	r\   r   r#   r   eventlet.hubsr   r   BaseHubr
   r   r   r   <module>r`      s/     	 
 |2#++ |2r   