
    VhB*                     r   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 	  eed      Z eed      Z eed	      Z eed
      Z eed      Z G d de      Z ej6                  ee        eee       G d de
j8                               Zd ZddgZy# e$ rZ ee      dZ[ww xY w)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                   0    e Zd ZdZ ed      Z ed      Zy)_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     J/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/kqreactor.pyr   r   *   s     89F89Fr   r   c                   f    e Zd ZdZefdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd ZeZy)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                     || _         | j                   j                         | _        t               | _        t               | _        i | _        t        j                  j                  |        y)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_kqueueImpls     r   r'   zKQueueReactor.__init__Q   sM     !
::$$&eu""++D1r   c                 v    | j                   j                  | j                  j                  |||      gdd       y)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ops       r   _updateRegistrationz!KQueueReactor._updateRegistratione   s0     	$**++B;<aCr   c                 F    | j                   j                          d| _         y)zA
        Implement L{IReactorDaemonize.beforeDaemonize}.
        N)r!   close)r(   s    r   beforeDaemonizezKQueueReactor.beforeDaemonizem   s     	r   c                     | j                   j                         | _        | j                  D ]  }| j	                  |t
        t                | j                  D ]  }| j	                  |t        t                y)z@
        Implement L{IReactorDaemonize.afterDaemonize}.
        N)	r    r   r!   r#   r/   r   r   r$   r   r(   r,   s     r   afterDaemonizezKQueueReactor.afterDaemonize}   sf     ::$$&++ 	DB$$RC	D,, 	EB$$R)D	Er   c                 J   |j                         }|| j                  vrG	 | j                  |t        t               || j                  |<   | j                  j                  |       yy# t
        $ r Y 7w xY w# || j                  |<   | j                  j                  |       w xY w)z7
        Implement L{IReactorFDSet.addReader}.
        N)filenor#   r/   r   r   OSErrorr%   add)r(   readerr,   s      r   	addReaderzKQueueReactor.addReader   s     ]]_T[[ $((^YG )/!!"%# !   )/!!"%##   A' '	A30A6 2A33A6 6,B"c                 J   |j                         }|| j                  vrG	 | j                  |t        t               || j                  |<   | j                  j                  |       yy# t
        $ r Y 7w xY w# || j                  |<   | j                  j                  |       w xY w)z7
        Implement L{IReactorFDSet.addWriter}.
        N)r7   r$   r/   r   r   r8   r%   r9   )r(   writerr,   s      r   	addWriterzKQueueReactor.addWriter   s     ]]_T\\!%((_iH )/!!"%  $ "   )/!!"%  $r<   c                    d}	 |j                         }|dk(  r+| j                  j                         D ]  \  }}||u sd} n y|| j                  v rV| j                  j                  |       || j                  vr| j                  |= |s	 | j                  |t        t               yyy# t        $ r d}Y w xY w# t        $ r Y yw xY w)z:
        Implement L{IReactorFDSet.removeReader}.
        FTN)r7   BaseExceptionr%   itemsr#   remover$   r/   r   r   r8   )r(   r:   wasLostr,   fdess        r   removeReaderzKQueueReactor.removeReader   s     	B 8 --335 DT>"G
 KKr"%%%b),,RN 	   	B	   #   B) B: )B76B7:	CCc                    d}	 |j                         }|dk(  r+| j                  j                         D ]  \  }}||u sd} n y|| j                  v rV| j                  j                  |       || j                  vr| j                  |= |s	 | j                  |t        t               yyy# t        $ r d}Y w xY w# t        $ r Y yw xY w)z:
        Implement L{IReactorFDSet.removeWriter}.
        FrA   TN)r7   rB   r%   rC   r$   rD   r#   r/   r   r   r8   )r(   r>   rE   r,   rF   s        r   removeWriterzKQueueReactor.removeWriter   s     	B 8 --335 DT>"G
 LL#$%%b),,R,O 	   	B	   rH   c                     | j                  | j                  D cg c]  }| j                  |    c}| j                  D cg c]  }| j                  |    c}      S c c}w c c}w )z7
        Implement L{IReactorFDSet.removeAll}.
        )
_removeAllr#   r%   r$   r4   s     r   	removeAllzKQueueReactor.removeAll   sU     -1[[9rTr"9-1\\:rTr":
 	
9:s   A A"
c                 Z    | j                   D cg c]  }| j                  |    c}S c c}w )z8
        Implement L{IReactorFDSet.getReaders}.
        )r#   r%   r4   s     r   
getReaderszKQueueReactor.getReaders   s'     15<"!!"%<<<   (c                 Z    | j                   D cg c]  }| j                  |    c}S c c}w )z8
        Implement L{IReactorFDSet.getWriters}.
        )r$   r%   r4   s     r   
getWriterszKQueueReactor.getWriters   s'     15="!!"%===rP   c                    |d}	 | j                   j                  g t        | j                        |      }| j                  }|D ]7  }|j                  }	 | j                  |   }t        j                  |||||       9 y# t        $ r(}|j
                  t
        j                  k(  rY d}~y d}~ww xY w# t        $ r Y zw xY w)z1
        Poll the kqueue for new events.
        N   )r!   r+   lenr%   r8   errnoEINTR_doWriteOrReadidentr   callWithLoggerKeyError)r(   timeouteventse_drdweventr,   
selectables           r   doKEventzKQueueReactor.doKEvent   s     ?G		XX%%b#d.?.?*@'JF ## 		MEBM!..r2
 "":uj"eL		M  	 ww%++%	   s/   0A? B3?	B0B+*B++B03	B?>B?c                    d}d}|j                   |j                  |j                  |j                  f\  }}}}	|t        z  r|r|	rt
        j                  }n]	 |j                         dk(  rd}t        j                  }n6|t        k(  rd}|j                         }|t        k(  rd}|j                         }|r| j'                  |||       yy# t        $ r- t        j                          }t#        j$                  |d       Y Lw xY w)z
        Private method called when a FD is ready for reading, writing or was
        lost. Do the work and raise errors where necessary.
        NFrA   TzSAn exception was raised from application code while processing a reactor selectable)r-   flagsdatafflagsr   r   CONNECTION_LOSTr7   r   _NO_FILEDESCr   doReadr   doWriterB   r   Failurer   err_disconnectSelectable)
r(   ra   r,   r`   whyinReadr-   rd   re   rf   s
             r   rX   zKQueueReactor._doWriteOrRead  s    
 LLKKJJLL	)
%f 9&&&C$$&","F#00C/!%(//10!&(002 &&z3?  !  oo'=	s   AC
 
3D ?D N)r   r   r   r   selectr'   r/   r2   r5   r;   r?   rG   rJ   rM   rO   rR   rb   rX   doIterationr   r   r   r   r   6   sY    2 $* 2(D E$%44
=>M<'@R Kr   r   c                  4    t               } ddlm}  ||        y)z'
    Install the kqueue() reactor.
    r   )installReactorN)r   twisted.internet.mainrs   )prs   s     r   installrv   :  s     	A41r   rv   ) r   rV   rp   zope.interfacer   r   r   r   twisted.internetr   r   twisted.internet.interfacesr	   r
   twisted.pythonr   r   getattrr   r   r   r   r   AttributeErrorr^   ImportErrorr   directlyProvidesr&   r   rv   __all__r   r   r   <module>r      s   
   J J , H '
 ,I6>2L,IV%56Nf&78O
:y :   fh / ]-.@I.. @ /@F I
&}  
a.s   -B$ $B6)B11B6