
    >OOf2                     6   U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZmZmZ  ed      Z G d de      Zeeef   Z e       Zed   ed<   dd	Z ej6                  e        G d
 d      Z G d dej:                        Zy)a  Ensure asyncio selector methods (add_reader, etc.) are available
tornado 6.1 adds AddThreadSelectorEventLoop event loop,
running select in a thread and defining these methods on the running event loop.
This factors out the functionality of AddThreadSelectorEventLoop
into a standalone SelectorThread object which can be attached to any running event loop.
Vendored from tornado v6.4.0
Redistributed under license Apache-2.0
    N)
AnyCallableDictListOptionalProtocolSetTupleTypeVarUnion_Tc                       e Zd ZdefdZy)
_HasFilenoreturnc                      y)Nr    selfs    \/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/curl_cffi/_asyncio_selector.pyfilenoz_HasFileno.fileno#   s        N)__name__
__module____qualname__intr   r   r   r   r   r   "   s     r   r   SelectorThread_selector_loopsc                  j   t         D ]{  } | j                  5  d| _        | j                  j                          d d d        	 | j                  j                  d       | j                  b| j                  j                          } t         j                          y # 1 sw Y   cxY w# t        $ r Y Uw xY w)NT   a)
r   _select_cond_closing_selectornotify_waker_wsendBlockingIOError_threadjoinclear)loops    r   _atexit_callbackr*   .   s       	'%)D"$$&	'	MMt$ <<#
 LL  	' 	'
  		s   "BB&B#	&	B21B2c                       e Zd ZdZdZdej                  ddfdZddZde	j                  d   fd	Zdd
ZddZddZddZdee   dee   ddfdZdedeeef   ddfdZdeded   deddfdZdeded   deddfdZdedefdZdedefdZy)r   aq  Define ``add_reader`` methods to be called in a background select thread.

    Instances of this class start a second thread to run a selector.
    This thread is completely hidden from the user;
    all callbacks are run on the wrapped event loop's thread.

    Typically used via ``AddThreadSelectorEventLoop``,
    but can be attached to a running asyncio loop.
    F	real_loopr   Nc                 &    | _         t        j                          _        d  _        d _        d  _         j                          _        d fd j                   j                   fd       i  _
        i  _        t        j                         \   _         _         j                  j!                  d        j                  j!                  d       t"        j%                           j'                   j                   j(                         y )NFc                  V   K    j                   j                          d {    y 7 wN)_thread_manager_handle	__anext__r   s   r   thread_manager_anextz5SelectorThread.__init__.<locals>.thread_manager_anext[   s!      --77999s   )')c                  D     j                   j                                S r/   )
