o b@sUdZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd d Zed krIeZnejZzddlmZWneyeeZe eed<YnweZe eGddde jeZddZdgZdS)z Select reactor N)EBADFEINTR)sleep)Type) implementer) posixbase) IReactorFDSet)log) platformTypecCsj|s|s|dur d}nt|d}t|gggfS|dus!|dkr#d}t||||\}}}|||gfS)zWin32 select wrapper.Ng{Gz?gMbP?g?)minrselect)rwetimeoutr@/usr/lib/python3/dist-packages/twisted/internet/selectreactor.py win32selects  rwin32)_ThreadedWin32EventsMixin _extraBasec@sleZdZdZddZddZddZeZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZdS) 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. cCs t|_t|_tj|dS)zV Initialize file descriptor tracking dictionaries and the base class. N)set_reads_writesrPosixReactorBase__init__selfrrrrDszSelectReactor.__init__c Cstdt|j}t|j}|j|j|j|f|j|ffD]<\}}|D]5}z t|g|g|gdWn tyX}ztd||||dWYd}~q)d}~ww| |q)q#dS)Nz1Malformed file descriptor found. Preening lists.rzbad descriptor %sF) r msglistrrclearr Exception_disconnectSelectableadd)rreaderswritersselSetselList selectablerrrr_preenDescriptorsLs"      zSelectReactor._preenDescriptorsc Cs4zt|j|jg|\}}}Wn`ty|YdSty-t|YdStyn}z6|j ddvrI|jsH|jsHWYd}~dS|j dt krWWYd}~dS|j dt kri|WYd}~dSd}~ww|j }tj }|d|jf|d|jffD]\}} } |D]} | | vrq|| || | qqdS)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) rrr rignoredse_drdw_logrun selectablesmethodfdsetr)rrrdoSelect\sB     zSelectReactor.doSelectcCsVzt||}Wntytd}tYnw|r)||||dkdSdS)Nr,)getattr BaseExceptionsysexc_infor r1r#)rr)r;whyrrrr4s   zSelectReactor._doReadOrWritecC|j|dS)zR Add a FileDescriptor for notification of data available to read. N)rr$rreaderrrr addReaderzSelectReactor.addReadercCrD)zS Add a FileDescriptor for notification of data available to write. N)rr$rwriterrrr addWriterrHzSelectReactor.addWritercCrD)zQ Remove a Selectable for notification of data available to read. N)rdiscardrErrr removeReaderrHzSelectReactor.removeReadercCrD)zR Remove a Selectable for notification of data available to write. N)rrLrIrrr removeWriterrHzSelectReactor.removeWritercCs||j|jSN) _removeAllrrrrrr removeAllszSelectReactor.removeAllcC t|jSrO)r rrrrr getReaders zSelectReactor.getReaderscCrRrO)r rrrrr getWritersrTzSelectReactor.getWritersN)__name__ __module__ __qualname____doc__rr*r= doIterationr4rGrKrMrNrQrSrUrrrrr8s 4  rcCst}ddlm}||dS)zDConfigure the twisted mainloop to be run using the select() reactor.r)installReactorN)rtwisted.internet.mainr[)reactorr[rrrinstalls  r^rO) rYr rAerrnorrtimertypingrzope.interfacertwisted.internetrtwisted.internet.interfacesrtwisted.pythonr twisted.python.runtimer rr."twisted.internet.win32eventreactorr ImportErrorobjectr__annotations__rrr^__all__rrrrs4