o
    ¯bB*  ã                
   @   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   ú</usr/lib/python3/dist-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__)ÚselfÚ_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   r0   r    r1   )r#   Úwriterr&   r   r   r   Ú	addWriter™   r4   zKQueueReactor.addWriterc                 C   ó¶   d}z|  ¡ }W n ty   d}Y nw |dkr,| j ¡ D ]\}}||u r)d} n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   r0   )r#   r2   ÚwasLostr&   Úfdesr   r   r   ÚremoveReader§   ó2   ÿþ

ÿùzKQueueReactor.removeReaderc                 C   r7   )z:
        Implement L{IReactorFDSet.removeWriter}.
        Fr8   TN)r/   r9   r    r:   r   r;   r   r)   r   r   r0   )r#   r5   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                    rA   r   rB   rC   r+   r   r   rE   á   rF   )Ú
_removeAllr   r   r+   r   r+   r   Ú	removeAllÛ   s   þzKQueueReactor.removeAllc                    ó   ‡ fdd„ˆ j D ƒS )z8
        Implement L{IReactorFDSet.getReaders}.
        c                    rA   r   rB   rC   r+   r   r   rE   è   rF   z,KQueueReactor.getReaders.<locals>.<listcomp>)r   r+   r   r+   r   Ú
getReadersä   ó   zKQueueReactor.getReadersc                    rI   )z8
        Implement L{IReactorFDSet.getWriters}.
        c                    rA   r   rB   rC   r+   r   r   rE   î   rF   z,KQueueReactor.getWriters.<locals>.<listcomp>)r   r+   r   r+   r   Ú
getWritersê   rK   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    r0   ÚerrnoÚEINTRÚ_doWriteOrReadÚidentÚKeyErrorr   ÚcallWithLogger)r#   ÚtimeoutÚeventsÚeÚ_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.
        NFr8   TzSAn exception was raised from application code while processing a reactor selectable)r'   ÚflagsÚdataÚfflagsr   r   ÚCONNECTION_LOSTr/   r   Ú_NO_FILEDESCr   ÚdoReadr   ÚdoWriter9   r
   ÚFailurer   ÚerrÚ_disconnectSelectable)
r#   rZ   r&   rY   ÚwhyÚinReadr'   r\   r]   r^   r   r   r   rQ     s<   ü€þü
ÿzKQueueReactor._doWriteOrReadN)r   r   r   r   Úselectr"   r)   r,   r-   r3   r6   r>   r@   rH   rJ   rL   r[   rQ   Ú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   Útwisted.internet.mainrj   )Úprj   r   r   r   Úinstall:  s   rm   ) r   rO   rh   Úzope.interfacer   r   r   r   Útwisted.internetr   r   Útwisted.internet.interfacesr   r	   Útwisted.pythonr
   r   Úgetattrr   r   r   r   r   ÚAttributeErrorrW   ÚImportErrorr   ÚdirectlyProvidesr!   r   rm   Ú__all__r   r   r   r   Ú<module>   s2   



€ÿ	  
