o
    Òó·iB*  ã                
   @   s   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZmZ zeedƒZeedƒZeed	ƒZeed
ƒZeedƒZW n eyY Z zeeƒ‚dZ[ww G dd„ deƒZe ee¡ eeeƒG dd„ de
jƒƒZdd„ ZddgZdS )am  
A kqueue()/kevent() based implementation of the Twisted main loop.

To use this reactor, start your application specifying the kqueue reactor::

   twistd --reactor kqueue ...

To install the event loop from code (and you should do this before any
connections, listeners or connectors are added)::

   from twisted.internet import kqreactor
   kqreactor.install()
é    N)Ú	AttributeÚ	InterfaceÚdeclarationsÚimplementer)ÚmainÚ	posixbase)ÚIReactorDaemonizeÚIReactorFDSet)ÚfailureÚlogÚ	KQ_EV_ADDÚKQ_EV_DELETEÚ	KQ_EV_EOFÚKQ_FILTER_READÚKQ_FILTER_WRITEc                   @   s    e Zd ZdZedƒZedƒZdS )Ú_IKQueuez2
    An interface for KQueue implementations.
    zAn implementation of kqueue(2).zAn implementation of kevent(2).N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚkqueueÚkevent© r   r   ú`C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/kqreactor.pyr   *   s    r   c                   @   s€   e Zd ZdZefdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdS )ÚKQueueReactoram  
    A reactor that uses kqueue(2)/kevent(2) and relies on Python 2.6 or higher
    which has built in support for kqueue in the select module.

    @ivar _kq: A C{kqueue} which will be used to check for I/O readiness.

    @ivar _impl: The implementation of L{_IKQueue} to use.

    @ivar _selectables: A dictionary mapping integer file descriptors to
        instances of L{FileDescriptor} which have been registered with the
        reactor.  All L{FileDescriptor}s which are currently receiving read or
        write readiness notifications will be present as values in this
        dictionary.

    @ivar _reads: A set containing integer file descriptors.  Values in this
        set will be registered with C{_kq} for read readiness notifications
        which will be dispatched to the corresponding L{FileDescriptor}
        instances in C{_selectables}.

    @ivar _writes: A set containing integer file descriptors.  Values in this
        set will be registered with C{_kq} for write readiness notifications
        which will be dispatched to the corresponding L{FileDescriptor}
        instances in C{_selectables}.
    c                 C   s8   || _ | j  ¡ | _tƒ | _tƒ | _i | _tj 	| ¡ dS )aŽ  
        Initialize kqueue object, file descriptor tracking dictionaries, and
        the base class.

        See:
            - http://docs.python.org/library/select.html
            - www.freebsd.org/cgi/man.cgi?query=kqueue
            - people.freebsd.org/~jlemon/papers/kqueue.pdf

        @param _kqueueImpl: The implementation of L{_IKQueue} to use. A
            hook for testing.
        N)
Ú_implr   Ú_kqÚsetÚ_readsÚ_writesÚ_selectablesr   ÚPosixReactorBaseÚ__init__)ÚselfZ_kqueueImplr   r   r   r"   Q   s   zKQueueReactor.__init__c                 C   s"   | j  | j |||¡gdd¡ dS )z°
        Private method for changing kqueue registration on a given FD
        filtering for events given filter/op. This will never block and
        returns nothing.
        r   N)r   Úcontrolr   r   )r#   ÚfdÚfilterÚopr   r   r   Ú_updateRegistratione   s   "z!KQueueReactor._updateRegistrationc                 C   s   | j  ¡  d| _ dS )zA
        Implement L{IReactorDaemonize.beforeDaemonize}.
        N)r   Úclose©r#   r   r   r   ÚbeforeDaemonizem   s   

zKQueueReactor.beforeDaemonizec                 C   sD   | j  ¡ | _| jD ]	}|  |tt¡ q	| jD ]	}|  |tt¡ qdS )z@
        Implement L{IReactorDaemonize.afterDaemonize}.
        N)	r   r   r   r   r(   r   r   r   r   )r#   r%   r   r   r   ÚafterDaemonize}   s   

ÿzKQueueReactor.afterDaemonizec              	   C   óŽ   |  ¡ }|| jvrEz/z	|  |tt¡ W n	 ty   Y nw W || j|< | j |¡ dS W || j|< | j |¡ dS || j|< | j |¡ w dS )z7
        Implement L{IReactorFDSet.addReader}.
        N)Úfilenor   r(   r   r   ÚOSErrorr    Úadd)r#   Úreaderr%   r   r   r   Ú	addReader‹   ó    
ÿÿ
ý

ÿùzKQueueReactor.addReaderc              	   C   r-   )z7
        Implement L{IReactorFDSet.addWriter}.
        N)r.   r   r(   r   r   r/   r    r0   )r#   Úwriterr%   r   r   r   Ú	addWriter™   r3   zKQueueReactor.addWriterc                 C   ó¶   d}z|  ¡ }W n ty   d}Y nw |dkr,| j ¡ D ]\}}||u r)d} q,qdS || jv rW| j |¡ || jvr@| j|= |sYz
|  |tt	¡ W dS  t
yV   Y dS w dS dS )z:
        Implement L{IReactorFDSet.removeReader}.
        FéÿÿÿÿTN)r.   ÚBaseExceptionr    Úitemsr   Úremover   r(   r   r   r/   )r#   r1   ÚwasLostr%   Úfdesr   r   r   ÚremoveReader§   ó2   ÿþ

ÿùzKQueueReactor.removeReaderc                 C   r6   )z:
        Implement L{IReactorFDSet.removeWriter}.
        Fr7   TN)r.   r8   r    r9   r   r:   r   r(   r   r   r/   )r#   r4   r;   r%   r<   r   r   r   ÚremoveWriterÁ   r>   zKQueueReactor.removeWriterc                    s,   ˆ   ‡ fdd„ˆ jD ƒ‡ fdd„ˆ jD ƒ¡S )z7
        Implement L{IReactorFDSet.removeAll}.
        c                    ó   g | ]}ˆ j | ‘qS r   ©r    ©Ú.0r%   r*   r   r   Ú
<listcomp>à   ó    z+KQueueReactor.removeAll.<locals>.<listcomp>c                    r@   r   rA   rB   r*   r   r   rD   á   rE   N)Z
_removeAllr   r   r*   r   r*   r   Ú	removeAllÛ   s   þzKQueueReactor.removeAllc                    ó   ‡ fdd„ˆ j D ƒS )z8
        Implement L{IReactorFDSet.getReaders}.
        c                    r@   r   rA   rB   r*   r   r   rD   è   rE   z,KQueueReactor.getReaders.<locals>.<listcomp>N)r   r*   r   r*   r   Ú
getReadersä   ó   zKQueueReactor.getReadersc                    rG   )z8
        Implement L{IReactorFDSet.getWriters}.
        c                    r@   r   rA   rB   r*   r   r   rD   î   rE   z,KQueueReactor.getWriters.<locals>.<listcomp>N)r   r*   r   r*   r   Ú
getWritersê   rI   zKQueueReactor.getWritersc              
   C   sª   |du rd}z| j  g t| jƒ|¡}W n ty- } z|jtjkr(W Y d}~dS ‚ d}~ww | j}|D ]}|j}z| j| }W n	 t	yH   Y q3w t
 |||||¡ q3dS )z1
        Poll the kqueue for new events.
        Né   )r   r$   Úlenr    r/   ÚerrnoZEINTRÚ_doWriteOrReadÚidentÚKeyErrorr   ZcallWithLogger)r#   ÚtimeoutÚeventsÚeZ_drdwÚeventr%   Ú
selectabler   r   r   ÚdoKEventð   s(   €ù	ý÷zKQueueReactor.doKEventc           
      C   sÂ   d}d}|j |j|j|jf\}}}}	|t@ r|r|	rtj}n6z"| ¡ dkr+d}tj	}n|t
kr5d}| ¡ }|tkr?d}| ¡ }W n tyS   t ¡ }t |d¡ Y nw |r_|  |||¡ dS dS )z’
        Private method called when a FD is ready for reading, writing or was
        lost. Do the work and raise errors where necessary.
        NFr7   TzSAn exception was raised from application code while processing a reactor selectable)r&   ÚflagsÚdataÚfflagsr   r   ZCONNECTION_LOSTr.   r   Z_NO_FILEDESCr   ZdoReadr   ZdoWriter8   r
   ZFailurer   ÚerrZ_disconnectSelectable)
r#   rU   r%   rT   ÚwhyZinReadr&   rW   rX   rY   r   r   r   rN     s<   ü€þü
ÿzKQueueReactor._doWriteOrReadN)r   r   r   r   Úselectr"   r(   r+   r,   r2   r5   r=   r?   rF   rH   rJ   rV   rN   ZdoIterationr   r   r   r   r   6   s     	)r   c                  C   s   t ƒ } ddlm} || ƒ dS )z'
    Install the kqueue() reactor.
    r   )ÚinstallReactorN)r   Ztwisted.internet.mainr]   )Úpr]   r   r   r   Úinstall:  s   r_   ) r   rM   r\   Zzope.interfacer   r   r   r   Ztwisted.internetr   r   Ztwisted.internet.interfacesr   r	   Ztwisted.pythonr
   r   Úgetattrr   r   r   r   r   ÚAttributeErrorrS   ÚImportErrorr   ZdirectlyProvidesr!   r   r_   Ú__all__r   r   r   r   Ú<module>   s2   



€ÿ	  
