o
    øT·jó2  ã                   @   sè   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
 ddlmZ ddlmZmZmZmZmZ edƒZG dd„ deƒZeeef Zeƒ Zed	 ed
< ddd„Ze e¡ G dd	„ d	ƒZG dd„ dejƒZdS )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)ÚCallable)Úsuppress)ÚAnyÚOptionalÚProtocolÚTypeVarÚUnionÚ_Tc                   @   s   e Zd Zdefdd„ZdS )Ú
_HasFilenoÚreturnc                 C   s   dS )Nr   © ©Úselfr   r   ú^/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/curl_cffi/_asyncio_selector.pyÚfileno    s   z_HasFileno.filenoN)Ú__name__Ú
__module__Ú__qualname__Úintr   r   r   r   r   r
      s    r
   ÚSelectorThreadÚ_selector_loopsr   c               	   C   s”   t D ]A} | j� d| _| j ¡  W d   ƒ n1 sw   Y  ttƒ� | j d¡ W d   ƒ n1 s4w   Y  | jd urC| j 	¡  qt  
¡  d S )NTó   a)r   Ú_select_condÚ_closing_selectorÚnotifyr   ÚBlockingIOErrorÚ_waker_wÚsendÚ_threadÚjoinÚclear)Úloopr   r   r   Ú_atexit_callback+   s   þ
ÿ

€r"   c                   @   s
  e Zd ZdZdZdejddfdd„Zd(dd	„Zde	j
d
 fdd„Zd(dd„Zd(dd„Zd(dd„Zd(dd„Zdee dee ddfdd„Zdedeeef ddfdd„Zdeded deddfd d!„Zdeded deddfd"d#„Zdedefd$d%„Zdedefd&d'„ZdS ))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                    s¢   |ˆ _ t ¡ ˆ _d ˆ _dˆ _d ˆ _ˆ  ¡ ˆ _d‡ fdd„‰ˆ j  	‡ ‡fdd„¡ i ˆ _
i ˆ _t ¡ \ˆ _ˆ _ˆ j d¡ ˆ j d¡ t ˆ ¡ ˆ  ˆ jˆ j¡ d S )NFr   c                   “   s   �ˆ j  ¡ I d H  d S ©N)Ú_thread_manager_handleÚ	__anext__r   r   r   r   Úthread_manager_anextV   s   €z5SelectorThread.__init__.<locals>.thread_manager_anextc                      s   ˆ j  ˆƒ ¡S r$   )Ú
_real_loopÚcreate_taskr   ©r   r'   r   r   Ú<lambda>_   s    z)SelectorThread.__init__.<locals>.<lambda>©r   N)r(   Ú	threadingÚ	Conditionr   Ú_select_argsr   r   Ú_thread_managerr%   Ú	call_soonÚ_readersÚ_writersÚsocketÚ
socketpairÚ_waker_rr   Úsetblockingr   ÚaddÚ
add_readerÚ_consume_waker©r   r#   r   r*   r   Ú__init__K   s$   
þ
ÿ
zSelectorThread.__init__c                 C   s�   | j rd S | j� d| _| j ¡  W d   ƒ n1 sw   Y  |  ¡  | jd ur.| j ¡  t | ¡ |  	| j
¡ | j
 ¡  | j ¡  d| _ d S )NT)Ú_closedr   r   r   Ú_wake_selectorr   r   r   ÚdiscardÚremove_readerr6   Úcloser   r   r   r   r   rA   m   s   þ





zSelectorThread.close)NNc                 C  sN   �t jdd| jd�| _| j ¡  |  ¡  zd V  W d S  ty&   |  ¡  ‚ w )NzTornado selectorT)ÚnameÚdaemonÚtarget)r-   ÚThreadÚ_run_selectr   ÚstartÚ_start_selectÚGeneratorExitrA   r   r   r   r   r0   |   s   €ý
þzSelectorThread._thread_managerc                 C   sD   | j rd S ttƒ� | j d¡ W d   ƒ d S 1 sw   Y  d S )Nr   )r=   r   r   r   r   r   r   r   r   r>   •   s
   
