§
    ÈtºfB*  ã                   ó¤  — 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n# e$ rZ ee¦  «        ‚dZ[ww xY w G d„ de¦  «        Z ej        ee¦  «          eee¦  «         G d„ de
j        ¦  «        ¦   «         Z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                   ó>   — 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© ó    úY/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/internet/kqreactor.pyr   r   *   s:   € € € € € ðð ð ˆYÐ8Ñ9Ô9€FØˆYÐ8Ñ9Ô9€F€F€Fr   r   c                   óh   — 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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                 óè   — || _         | 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Ú_kqueueImpls     r   r'   zKQueueReactor.__init__Q   s[   € ð !ˆŒ
Ø”:×$Ò$Ñ&Ô&ˆŒÝ‘e”eˆŒÝ‘u”uˆŒØˆÔÝÔ"×+Ò+¨DÑ1Ô1Ð1Ð1Ð1r   c                 ót   — | 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Úops       r   Ú_updateRegistrationz!KQueueReactor._updateRegistratione   s;   € ð 	Œ×Ò˜$œ*×+Ò+¨B°¸Ñ;Ô;Ð<¸aÀÑCÔCÐCÐCÐCr   c                 óF   — | j                              ¦   «          d| _         dS )zA
        Implement L{IReactorDaemonize.beforeDaemonize}.
        N)r!   Úclose©r(   s    r   ÚbeforeDaemonizezKQueueReactor.beforeDaemonizem   s!   € ð 	Œ�ŠÑÔÐØˆŒˆˆr   c                 óî   — | j                              ¦   «         | _        | j        D ]#}|                      |t
          t          ¦  «         Œ$| j        D ]#}|                      |t          t          ¦  «         Œ$dS )z@
        Implement L{IReactorDaemonize.afterDaemonize}.
        N)	r    r   r!   r#   r/   r   r   r$   r   )r(   r,   s     r   ÚafterDaemonizezKQueueReactor.afterDaemonize}   s�   € ð ”:×$Ò$Ñ&Ô&ˆŒØ”+ð 	Dð 	DˆBØ×$Ò$ R­½ÑCÔCÐCÐCØ”,ð 	Eð 	EˆBØ×$Ò$ R­½)ÑDÔDÐDÐDð	Eð 	Er   c                 óD  — |                      ¦   «         }|| j        vr‚	 |                      |t          t          ¦  «         n# t
          $ r Y nw xY w|| j        |<   | j                             |¦  «         dS # || j        |<   | j                             |¦  «         w xY wdS )z7
        Implement L{IReactorFDSet.addReader}.
        N)Úfilenor#   r/   r   r   ÚOSErrorr%   Úadd)r(   Úreaderr,   s      r   Ú	addReaderzKQueueReactor.addReader‹   s¹   € ð �]Š]‰_Œ_ˆØ�T”[Ð Ð ð$Ø×(Ò(¨­^½YÑGÔGÐGÐGøÝð ð ð Ø�ðøøøð )/�Ô! "Ñ%Ø”—’ Ñ#Ô#Ð#Ð#Ð#øð )/�Ô! "Ñ%Ø”—’ Ñ#Ô#Ð#Ð#øøøð !Ð ó)   Ÿ!A Á A7 Á
AÁA7 ÁAÁA7 Á7&Bc                 óD  — |                      ¦   «         }|| j        vr‚	 |                      |t          t          ¦  «         n# t
          $ r Y nw xY w|| j        |<   | j                             |¦  «         dS # || j        |<   | j                             |¦  «         w xY wdS )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ÔHÐHÐHøÝð ð ð Ø�ðøøøð )/�Ô! "Ñ%Ø”× Ò  Ñ$Ô$Ð$Ð$Ð$øð )/�Ô! "Ñ%Ø”× Ò  Ñ$Ô$Ð$Ð$øøøð "Ð!r<   c                 ó’  — d}	 |                      ¦   «         }n# t          $ r d}Y nw xY w|dk    r)| j                             ¦   «         D ]\  }}||u rd} nŒdS || j        v rb| j                             |¦  «         || j        vr| j        |= |s7	 |                      |t          t          ¦  «         dS # t          $ r Y dS w xY wdS dS )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ˆBøÝð 	ð 	ð 	ØˆBˆBˆBð	øøøà�Š8ˆ8Ø Ô-×3Ò3Ñ5Ô5ð ð ‘��DØ˜T�>�>Ø"�GØ�Eð "ð �Ø�”ÐÐØŒK×Ò˜rÑ"Ô"Ð"Ø˜œÐ%Ð%ØÔ% bÐ)Øð ðØ×,Ò,¨RµÅÑNÔNÐNÐNÐNøÝð ð ð Ø�D�Dðøøøð Ððð ó   „ ™(§(Â!B4 Â4