_real_loopcreate_task)r   r2   s   r   <lambda>z)SelectorThread.__init__.<locals>.<lambda>c   s    $//*E*EFZF\*] r   r   N)r4   	threading	Conditionr    _select_argsr!   r&   _thread_managerr0   	call_soon_readers_writerssocket
socketpair_waker_rr#   setblockingr   add
add_reader_consume_waker)r   r,   r2   s   ` @r   __init__zSelectorThread.__init__P   s    #%//1 	 "'37&*&:&:&<#	: 	!!"]^=?=? (.'8'8':$t}!!%(!!%(D!t':':;r   c                    | j                   ry | j                  5  d| _        | j                  j                          d d d        | j	                          | j
                  | j
                  j                          t        j                  |        | j                  | j                         | j                  j                          | j                  j                          d| _         y # 1 sw Y   xY w)NT)_closedr    r!   r"   _wake_selectorr&   r'   r   discardremove_readerrA   closer#   r   s    r   rL   zSelectorThread.closep   s    << 	'%)D"$$&	' 	<<#LL%4==)	' 	's   "C&&C/)NNc                   K   t        j                  dd| j                        | _        | j                  j	                          | j                          	 d  y # t        $ r | j                           w xY ww)NzTornado selectorT)namedaemontarget)r8   Thread_run_selectr&   start_start_selectGeneratorExitrL   r   s    r   r;   zSelectorThread._thread_manager   sk      !''###

 	
	  	JJL	s   AA9A A9A66A9c                 t    | j                   ry 	 | j                  j                  d       y # t        $ r Y y w xY w)Nr   )rH   r#   r$   r%   r   s    r   rI   zSelectorThread._wake_selector   s5    <<	MMt$ 		s   + 	77c                 Z    	 | j                   j                  d       y # t        $ r Y y w xY w)Ni   )rA   recvr%   r   s    r   rE   zSelectorThread._consume_waker   s+    	MMt$ 		s    	**c                 ,   | j                   5  | j                  J t        | j                  j	                               t        | j
                  j	                               f| _        | j                   j                          d d d        y # 1 sw Y   y xY wr/   )r    r:   listr=   keysr>   r"   r   s    r   rT   zSelectorThread._start_select   sw      	'$$,,,!%dmm&8&8&:!;T$--BTBTBV=W XD$$&	' 	' 	's   A4B

Bc                    	 | j                   5  | j                  ?| j                  s3| j                   j                          | j                  | j                  s3| j                  r
	 d d d        y | j                  J | j                  \  }}d | _        d d d        	 t	        j                  |      \  }}}||z   }	 | j                  j                  | j                  ||       # 1 sw Y   SxY w# t
        $ rr}|j                  t        t        dt        j                        k(  r;t	        j                  | j                  j                         gg g d      \  }}}|rg }n  Y d }~d }~ww xY w# t        $ r Y t        $ r Y w xY w)NWSAENOTSOCKr   )r    r:   r!   waitselectOSErrorerrnogetattrEBADFrA   r   r4   call_soon_threadsafe_handle_selectRuntimeErrorAttributeError)r   to_readto_writerswsxse_s           r   rR   zSelectorThread._run_select   s{   "" )''/8N8N%%**, ''/8N8N))	) )
 ((444$($5$5!$(!)  $]]7HhG
B"W,44T5H5H"bQc ) )4   77ge]EKKHH%}}dmm.B.B.D-Er2qQHB1	 .    !  	sI   AC&C&0$C& C2 >'E0 &C/2	E-;A(E((E-0	F;FFrj   rk   c                     |D ]  }| j                  || j                           |D ]  }| j                  || j                           | j                          y r/   )_handle_eventr=   r>   rT   )r   rj   rk   rws        r   re   zSelectorThread._handle_select   sT     	1Aq$--0	1 	1Aq$--0	1r   fdcb_mapc                 <    	 ||   } |        y # t         $ r Y y w xY wr/   )KeyError)r   rs   rt   callbacks       r   rp   zSelectorThread._handle_event   s+    
	bzH 	
  		s    	rw   .Nargsc                 j    t        j                  |g| | j                  |<   | j                          y r/   )	functoolspartialr=   rI   r   rs   rw   ry   s       r   rD   zSelectorThread.add_reader  .     &--h>>br   c                 j    t        j                  |g| | j                  |<   | j                          y r/   )r{   r|   r>   rI   r}   s       r   
add_writerzSelectorThread.add_writer  r~   r   c                 ^    	 | j                   |= | j                          y# t        $ r Y yw xY wNFT)r=   rv   rI   r   rs   s     r   rK   zSelectorThread.remove_reader  8    	b! 	  		     	,,c                 ^    	 | j                   |= | j                          y# t        $ r Y yw xY wr   )r>   rv   rI   r   s     r   remove_writerzSelectorThread.remove_writer  r   r   r7   )r   r   r   __doc__rH   asyncioAbstractEventLooprF   rL   typingAsyncGeneratorr;   rI   rE   rT   rR   r   _FileDescriptorLikere   r   r   rp   r   rD   r   boolrK   r   r   r   r   r   r   C   s(    G<'";"; < <@v'<'<Z'H 2'>@&9!: EX@Y ^b 		 ((23	 
		%19)1DMP	%19)1DMP	 3   3  r   c                        e Zd ZdZh dZdedef fdZdej                  ddfdZ
dd	Zd
dded   deddfdZd
dded   deddfdZd
ddefdZd
ddefdZ xZS )AddThreadSelectorEventLoopa  Wrap an event loop to add implementations of the ``add_reader`` method family.

    Instances of this class start a second thread to run a selector.
    This thread is completely hidden from the user; all callbacks are
    run on the wrapped event loop's thread.

    This class is used automatically by Tornado; applications should not need
    to refer to it directly.

    It is safe to wrap any event loop with this class, although it only makes sense
    for event loops that do not implement the ``add_reader`` family of methods
    themselves (i.e. ``WindowsProactorEventLoop``)

    Closing the ``AddThreadSelectorEventLoop`` also closes the wrapped event loop.

    >   rL   	_selectorr4   rD   r   rK   r   rN   r   c                 r    |t         j                  v rt        |   |      S t	        | j
                  |      S r/   )r   MY_ATTRIBUTESsuper__getattribute__rb   r4   )r   rN   	__class__s     r   r   z+AddThreadSelectorEventLoop.__getattribute__<  s3    -;;;7+D11t--r   r,   Nc                 2    || _         t        |      | _        y r/   )r4   r   r   )r   r,   s     r   rF   z#AddThreadSelectorEventLoop.__init__A  s    #'	2r   c                 l    | j                   j                          | j                  j                          y r/   )r   rL   r4   r   s    r   rL   z AddThreadSelectorEventLoop.closeE  s"    r   rs   r   rw   rx   ry   c                 >     | j                   j                  ||g| S r/   )r   rD   r}   s       r   rD   z%AddThreadSelectorEventLoop.add_readerI  "     )t~~((X===r   c                 >     | j                   j                  ||g| S r/   )r   r   r}   s       r   r   z%AddThreadSelectorEventLoop.add_writerQ  r   r   c                 8    | j                   j                  |      S r/   )r   rK   r   s     r   rK   z(AddThreadSelectorEventLoop.remove_readerY      ~~++B//r   c                 8    | j                   j                  |      S r/   )r   r   r   s     r   r   z(AddThreadSelectorEventLoop.remove_writer\  r   r   r7   )r   r   r   r   r   strr   r   r   r   rF   rL   r   rD   r   r   rK   r   __classcell__)r   s   @r   r   r     s    &M.S .S .
3'";"; 3 3 >!> 9%> 	>
 
>>!> 9%> 	>
 
>0 5 0$ 00 5 0$ 0r   r   r7   )r   r   atexitra   r{   r_   r?   r8   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   setr   __annotations__r*   registerr   r   r   r   r   r   <module>r      s              T] 
 CO,  *-%& .$   !X Xv?0!:!: ?0r   