Ϫf8UdZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd Zed k(reZn ejZ dd lmZeZe eGdde j8eZdZdgZy#e$r eZe eed<Y9wxYw)z Select reactor N)EBADFEINTR)sleep)Type) implementer) posixbase) IReactorFDSet)log) platformTypec|s#|s!|d}n t|d}t|gggfS||dkDrd}tj||||\}}}|||zgfS)zWin32 select wrapper.g{Gz?gMbP?g?)minrselect)rwetimeouts @/usr/lib/python3/dist-packages/twisted/internet/selectreactor.py win32selectrsl  ?G'5)G g2rz'C-mmAq!W-GAq! a!eR<win32)_ThreadedWin32EventsMixin _extraBasecVeZdZdZdZdZdZeZdZdZ dZ dZ d Z d Z d Zd Zy ) SelectReactora- A select() based reactor - runs on all POSIX platforms and on Win32. @ivar _reads: A set containing L{FileDescriptor} instances which will be checked for read events. @ivar _writes: A set containing L{FileDescriptor} instances which will be checked for writability. c~t|_t|_tjj |y)zV Initialize file descriptor tracking dictionaries and the base class. N)set_reads_writesrPosixReactorBase__init__selfs rr zSelectReactor.__init__Ds*e u ""++D1rctjdt|j}t|j}|jj |jj |j|f|j|ffD]9\}}|D]/} t j |g|g|gd|j|1;y#t$r5}tjd|z|j||dYd}~nd}~wwxYw)Nz1Malformed file descriptor found. Preening lists.rzbad descriptor %sF) r msglistrrclearradd Exception_disconnectSelectable)r"readerswritersselSetselList selectablers r_preenDescriptorszSelectReactor._preenDescriptorsLs CDt{{#t||$  !%g 6w8OP +OFG% + +MM:, zlAN JJz* + +!EGG/*<=..z1eDDEsC  D +DD c t|j|jg|\}}}|j}t j}|d|jf|d|jffD]\}} } |D]} | | vr|| || | y#t$r|j Yyt $r't j|j Yyt$r{}|jddvr|js|jsYd}~y|jdtk(rYd}~y|jdtk(r|j Yd}~yd}~wwxYw)z Run one iteration of the I/O monitor loop. This will run all selectables who had input or output readiness waiting for them. Nr)rdoReaddoWrite)_selectrr ValueErrorr/ TypeErrorr errOSErrorargsrr_doReadOrWritecallWithLogger) r"rrrignoredse_drdw_logrun selectablesmethodfdsetr.s rdoSelectzSelectReactor.doSelect\sD #DKKr7KMAq'<##$$ $++ &  4<< (+ ? &K* ? U* E:v>  ? ??   " " $   GGI  " " $  wwqzV# dllu$u$&&(# s5&BE,E E)E E &E  E  Ec t||}|r|j |||dk(yy#t$r.tjd}t j YPwxYw)Nr2)getattr BaseExceptionsysexc_infor r7r))r"r.rAwhys rr:zSelectReactor._doReadOrWritesc -'*f-/C   & &z3(8J K  ,,.#C GGI s-4A$#A$c:|jj|y)zR Add a FileDescriptor for notification of data available to read. N)rr'r"readers r addReaderzSelectReactor.addReaders rc:|jj|y)zS Add a FileDescriptor for notification of data available to write. N)rr'r"writers r addWriterzSelectReactor.addWriters  rc:|jj|y)zQ Remove a Selectable for notification of data available to read. N)rdiscardrLs r removeReaderzSelectReactor.removeReaders F#rc:|jj|y)zR Remove a Selectable for notification of data available to write. N)rrTrPs r removeWriterzSelectReactor.removeWriters V$rcN|j|j|jSN) _removeAllrrr!s r removeAllzSelectReactor.removeAllst{{DLL99rc,t|jSrY)r%rr!s r getReaderszSelectReactor.getReaderssDKK  rc,t|jSrY)r%rr!s r getWriterszSelectReactor.getWriterssDLL!!rN)__name__ __module__ __qualname____doc__r r/rC doIterationr:rNrRrUrWr[r]r_rrrr8sG2+ 2?hKL ! $ % :!"rrc4t}ddlm}||y)zDConfigure the twisted mainloop to be run using the select() reactor.r)installReactorN)rtwisted.internet.mainrg)reactorrgs rinstallrjsoG47rrjrY) rcrrHerrnorrtimertypingrzope.interfacertwisted.internetrtwisted.internet.interfacesr twisted.pythonr twisted.python.runtimer rr4"twisted.internet.win32eventreactorrr ImportErrorobject__annotations__rrrj__all__rerrrxs   &&5/$7GmmG+L+J ]A"I.. A"A"H +g&%JV %&sBBB