"ÿzSelectorThread._wake_selectorc                 C   s:   t tƒ� | j d¡ W d   ƒ d S 1 sw   Y  d S )Ni   )r   r   r6   Úrecvr   r   r   r   r:   ›   s   
"ÿzSelectorThread._consume_wakerc                 C   sb   | j �$ | jd u sJ ‚t| j ¡ ƒt| j ¡ ƒf| _| j  ¡  W d   ƒ d S 1 s*w   Y  d S r$   )r   r/   Úlistr2   Úkeysr3   r   r   r   r   r   rH   Ÿ   s
   "ýzSelectorThread._start_selectc              
   C   sJ  	 | j �8 | jd u r| js| j  ¡  | jd u r| jr| jr&	 W d   ƒ d S | jd us-J ‚| j\}}d | _W d   ƒ n1 s?w   Y  zt |||¡\}}}|| }W n2 ty† } z&|jttdtjƒkr{t | j	 
¡ gg g d¡\}}}|rzg }n‚ ‚ W Y d }~nd }~ww z| j | j||¡ W n ty›   Y n	 ty£   Y nw q)NTÚWSAENOTSOCKr   )r   r/   r   ÚwaitÚselectÚOSErrorÚerrnoÚgetattrÚEBADFr6   r   r(   Úcall_soon_threadsafeÚ_handle_selectÚRuntimeErrorÚAttributeError)r   Úto_readÚto_writeÚrsÚwsÚxsÚeÚ_r   r   r   rF   ¨   sB   
ÿü
ùü€ñüÇzSelectorThread._run_selectrZ   r[   c                 C   s<   |D ]	}|   || j¡ q|D ]	}|   || j¡ q|  ¡  d S r$   )Ú_handle_eventr2   r3   rH   )r   rZ   r[   ÚrÚwr   r   r   rU   è   s
   zSelectorThread._handle_selectÚfdÚcb_mapc                 C   s,   z|| }W n
 t y   Y d S w |ƒ  d S r$   )ÚKeyError)r   rb   rc   Úcallbackr   r   r   r_   ñ   s   ÿ
zSelectorThread._handle_eventre   ©.NÚargsc                 G   ó$   t j|g|¢R Ž | j|< |  ¡  d S r$   )Ú	functoolsÚpartialr2   r>   ©r   rb   re   rg   r   r   r   r9   ü   ó   zSelectorThread.add_readerc                 G   rh   r$   )ri   rj   r3   r>   rk   r   r   r   Ú
add_writer  rl   zSelectorThread.add_writerc                 C   ó.   z| j |= W n
 ty   Y dS w |  ¡  dS ©NFT)r2   rd   r>   ©r   rb   r   r   r   r@     ó   ÿzSelectorThread.remove_readerc                 C   rn   ro   )r3   rd   r>   rp   r   r   r   Úremove_writer  rq   zSelectorThread.remove_writerr,   )r   r   r   Ú__doc__r=   ÚasyncioÚAbstractEventLoopr<   rA   ÚtypingÚAsyncGeneratorr0   r>   r:   rH   rF   rK   Ú_FileDescriptorLikerU   Údictr   r_   r   r9   rm   Úboolr@   rr   r   r   r   r   r   >   sX    

"



	@ÿÿ
þ	þ
ý
üÿÿÿ
þÿÿÿ
þc                       s°   e Zd ZdZh d£Zdedef‡ fdd„Zdej	ddfd	d
„Z
ddd„Zddded deddfdd„Zddded deddfdd„Zdddefdd„Zdddefdd„Z‡  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.

    >   rA   Ú	_selectorr(   r9   rm   r@   rr   rB   r   c                    s"   |t jv rtƒ  |¡S t| j|ƒS r$   )r{   ÚMY_ATTRIBUTESÚsuperÚ__getattribute__rR   r(   )r   rB   ©Ú	__class__r   r   r   7  s   
z+AddThreadSelectorEventLoop.__getattribute__r#   Nc                 C   s   || _ t|ƒ| _d S r$   )r(   r   r|   r;   r   r   r   r<   <  s   z#AddThreadSelectorEventLoop.__init__c                 C   s   | j  ¡  | j ¡  d S r$   )r|   rA   r(   r   r   r   r   rA   @  s   
z AddThreadSelectorEventLoop.closerb   rx   re   rf   rg   c                 G   ó   | j j||g|¢R Ž S r$   )r|   r9   rk   r   r   r   r9   D  ó   z%AddThreadSelectorEventLoop.add_readerc                 G   r‚   r$   )r|   rm   rk   r   r   r   rm   L  rƒ   z%AddThreadSelectorEventLoop.add_writerc                 C   ó   | j  |¡S r$   )r|   r@   rp   r   r   r   r@   T  ó   z(AddThreadSelectorEventLoop.remove_readerc                 C   r„   r$   )r|   rr   rp   r   r   r   rr   W  r…   z(AddThreadSelectorEventLoop.remove_writerr,   )r   r   r   rs   r}   Ústrr   r   rt   ru   r<   rA   r   r9   rm   rz   r@   rr   Ú__classcell__r   r   r€   r   r{     s4    

þýü
ûþýü
ûr{   r,   )rs   rt   ÚatexitrQ   ri   rO   r4   r-   rv   Úcollections.abcr   Ú
contextlibr   r   r   r   r   r   r	   r
   r   rx   Úsetr   Ú__annotations__r"   Úregisterr   ru   r{   r   r   r   r   Ú<module>   s*    	

 \