o b" @sdZddlZddlZddlmZddlmZddlmZddl m Z ze edZ e edZ e ed Ze ed Ze ed ZWneyMZzeedZ[wweeGd d d ejejZddZd dgZdS)z An epoll() based implementation of the twisted main loop. To install the event loop (and you should do this before any connections, listeners or connectors are added):: from twisted.internet import epollreactor epollreactor.install() N) implementer) posixbase) IReactorFDSet)logepollEPOLLHUPEPOLLERREPOLLINEPOLLOUTc@s|eZdZdZeeBZeZe Z ddZ ddZ ddZ dd Zd d Zd d ZddZddZddZddZddZeZdS) EPollReactora A reactor that uses epoll(7). @ivar _poller: A C{epoll} which will be used to check for I/O readiness. @ivar _selectables: A dictionary mapping integer file descriptors to instances of C{FileDescriptor} which have been registered with the reactor. All C{FileDescriptors} 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{_poller} for read readiness notifications which will be dispatched to the corresponding C{FileDescriptor} instances in C{_selectables}. @ivar _writes: A set containing integer file descriptors. Values in this set will be registered with C{_poller} for write readiness notifications which will be dispatched to the corresponding C{FileDescriptor} instances in C{_selectables}. @ivar _continuousPolling: A L{_ContinuousPolling} instance, used to handle file descriptors (e.g. filesystem files) that are not supported by C{epoll(7)}. cCs<td|_t|_t|_i|_t||_tj |dS)zm Initialize epoll object, file descriptor tracking dictionaries, and the base class. iN) r_pollerset_reads_writes _selectablesr_ContinuousPolling_continuousPollingPosixReactorBase__init__selfr?/usr/lib/python3/dist-packages/twisted/internet/epollreactor.pyrGs  zEPollReactor.__init__c Cs\|}||vr,|}||vr||O}|j||n|j|||||||<dSdS)z Private method for adding a descriptor from the event loop. It takes care of adding it if new or modifying it if already added for another state (read -> read/write for example). N)filenor modifyregisteradd) rxerprimaryother selectablesevent antieventfdflagsrrr_addVs  zEPollReactor._addc Cdz|||j|j|jttWdSty1}z|jtjkr%|j |nWYd}~dSd}~ww)zR Add a FileDescriptor for notification of data available to read. N) r%rrrr r OSErrorerrnoEPERMr addReader)rreadererrrr*p  zEPollReactor.addReaderc Cr&)zS Add a FileDescriptor for notification of data available to write. N) r%rrrr r r'r(r)r addWriter)rwriterr,rrrr.r-zEPollReactor.addWriterc Csz|}|dkr|D] \}}||urnq dS||vr;||vr+|} |j|| n ||=|j|||dSdS)z Private method for removing a descriptor from the event loop. It does the inverse job of _add, and also add a check in case of the fd has gone away. N)ritemsr r unregisterremove) rrrrr r!r"r#fdesr$rrr_removes zEPollReactor._removecC:|j|r|j|dS|||j|j|jttdS)zQ Remove a Selectable for notification of data available to read. N) r isReading removeReaderr5rrrr r )rr+rrrr8  zEPollReactor.removeReadercCr6)zR Remove a Selectable for notification of data available to write. N) r isWriting removeWriterr5rrrr r )rr/rrrr;r9zEPollReactor.removeWritercs6fddjDfddjDjS)zD Remove all selectables, and return a list of them. cg|]}j|qSrr.0r#rrr z*EPollReactor.removeAll..cr<rr=r>rrrr@rA) _removeAllrrr removeAllrrrrrCszEPollReactor.removeAllcfddjDjS)Ncr<rr=r>rrrr@ z+EPollReactor.getReaders..)rr getReadersrrrrrF zEPollReactor.getReaderscrD)Ncr<rr=r>rrrr@rEz+EPollReactor.getWriters..)rr getWritersrrrrrHrGzEPollReactor.getWritersc Cs|durd}z |j|t|j}Wnty,}z|jtjkr'WYd}~dSd}~ww|j}|D]\}}z|j|}Wn tyFYq2wt |||||q2dS)z1 Poll the poller for new events. Nr0) r polllenrr'r(EINTR_doReadOrWriteKeyErrorrcallWithLogger)rtimeoutlerr_drdwr#r! selectablerrrdoPolls&   zEPollReactor.doPollN)__name__ __module__ __qualname____doc__rr_POLL_DISCONNECTEDr _POLL_INr _POLL_OUTrr%r*r.r5r8r;rCrFrHrT doIterationrrrrr %s"   r cCst}ddlm}||dS)z& Install the epoll() reactor. r)installReactorN)r twisted.internet.mainr])pr]rrrinstalls  r`)rXr(selectzope.interfacertwisted.internetrtwisted.internet.interfacesrtwisted.pythonrgetattrrrrr r AttributeErrorr, ImportErrorr_PollLikeMixinr r`__all__rrrrs,         T