Ë
    ojB*  ã                   ó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© ó    ú</usr/lib/python3/dist-packages/twisted/internet/kqreactor.pyr   r   *   s   „ ññ Ð8Ó9€FÙÐ8Ó9�Fr   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}.
        FéÿÿÿÿTN)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Ùðð
 Ø�—‘ÑØ�K‰K×Ñ˜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Ùðð
 Ø�—‘ÑØ�L‰L×Ñ Ô#Ø˜Ÿ™Ñ$Ø×%Ñ% 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¯[©[Ö9 rˆT×Ñ˜rÓ"Ò9Ø-1¯\©\Ö: rˆT×Ñ˜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ð		Ø—X‘X×%Ñ% b¬#¨d×.?Ñ.?Ó*@À'ÓJˆFð ×#Ñ#ˆØò 		MˆEØ—‘ˆBðMØ!×.Ñ.¨rÑ2�
ô ×"Ñ" :¨u°jÀ"ÀeÕLñ		Møô ò 	ð �w‰wœ%Ÿ+™+Ò%Üàûð	ûô ò ñ ðú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þ   € ð
 ˆØˆà�L‰LØ�K‰KØ�J‰JØ�L‰Lð	)
Ñ%ˆ�˜˜fð ”9Ò¡©&Ü×&Ñ&‰CðØ×$Ñ$Ó&¨"Ò,Ø"�FÜ#×0Ñ0‘Cà¤Ò/Ø!%˜Ø(×/Ñ/Ó1˜Ø¤Ò0Ø!&˜Ø(×0Ñ0Ó2˜ñ Ø×&Ñ& z°3¸Õ?ð øô !ò ô —o‘oÓ'�Ü—‘Øð=öð	ú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 >Ó2€LÙ˜ Ó,€IÙ˜VÐ%5Ó6€NÙ˜fÐ&7Ó8€Oô
:ˆyô :ð €× Ñ ˜f hÔ /ñ ˆ]Ð-Ó.ô@�I×.Ñ.ó @ó /ð@òFð ˜IÐ
&�øð} ò Ù
�a‹.Ðûðús   °-B$ Â$B6Â)B1Â1B6