CÃCc                 ó’  — d}	 |                      ¦   «         }n# t          $ r d}Y nw xY w|dk    r)| j                             ¦   «         D ]\  }}||u rd} nŒdS || j        v rb| j                             |¦  «         || j        vr| j        |= |s7	 |                      |t          t          ¦  «         dS # t          $ r Y dS w xY wdS dS )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ˆBøÝð 	ð 	ð 	ØˆBˆBˆBð	øøøà�Š8ˆ8Ø Ô-×3Ò3Ñ5Ô5ð ð ‘��DØ˜T�>�>Ø"�GØ�Eð "ð �Ø�”ÐÐØŒL×Ò Ñ#Ô#Ð#Ø˜œÐ$Ð$ØÔ% bÐ)Øð ðØ×,Ò,¨RµÅ,ÑOÔOÐOÐOÐOøÝð ð ð Ø�D�Dðøøøð Ððð rH   c                 ót   ‡ — ‰                       ˆ fd„‰ j        D ¦   «         ˆ fd„‰ j        D ¦   «         ¦  «        S )z7
        Implement L{IReactorFDSet.removeAll}.
        c                 ó*   •— g | ]}‰j         |         ‘ŒS r   ©r%   ©Ú.0r,   r(   s     €r   ú
<listcomp>z+KQueueReactor.removeAll.<locals>.<listcomp>à   s!   ø€ Ð9Ð9Ð9 rˆTÔ˜rÔ"Ð9Ð9Ð9r   c                 ó*   •— g | ]}‰j         |         ‘ŒS r   rM   rN   s     €r   rP   z+KQueueReactor.removeAll.<locals>.<listcomp>á   s!   ø€ Ð:Ð:Ð: rˆTÔ˜rÔ"Ð:Ð:Ð:r   )Ú
_removeAllr#   r$   r2   s   `r   Ú	removeAllzKQueueReactor.removeAllÛ   sM   ø€ ð �ŠØ9Ð9Ð9Ð9¨T¬[Ð9Ñ9Ô9Ø:Ð:Ð:Ð:¨T¬\Ð:Ñ:Ô:ñ
ô 
ð 	
r   c                 ó*   ‡ — ˆ fd„‰ j         D ¦   «         S )z8
        Implement L{IReactorFDSet.getReaders}.
        c                 ó*   •— g | ]}‰j         |         ‘ŒS r   rM   rN   s     €r   rP   z,KQueueReactor.getReaders.<locals>.<listcomp>è   s!   ø€ Ð<Ð<Ð<¨"�Ô! "Ô%Ð<Ð<Ð<r   )r#   r2   s   `r   Ú
