HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/twisted/internet/__pycache__/kqreactor.cpython-38.pyc
U

��W[4(�@s�dZddlmZmZddlZddlZddlmZmZddlmZm	Z	m
Z
ddlmZm
Z
mZmZddlmZmZddlmZmZdd	lmZmZGd
d�de�Ze
�ee�eee�Gdd
�d
ej��Zdd�Zd
dgZdS)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()
�)�division�absolute_importN)�KQ_FILTER_READ�KQ_FILTER_WRITE)�KQ_EV_DELETE�	KQ_EV_ADD�	KQ_EV_EOF)�implementer�declarations�	Interface�	Attribute)�main�	posixbase)�
IReactorFDSet�IReactorDaemonize)�log�failurec@s eZdZdZed�Zed�ZdS)�_IKQueuez2
    An interface for KQueue implementations.
    zAn implementation of kqueue(2).zAn implementation of kevent(2).N)�__name__�
__module__�__qualname__�__doc__r�kqueue�kevent�rr�</usr/lib/python3/dist-packages/twisted/internet/kqreactor.pyr#src@s�eZdZdZefdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZeZdS)�
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}.
    cCs8||_|j��|_t�|_t�|_i|_tj�	|�dS)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_kqueueImplrrrr$Is
zKQueueReactor.__init__cCs"|j�|j�|||�gdd�dS)z�
        Private method for changing kqueue registration on a given FD
        filtering for events given filter/op. This will never block and
        returns nothing.
        rN)r�controlrr)r%�fd�filter�oprrr�_updateRegistration^sz!KQueueReactor._updateRegistrationcCs|j��d|_dS)zA
        Implement L{IReactorDaemonize.beforeDaemonize}.
        N)r�close�r%rrr�beforeDaemonizegs
zKQueueReactor.beforeDaemonizecCsD|j��|_|jD]}|�|tt�q|jD]}|�|tt�q,dS)z@
        Implement L{IReactorDaemonize.afterDaemonize}.
        N)	rrrr r*rrr!r)r%r'rrr�afterDaemonizexs


zKQueueReactor.afterDaemonizec	Cs\|��}||jkrXz,z|�|tt�Wntk
r:YnXW5||j|<|j�|�XdS)z7
        Implement L{IReactorFDSet.addReader}.
        N)�filenor r"�addr*rr�OSError)r%�readerr'rrr�	addReader�s


zKQueueReactor.addReaderc	Cs\|��}||jkrXz,z|�|tt�Wntk
r:YnXW5||j|<|j�|�XdS)z7
        Implement L{IReactorFDSet.addWriter}.
        N)r/r!r"r0r*rrr1)r%�writerr'rrr�	addWriter�s


zKQueueReactor.addWritercCs�d}z|��}Wnd}YnX|dkrR|j��D]\}}||kr4d}qRq4dS||jkr�|j�|�||jkrz|j|=|s�z|�|tt�Wnt	k
r�YnXdS)z:
        Implement L{IReactorFDSet.removeReader}.
        F���TN)
r/r"�itemsr �remover!r*rrr1)r%r2�wasLostr'�fdesrrr�removeReader�s(


zKQueueReactor.removeReadercCs�d}z|��}Wnd}YnX|dkrR|j��D]\}}||kr4d}qRq4dS||jkr�|j�|�||jkrz|j|=|s�z|�|tt�Wnt	k
r�YnXdS)z:
        Implement L{IReactorFDSet.removeWriter}.
        Fr6TN)
r/r"r7r!r8r r*rrr1)r%r4r9r'r:rrr�removeWriter�s(


zKQueueReactor.removeWritercs,���fdd��jD��fdd��jD��S)z7
        Implement L{IReactorFDSet.removeAll}.
        csg|]}�j|�qSr�r"��.0r'r,rr�
<listcomp>�sz+KQueueReactor.removeAll.<locals>.<listcomp>csg|]}�j|�qSrr=r>r,rrr@�s)Z
_removeAllr r!r,rr,r�	removeAll�s�zKQueueReactor.removeAllcs�fdd��jD�S)z8
        Implement L{IReactorFDSet.getReaders}.
        csg|]}�j|�qSrr=r>r,rrr@�sz,KQueueReactor.getReaders.<locals>.<listcomp>)r r,rr,r�
getReaders�szKQueueReactor.getReaderscs�fdd��jD�S)z8
        Implement L{IReactorFDSet.getWriters}.
        csg|]}�j|�qSrr=r>r,rrr@�sz,KQueueReactor.getWriters.<locals>.<listcomp>)r!r,rr,r�
getWriters�szKQueueReactor.getWritersc
Cs�|dkrd}z|j�gt|j�|�}Wn:tk
r`}z|jtjkrNWY�
dS�W5d}~XYnX|j}|D]D}|j}z|j|}Wnt	k
r�YqlYqlXt
�|||||�qldS)z1
        Poll the kqueue for new events.
        N�)rr&�lenr"r1�errnoZEINTR�_doWriteOrReadZident�KeyErrorrZcallWithLogger)r%ZtimeoutZevents�eZ_drdw�eventr'�
selectablerrr�doKEvent�s 

zKQueueReactor.doKEventc
Cs�d}d}|j|j|j|jf\}}}}	|t@r<|r<|	r<tj}nfzD|��dkrVd}tj	}n(|t
krjd}|��}|tkr~d}|�
�}Wn t��}t�|d�YnX|r�|�|||�dS)z�
        Private method called when a FD is ready for reading, writing or was
        lost. Do the work and raise errors where necessary.
        NFr6TzSAn exception was raised from application code while processing a reactor selectable)r(�flags�data�fflagsrr
ZCONNECTION_LOSTr/rZ_NO_FILEDESCrZdoReadrZdoWriterZFailurer�errZ_disconnectSelectable)
r%rKr'rJZwhyZinReadr(rMrNrOrrrrGs0�zKQueueReactor._doWriteOrReadN)rrrr�selectr$r*r-r.r3r5r;r<rArBrCrLrGZdoIterationrrrrr.s		"rcCst�}ddlm}||�dS)z'
    Install the kqueue() reactor.
    r)�installReactorN)rZtwisted.internet.mainrR)�prRrrr�install7srT)rZ
__future__rrrFrQrrrrrZzope.interfacer	r
rrZtwisted.internetr
rZtwisted.internet.interfacesrrZtwisted.pythonrrrZdirectlyProvidesr#rrT�__all__rrrr�<module>s"