o ¯bB*ã @sdZddlZddlZddlmZmZmZmZddlm Z m Z ddl m Z m Z ddlmZmZzeedƒZeedƒZeed ƒZeed ƒZeed ƒZWneyYZzeeƒ‚dZ[wwGd d „d eƒZe ee¡ee e ƒGdd„de jƒƒZdd„ZddgZdS)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 eZdZdZedƒZedƒZdS)Ú_IKQueuez2 An interface for KQueue implementations. zAn implementation of kqueue(2).zAn implementation of kevent(2).N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚkqueueÚkevent©rrúàóz+KQueueReactor.removeAll..crArrBrCr+rrrEárF)Ú _removeAllrrr+rr+rÚ removeAllÛsþzKQueueReactor.removeAllcó‡fdd„ˆjDƒS)z8 Implement L{IReactorFDSet.getReaders}. crArrBrCr+rrrEèrFz,KQueueReactor.getReaders..)rr+rr+rÚ getReadersäózKQueueReactor.getReaderscrI)z8 Implement L{IReactorFDSet.getWriters}. crArrBrCr+rrrEîrFz,KQueueReactor.getWriters..)rr+rr+rÚ getWritersêrKzKQueueReactor.getWritersc Csª|durd}z |j gt|jƒ|¡}Wnty-}z|jtjkr(WYd}~dS‚d}~ww|j}|D]}|j}z|j|}Wn t yHYq3wt   |||||¡q3dS)z1 Poll the kqueue for new events. Né) rr%Úlenr r0ÚerrnoÚEINTRÚ_doWriteOrReadÚidentÚKeyErrorr ÚcallWithLogger)r#ÚtimeoutÚeventsÚeÚ_drdwÚeventr&Ú selectablerrrÚdoKEventðs( €ù  ý÷zKQueueReactor.doKEventc CsÂd}d}|j|j|j|jf\}}}} |t@r|r| rtj}n6z"| ¡dkr+d}tj }n|t kr5d}|  ¡}|t kr?d}|  ¡}WntySt ¡}t |d¡Ynw|r_| |||¡dSdS)z’ Private method called when a FD is ready for reading, writing or was lost. Do the work and raise errors where necessary. NFr8TzSAn exception was raised from application code while processing a reactor selectable)r'ÚflagsÚdataÚfflagsrrÚCONNECTION_LOSTr/rÚ _NO_FILEDESCrÚdoReadrÚdoWriter9r ÚFailurer ÚerrÚ_disconnectSelectable) r#rZr&rYÚwhyÚinReadr'r\r]r^rrrrQs< ü € þü ÿzKQueueReactor._doWriteOrReadN)rrrrÚselectr"r)r,r-r3r6r>r@rHrJrLr[rQÚ doIterationrrrrr6s   )rcCstƒ}ddlm}||ƒdS)z' Install the kqueue() reactor. r)ÚinstallReactorN)rÚtwisted.internet.mainrj)ÚprjrrrÚinstall:s  rm) rrOrhÚzope.interfacerrrrÚtwisted.internetrrÚtwisted.internet.interfacesrr Útwisted.pythonr r Úgetattrr r rrrÚAttributeErrorrWÚ ImportErrorrÚdirectlyProvidesr!rrmÚ__all__rrrrÚs2    €ÿ