getReaderszKQueueReactor.getReadersä   s!   ø€ ð =Ð<Ð<Ð<°´Ð<Ñ<Ô<Ð<r   c                 ó*   ‡ — ˆ fd„‰ j         D ¦   «         S )z8
        Implement L{IReactorFDSet.getWriters}.
        c                 ó*   •— g | ]}‰j         |         ‘ŒS r   rM   rN   s     €r   rP   z,KQueueReactor.getWriters.<locals>.<listcomp>î   s!   ø€ Ð=Ð=Ð=¨"�Ô! "Ô%Ð=Ð=Ð=r   )r$   r2   s   `r   Ú
getWriterszKQueueReactor.getWritersê   s!   ø€ ð >Ð=Ð=Ð=°´Ð=Ñ=Ô=Ð=r   c                 ó\  — |€d}	 | j                              g t          | j        ¦  «        |¦  «        }n.# t          $ r!}|j        t
          j        k    rY d}~dS ‚ d}~ww xY w| j        }|D ]?}|j        }	 | j        |         }t          j
        |||||¦  «         Œ0# t          $ r Y Œ<w xY wdS )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×%Ò% b­#¨dÔ.?Ñ*@Ô*@À'ÑJÔJˆFˆFøÝð 	ð 	ð 	ð Œw�%œ+Ò%Ð%Ø�����àøøøøð	øøøð Ô#ˆØð 		Mð 		MˆEØ”ˆBðMØ!Ô.¨rÔ2�
õ Ô" :¨u°jÀ"ÀeÑLÔLÐLÐLøõ ð ð ð ð �ðøøøð			Mð 		Ms,   †.5 µ
A ¿AÁAÁA Á6BÂ
B)Â(B)c                 óþ  — d}d}|j         |j        |j        |j        f\  }}}}	|t          z  r|r|	rt
          j        }n£	 |                     ¦   «         dk    rd}t          j	        }nB|t          k    rd}|                     ¦   «         }|t          k    rd}|                     ¦   «         }n8# t          $ r+ t          j        ¦   «         }t#          j        |d¦  «         Y nw xY 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.
        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(   rh   r,   rg   ÚwhyÚinReadr-   rk   rl   rm   s
             r   r_   zKQueueReactor._doWriteOrRead  sL  € ð
 ˆØˆàŒLØŒKØŒJØŒLð	)
Ñ%ˆ�˜˜fð •9Ñð 	 ð 	¨&ð 	ÝÔ&ˆCˆCðØ×$Ò$Ñ&Ô&¨"Ò,Ð,Ø"�FÝ#Ô0�C�Cà¥Ò/Ð/Ø!%˜Ø(×/Ò/Ñ1Ô1˜Ø¥Ò0Ð0Ø!&˜Ø(×0Ò0Ñ2Ô2˜øøÝ ð ð ð õ ”oÑ'Ô'�Ý”Øð=ñô ð ð ð ð	øøøð ð 	@Ø×&Ò& z°3¸Ñ?Ô?Ð?Ð?Ð?ð	@ð 	@s   Á A)B* Â*2CÃCN)r   r   r   r   Úselectr'   r/   r3   r5   r;   r?   rG   rJ   rS   rV   rY   ri   r_   ÚdoIterationr   r   r   r   r   6   sù   € € € € € ðð ð2 $*ð 2ð 2ð 2ð 2ð(Dð Dð Dðð ð ð Eð Eð Eð$ð $ð $ð%ð %ð %ðð ð ð4ð ð ð4
ð 
ð 
ð=ð =ð =ð>ð >ð >ðMð Mð Mð<'@ð '@ð '@ðR €K€K€Kr   r   c                  óD   — t          ¦   «         } ddlm}  || ¦  «         dS )z'
    Install the kqueue() reactor.
    r   )ÚinstallReactorN)r   Útwisted.internet.mainrz   )Úprz   s     r   Úinstallr}   :  s5   € õ 	‰Œ€AØ4Ð4Ð4Ð4Ð4Ð4à€N�1ÑÔÐÐÐr   r}   ) r   r]   rw   Úzope.interfacer   r   r   r   Útwisted.internetr   r   Útwisted.internet.interfacesr	   r
   Útwisted.pythonr   r   Úgetattrr   r   r   r   r   ÚAttributeErrorre   ÚImportErrorr   ÚdirectlyProvidesr&   r   r}   Ú__all__r   r   r   ú<module>r‡      sÌ  ðð
ð ð €€€Ø €€€à JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð
 �˜ Ñ,Ô,€IØ�7˜6 >Ñ2Ô2€LØ�˜ Ñ,Ô,€IØ�W˜VÐ%5Ñ6Ô6€NØ�g˜fÐ&7Ñ8Ô8€O€OøØð ð ð Ø
ˆ+�a‰.Œ.Ðøøøøðøøøð:ð :ð :ð :ð :ˆyñ :ô :ð :ð €Ô ˜f hÑ /Ô /Ð /ð €ˆ]Ð-Ñ.Ô.ð@ð @ð @ð @ð @�IÔ.ñ @ô @ñ /Ô.ð@ðFð ð ð ˜IÐ
&€€€s   °<A- Á-BÁ2A=Á=B