ϪfB*rdZddlZddlZddlmZmZmZmZddlm Z m Z ddl m Z m Z ddlmZmZ eedZeedZeed Zeed Zeed ZGd d eZej6eeee e Gdde j8ZdZddgZy#e$r ZeedZ[wwxYw)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)failurelog KQ_EV_ADD KQ_EV_DELETE KQ_EV_EOFKQ_FILTER_READKQ_FILTER_WRITEc0eZdZdZedZedZy)_IKQueuez2 An interface for KQueue implementations. zAn implementation of kqueue(2).zAn implementation of kevent(2).N)__name__ __module__ __qualname____doc__rkqueuekevent"G     KK  r "%%%b),,RN  B  #B) B:) B76B7: CCcd} |j}|dk(r+|jjD] \}}||us d}ny||jvrV|jj |||j vr |j|=|s |j|ttyyy#t$rd}YwxYw#t$rYywxYw)z: Implement L{IReactorFDSet.removeWriter}. FrATN) r7rBr%rCr$rDr#r/rrr8)r(r>rEr,rFs r removeWriterzKQueueReactor.removeWriters B 8 --335 DT>"G     LL   #$%%b),,R,O  B  rHc|j|jDcgc]}|j|c}|jDcgc]}|j|c}Scc}wcc}w)z7 Implement L{IReactorFDSet.removeAll}. ) _removeAllr#r%r$r4s r removeAllzKQueueReactor.removeAllsU-1[[ 9rT  r " 9-1\\ :rT  r " :  9 :s AA" cZ|jDcgc]}|j|c}Scc}w)z8 Implement L{IReactorFDSet.getReaders}. )r#r%r4s r getReaderszKQueueReactor.getReaderss'15 <"!!"%<<<(cZ|jDcgc]}|j|c}Scc}w)z8 Implement L{IReactorFDSet.getWriters}. )r$r%r4s r getWriterszKQueueReactor.getWriterss'15 ="!!"%===rPc|d} |jjgt|j|}|j}|D]7}|j} |j|}tj|||||9y#t$r(}|j t j k(rYd}~yd}~wwxYw#t$rYzwxYw)z1 Poll the kqueue for new events. N) r!r+lenr%r8errnoEINTR_doWriteOrReadidentr callWithLoggerKeyError)r(timeouteventse_drdweventr, selectables rdoKEventzKQueueReactor.doKEvents ?G XX%%b#d.?.?*@'JF## MEB M!..r2 "":uj"eL M ww%++%   s/0A?B3? B0B+*B++B03 B?>B?cd}d}|j|j|j|jf\}}}} |tzr|r| rt j }n] |jdk(rd}tj}n6|tk(rd}|j}|tk(rd}|j}|r|j'|||yy#t$r-tj }t#j$|dYLwxYw)z Private method called when a FD is ready for reading, writing or was lost. Do the work and raise errors where necessary. NFrATzSAn exception was raised from application code while processing a reactor selectable)r-flagsdatafflagsrrCONNECTION_LOSTr7r _NO_FILEDESCrdoReadrdoWriterBr Failurer err_disconnectSelectable) r(rar,r`whyinReadr-rdrerfs rrXzKQueueReactor._doWriteOrReads  LL KK JJ LL ) %f 9 &&&C $$&","F#00C/!%(//10!&(002   & &z3 ? ! oo'=  sAC 3D?DN)rrrrselectr'r/r2r5r;r?rGrJrMrOrRrbrX doIterationrrrrr6sY2$*2(D E $ %44 = > M<'@RKrrc4t}ddlm}||y)z' Install the kqueue() reactor. r)installReactorN)rtwisted.internet.mainrs)prss rinstallrv:s A41rrv) rrVrpzope.interfacerrrrtwisted.internetrrtwisted.internet.interfacesr r twisted.pythonr r getattrr rrrrAttributeErrorr^ ImportErrorrdirectlyProvidesr&rrv__all__rrrrs  JJ,H'   ,I6>2L ,IV%56Nf&78O :y: fh/ ]-.@I..@/@F I &} a.s-B$$B6)B11B6