
    Vh                       U d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddZedk(  reZnej                  Z	 ddlmZ eZ ed      Z"	 	 	 	 	 	 	 	 ddZ#	 	 	 	 	 	 	 	 ddZ$ ee       G d dejJ                  e             Z&d Z'dgZ(y# e$ r
 e Zde!d<   Y Vw xY w)z
Select reactor
    )annotationsN)EBADFEINTR)sleep)CallableTypeTypeVar)implementer)	posixbase)IReactorFDSetIReadDescriptorIWriteDescriptor)log)platformTypec                    | s#|s!|d}nt        |d      }t        |       g g g fS ||dkD  rd}t        j                  | |||      \  } }}| ||z   g fS )zWin32 select wrapper.g{Gz?gMbP?g      ?)minr   select)rwetimeouts       N/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/selectreactor.pywin32selectr      sl    ?G'5)Gg2rz 'C-mmAq!W-GAq!a!eR<    win32)_ThreadedWin32EventsMixinzType[object]
_extraBase_Tc                    |j                          | D ]/  }	 t        j                  |g|g|gd       |j                  |       1 y # t        $ r,}t	        j
                  d|z          |||d       Y d }~cd }~ww xY w)Nr   zbad descriptor %sF)clearr   add	Exceptionr   msg)toPreen	preenInto
disconnect
selectabler   s        r   	_onePreenr(   :   s{    
 OO &
	&MM:,zlAF
 MM*%&  	-GG'*45z1e,,	-s   A	A;"A66A;c                    t        j                  d       t        |       }t        |      }t        || |       t        |||       y )Nz1Malformed file descriptor found.  Preening lists.)r   r#   listr(   )readswritesr&   readerswriterss        r   _preenDescriptorsr/   J   s;    
 GG?@%)%[G&*6lGguj)gvz*r   c                  Z    e Zd ZdZddZddZd ZeZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zy)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               | _        t        j                  j                  |        y)zV
        Initialize file descriptor tracking dictionaries and the base class.
        N)set_reads_writesr   PosixReactorBase__init__selfs    r   r7   zSelectReactor.__init__b   s*     -0E.1e""++D1r   c                Z    t        | j                  | j                  | j                         y N)r/   r4   r5   _disconnectSelectabler8   s    r   r/   zSelectReactor._preenDescriptorsj   s    $++t||T5O5OPr   c                   	 t        | j                  | j                  g |      \  }}}| j                  }t        j                  }|d| j                  f|d| j                  ffD ]  \  }}	}
|D ]  }||
vr |||||	         y# t        $ r | j	                          Y yt
        $ r' t        j                          | j	                          Y yt        $ r{}|j                  d   dv r| j                  s| j                  sY d}~y |j                  d   t        k(  rY d}~y|j                  d   t        k(  r| j	                          Y d}~y d}~ww xY w)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   )r      doReaddoWrite)_selectr4   r5   
ValueErrorr/   	TypeErrorr   errOSErrorargsr   r   _doReadOrWritecallWithLogger)r9   r   r   r   ignoredse_drdw_logrunselectablesmethodfdsetr'   s               r   doSelectzSelectReactor.doSelectm   sD   	#DKKr7KMAq'< ##$$$++&	4<<(+
 
	?&K * ?
 U*
E:v>?	
	??  	""$ 	 GGI""$ 	 wwqzV#dllu$u$&&( #	s5   &B E,EE)E
E
&E
	E

Ec                    	  t        ||             }|r| j                  |||dk(         y y # t        $ r. t        j                         d   }t	        j
                          Y Pw xY w)N   r?   )getattrBaseExceptionsysexc_infor   rD   r<   )r9   r'   rN   whys       r   rG   zSelectReactor._doReadOrWrite   sc    	-'*f-/C &&z3(8JK   	,,.#CGGI	s   - 4A$#A$c                :    | j                   j                  |       y)zR
        Add a FileDescriptor for notification of data available to read.
        N)r4   r!   r9   readers     r   	addReaderzSelectReactor.addReader   s     	r   c                :    | j                   j                  |       y)zS
        Add a FileDescriptor for notification of data available to write.
        N)r5   r!   r9   writers     r   	addWriterzSelectReactor.addWriter   s     	 r   c                :    | j                   j                  |       y)zQ
        Remove a Selectable for notification of data available to read.
        N)r4   discardrY   s     r   removeReaderzSelectReactor.removeReader   s     	F#r   c                :    | j                   j                  |       y)zR
        Remove a Selectable for notification of data available to write.
        N)r5   ra   r]   s     r   removeWriterzSelectReactor.removeWriter   s     	V$r   c                N    | j                  | j                  | j                        S r;   )
_removeAllr4   r5   r8   s    r   	removeAllzSelectReactor.removeAll   s    t{{DLL99r   c                ,    t        | j                        S r;   )r*   r4   r8   s    r   
getReaderszSelectReactor.getReaders   s    DKK  r   c                ,    t        | j                        S r;   )r*   r5   r8   s    r   
getWriterszSelectReactor.getWriters   s    DLL!!r   N)returnNone)__name__
__module____qualname____doc__r7   r/   rP   doIterationrG   r[   r_   rb   rd   rg   ri   rk    r   r   r1   r1   V   sH    2Q2?h KL !$%:!"r   r1   c                 4    t               } ddlm}  ||        y)zDConfigure the twisted mainloop to be run using the select() reactor.r   )installReactorN)r1   twisted.internet.mainru   )reactorru   s     r   installrx      s    oG47r   rx   r;   )r$   zlist[_T]r%   zset[_T]r&   z%Callable[[_T, Exception, bool], None]rl   rm   )r+   zset[IReadDescriptor]r,   zset[IWriteDescriptor]r&   zECallable[[IReadDescriptor | IWriteDescriptor, Exception, bool], None]rl   rm   ))rq   
__future__r   r   rU   errnor   r   timer   typingr   r   r	   zope.interfacer
   twisted.internetr   twisted.internet.interfacesr   r   r   twisted.pythonr   twisted.python.runtimer   r   rA   "twisted.internet.win32eventreactorr   r   ImportErrorobject__annotations__r   r(   r/   r6   r1   rx   __all__rs   r   r   <module>r      s  
 #  
   * * & & X X  /$ 7GmmG+L +JT]&&& 6& 
	& 	+	+!	+ V	+ 
		+ ]t"I..
 t" t"n +I  &%J%&s   %B5 5CC