
    dafO                        d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ  eeeeeeeh      Z	 e d Z G d de      ZeeefZd Zd Z d	 Z!d
 Z"ddZ#ddZ$e$Z%ddZ& G d d      Z' G d de'      Z(d Z)ddZ*ejV                  dk(  r G d d      Z, G d de'      Z-yy# e$ r i ZY xw xY w)a  Basic infrastructure for asynchronous socket service clients and servers.

There are only two ways to have a program on a single processor do "more
than one thing at a time".  Multi-threaded programming is the simplest and
most popular way to do it, but there is another very different technique,
that lets you have nearly all the advantages of multi-threading, without
actually using multiple threads. it's really only practical if your program
is largely I/O bound. If your program is CPU bound, then pre-emptive
scheduled threads are probably what you really need. Network servers are
rarely CPU-bound, however.

If your operating system supports the select() system call in its I/O
library (and nearly all do), then you can use it to juggle multiple
communication channels at once; doing other work while your I/O is taking
place in the "background."  Although this strategy can seem strange and
complex, especially at first, it is in many ways easier to understand and
control than multi-threaded programming. The module documented here solves
many of the difficult problems for you, making the task of building
sophisticated high-performance network servers and clients a snap.
    N)EALREADYEINPROGRESSEWOULDBLOCK
ECONNRESETEINVALENOTCONN	ESHUTDOWNEISCONNEBADFECONNABORTEDEPIPEEAGAIN	errorcodec                     	 t        j                  |       S # t        t        t        f$ r | t
        v rt
        |    cY S d| z  cY S w xY w)NzUnknown error %s)osstrerror
ValueErrorOverflowError	NameErrorr   )errs    0/root/Python-3.12.4/Lib/test/support/asyncore.py	_strerrorr   J   sI    '{{3y1 ')S>!!3&&'s    %AAAc                       e Zd Zy)ExitNowN)__name__
__module____qualname__     r   r   r   R   s    r   r   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wN)handle_read_event_reraised_exceptionshandle_errorobjs    r   readr'   W   1         0c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr!   )handle_write_eventr#   r$   r%   s    r   writer,   _   s1      r)   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr!   )handle_expt_eventr#   r$   r%   s    r   
_exceptionr/   g   r(   r)   c                 6   	 |t         j                  z  r| j                          |t         j                  z  r| j	                          |t         j
                  z  r| j                          |t         j                  t         j                  z  t         j                  z  z  r| j                          y y # t        $ rB}|j                  t        vr| j                          n| j                          Y d }~y Y d }~y d }~wt        $ r   | j                          Y y xY wr!   )selectPOLLINr"   POLLOUTr+   POLLPRIr.   POLLHUPPOLLERRPOLLNVALhandle_closeOSErrorerrno_DISCONNECTEDr$   r#   )r&   flagses      r   	readwriter>   o   s    6== !!#6>>!""$6>>!!!#FNNV^^3fooEF G 77-'    s   B.B2 2	D;3C88Dc                    |t         }|rHg }g }g }t        |j                               D ]m  \  }}|j                         }|j	                         }|r|j                  |       |r|j                  s|j                  |       |s|s]|j                  |       o g |cxk(  r|cxk(  r|k(  rn nt        j                  |        y t        j                  ||||       \  }}}|D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t        |       # y y r!   )
socket_maplistitemsreadablewritableappend	acceptingtimesleepr1   getr'   r,   r/   )	timeoutmaprwr=   fdr&   is_ris_ws	            r   pollrQ      sI   
{
BBCIIK( 		GB<<>D<<>DCMMt		 a1JJw--1a11a 	B''"+C{I		  	B''"+C{#J		  	B''"+C{sO		= r   c                    |t         }| t        | dz        } t        j                         }|rt	        |j                               D ]  \  }}d}|j                         r$|t        j                  t        j                  z  z  }|j                         r|j                  s|t        j                  z  }|sn|j                  ||        |j                  |       }|D ]%  \  }}|j                  |      }|t        ||       ' y y )Ni  r   )r@   intr1   rQ   rA   rB   rC   r2   r4   rD   rF   r3   registerrI   r>   )rJ   rK   pollsterrN   r&   r<   rL   s          r   poll2rV      s    
{gdl#{{}H
CIIK( 	-GBE||~77||~cmm'!!"e,	- MM'" 	"IB''"+C{c5!		" r   c                     |t         }|rt        t        d      rt        }nt        }||r || |       |ry y |r|dkD  r || |       |dz
  }|r|dkD  ry y y y )NrQ   r      )r@   hasattrr1   rV   rQ   )rJ   use_pollrK   countpoll_funs        r   loopr]      sh    
{GFF+}Wc"  eaiWc"AIE eaicicr   c                   "   e Zd ZdZdZdZdZdZdZ e	dh      Z
d"dZd Zd#dZd#dZej                   ej"                  fdZd#d	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd$dZd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d  Z*d! Z+y)%
dispatcherFNwarningc                 `   |t         | _        n|| _        d | _        |rA|j                  d       | j	                  ||       d| _        	 |j                         | _        y d | _        y # t        $ r<}|j                  t        t        fv rd| _        n| j                  |        Y d }~y d }~ww xY w)NFT)r@   _map_filenosetblocking
set_socket	connectedgetpeernameaddrr9   r:   r   r   del_channelsocket)selfsockrK   r   s       r   __init__zdispatcher.__init__   s    ;"DIDI U#OOD#&!DN ,,.	 DK  
996 22 &+DN
 $$S) #	
s   
A( (	B-12B((B-c                    | j                   j                  dz   | j                   j                  z   g}| j                  r| j                  r|j                  d       n| j                  r|j                  d       | j                  	 |j                  d| j                  z         ddj                  |      t        |       fz  S # t        $ r' |j                  t        | j                               Y Nw xY w)N.	listeningrf   z%s:%dz<%s at %#x> )	__class__r   r   rF   rh   rE   rf   	TypeErrorreprjoinid)rk   statuss     r   __repr__zdispatcher.__repr__  s    ..++C/0K0KKL>>diiMM+&^^MM+&99 /g		12  0"T(;;;  /d499o./s   C -C32C3c                 >    || j                   }| || j                  <   y r!   )rb   rc   )rk   rK   s     r   add_channelzdispatcher.add_channel  s    ;))C DLLr   c                 T    | j                   }|| j                  }||v r||= d | _         y r!   )rc   rb   )rk   rK   rN   s      r   ri   zdispatcher.del_channel  s.    \\;))C9Br   c                     ||f| _         t        j                  ||      }|j                  d       | j                  |       y NF)family_and_typerj   rd   re   )rk   familytyperl   s       r   create_socketzdispatcher.create_socket  s8    %t|}}VT*r   c                 ^    || _         |j                         | _        | j                  |       y r!   )rj   filenorc   rz   rk   rl   rK   s      r   re   zdispatcher.set_socket$  s$    {{}r   c                    	 | j                   j                  t         j                  t         j                  | j                   j	                  t         j                  t         j                        dz         y # t
        $ r Y y w xY w)NrX   )rj   
setsockopt
SOL_SOCKETSO_REUSEADDR
getsockoptr9   rk   s    r   set_reuse_addrzdispatcher.set_reuse_addr)  sj    	KK""!!6#6#6&&v'8'8'-':':<>?@
  		s   A2A5 5	B Bc                      yNTr   r   s    r   rC   zdispatcher.readable:      r   c                      yr   r   r   s    r   rD   zdispatcher.writable=  r   r   c                 z    d| _         t        j                  dk(  r|dkD  rd}| j                  j	                  |      S )NTnt   )rF   r   namerj   listen)rk   nums     r   r   zdispatcher.listenD  s4    77d?sQwC{{!!#&&r   c                 F    || _         | j                  j                  |      S r!   )rh   rj   bind)rk   rh   s     r   r   zdispatcher.bindJ  s    	{{%%r   c                 ,   d| _         d| _        | j                  j                  |      }|t        t
        t        fv s|t        k(  rt        j                  dk(  r|| _
        y |dt        fv r|| _
        | j                          y t        |t        |         )NFTr   r   )rf   
connectingrj   
connect_exr   r   r   r   r   r   rh   r
   handle_connect_eventr9   r   )rk   addressr   s      r   connectzdispatcher.connectN  s~    kk$$W-;+66&=RWW_DI1g,DI%%'#y~..r   c                     	 | j                   j                         \  }}||fS # t        $ r Y y t        $ r(}|j                  t
        t        t        fv rY d }~y  d }~ww xY wr!   )rj   acceptrs   r9   r:   r   r   r   )rk   connrh   whys       r   r   zdispatcher.accept\  s_    
	++-JD$ :  	 	yy[,??		s   # 	AAAAAc                     	 | j                   j                  |      }|S # t        $ rE}|j                  t        k(  rY d }~y|j                  t
        v r| j                          Y d }~y d }~ww xY wNr   )rj   sendr9   r:   r   r;   r8   )rk   dataresultr   s       r   r   zdispatcher.sendj  s]    
	[[%%d+FM 	yyK'm+!!#	s     	A-A( "A('A((A-c                     	 | j                   j                  |      }|s| j                          y|S # t        $ r-}|j                  t
        v r| j                          Y d }~y d }~ww xY wNr   )rj   recvr8   r9   r:   r;   )rk   buffer_sizer   r   s       r   r   zdispatcher.recvw  sb    	;;##K0D !!# 	yyM)!!#	s   -2 2 	A("A#"A##A(c                     d| _         d| _        d| _        | j                          | j                  	 | j                  j                          y y # t        $ r#}|j                  t        t        fvr Y d }~y d }~ww xY wr}   )
rf   rF   r   ri   rj   closer9   r:   r   r   )rk   r   s     r   r   zdispatcher.close  sr    ;;"!!# #  99Xu$55 6s   A 	A;A66A;c                 Z    t         j                  j                  dt        |      z         y )Nzlog: %s
)sysstderrr,   str)rk   messages     r   logzdispatcher.log  s    

s7|34r   c                 B    || j                   vrt        |d|       y y )Nz: )ignore_log_typesprint)rk   r   r   s      r   log_infozdispatcher.log_info  s"    t,,,dG,- -r   c                     | j                   r| j                          y | j                  s-| j                  r| j	                          | j                          y | j                          y r!   )rF   handle_acceptrf   r   r   handle_readr   s    r   r"   zdispatcher.handle_read_event  sI    >>  ))+r   c                     | j                   j                  t         j                  t         j                        }|dk7  rt	        |t        |            | j                          d| _        d| _        y )Nr   TF)	rj   r   r   SO_ERRORr9   r   handle_connectrf   r   rk   r   s     r   r   zdispatcher.handle_connect_event  sT    kk$$V%6%6H!8#y~..r   c                     | j                   ry | j                  s| j                  r| j                          | j	                          y r!   )rF   rf   r   r   handle_writer   s    r   r+   zdispatcher.handle_write_event  s4    >> ~~))+r   c                     | j                   j                  t         j                  t         j                        }|dk7  r| j	                          y | j                          y r   )rj   r   r   r   r8   handle_exptr   s     r   r.   zdispatcher.handle_expt_event  sE     kk$$V%6%6H!8 r   c                     t               \  }}}}	 t        |       }| j                  d|d|d|d|d	d       | j	                          y #  dt        |       z  }Y BxY w)Nz)<__repr__(self) failed for object at %0x>z-uncaptured python exception, closing channel z (:rq   )error)compact_tracebackrt   rv   r   r8   )rk   niltvtbinfo	self_reprs         r   r$   zdispatcher.handle_error  sj    -/Q6	OT
I 		 	 		OCbhNIs   A Ac                 (    | j                  dd       y )Nz!unhandled incoming priority eventr`   r   r   s    r   r   zdispatcher.handle_expt  s    99Er   c                 (    | j                  dd       y )Nzunhandled read eventr`   r   r   s    r   r   zdispatcher.handle_read  s    ,i8r   c                 (    | j                  dd       y )Nzunhandled write eventr`   r   r   s    r   r   zdispatcher.handle_write  s    -y9r   c                 (    | j                  dd       y )Nzunhandled connect eventr`   r   r   s    r   r   zdispatcher.handle_connect  s    /;r   c                 H    | j                         }| | j                  |  y y r!   )r   handle_accepted)rk   pairs     r   r   zdispatcher.handle_accept  s(    {{} D  $' r   c                 H    |j                          | j                  dd       y )Nzunhandled accepted eventr`   )r   r   )rk   rl   rh   s      r   r   zdispatcher.handle_accepted  s    

0)<r   c                 H    | j                  dd       | j                          y )Nzunhandled close eventr`   )r   r   r   s    r   r8   zdispatcher.handle_close  s    -y9

r   NNr!   )info),r   r   r   debugrf   rF   r   closingrh   	frozensetr   rm   rx   rz   ri   rj   AF_INETSOCK_STREAMr   re   r   rC   rD   r   r   r   r   r   r   r   r   r   r"   r   r+   r.   r$   r   r   r   r   r   r   r8   r   r   r   r_   r_      s    EIIJGD )-@<! $*>>8J8J 
	"'&/$
 5.
 	(F9:<(
=r   r_   c                   ,    e Zd ZddZd Zd Zd Zd Zy)dispatcher_with_sendNc                 @    t         j                  | ||       d| _        y r   )r_   rm   
out_bufferr   s      r   rm   zdispatcher_with_send.__init__  s    D$,r   c                 v    d}t         j                  | | j                  d d       }| j                  |d  | _        y )Nr   i   )r_   r   r   )rk   num_sents     r   initiate_sendz"dispatcher_with_send.initiate_send  s4    ??4%)@A//()4r   c                 $    | j                          y r!   )r   r   s    r   r   z!dispatcher_with_send.handle_write  s    r   c                 J    | j                    xs t        | j                        S r!   )rf   lenr   r   s    r   rD   zdispatcher_with_send.writable  s    NN";s4??';;r   c                     | j                   r| j                  dt        |      z         | j                  |z   | _        | j	                          y )Nz
sending %s)r   r   rt   r   r   )rk   r   s     r   r   zdispatcher_with_send.send  s:    ::MM,d34//D0r   r   )r   r   r   rm   r   r   rD   r   r   r   r   r   r      s    5
<r   r   c                     t        j                         } | j                  }|st        d      g }|rr|j	                  |j
                  j                  j                  |j
                  j                  j                  t        |j                        f       |j                  }|rr~|d   \  }}}dj                  |D cg c]  }d|z  	 c}      }|||ft        |       | |fS c c}w )Nztraceback does not existrq   z
[%s|%s|%s])r   	exception__traceback__AssertionErrorrE   tb_framef_codeco_filenameco_namer   	tb_linenotb_nextru   r   )exctbr   filefunctionlinexr   s           r   r   r     s    
--/C			B788F
KK**KK&& 	
 ZZ  	!":D(D88v6!\A%67D(D!49c477 7s   =C"c                    | t         } t        | j                               D ]  }	 |j                           | j                          y # t        $ r!}|j
                  t        k(  rn|s Y d }~Ld }~wt        $ r   |s Y _xY wr!   )	r@   rA   valuesr   r9   r:   r   r#   clear)rK   
ignore_allr   s      r   	close_allr   0  s}    
{#**, 	GGI IIK  	ww%# 		 s   A			BA..Bposixc                   @    e Zd Zd Zd Zd Zd Zd	dZeZeZ	d Z
d Zy)
file_wrapperc                 8    t        j                  |      | _        y r!   )r   duprN   rk   rN   s     r   rm   zfile_wrapper.__init__U  s    ffRjDGr   c                     | j                   dk\  rt        j                  d| z  t        |        | j	                          y )Nr   zunclosed file %r)source)rN   warningswarnResourceWarningr   r   s    r   __del__zfile_wrapper.__del__X  s/    ww!|047%)+JJLr   c                 B    t        j                  | j                  g| S r!   )r   r'   rN   rk   argss     r   r   zfile_wrapper.recv^  s    77477*T**r   c                 B    t        j                  | j                  g| S r!   )r   r,   rN   r  s     r   r   zfile_wrapper.senda  s    88DGG+d++r   Nc                 j    |t         j                  k(  r|t         j                  k(  r|syt        d      )Nr   z-Only asyncore specific behaviour implemented.)rj   r   r   NotImplementedError)rk   leveloptnamebuflens       r   r   zfile_wrapper.getsockoptd  s4    ***6??*% '5 6 6r   c                 t    | j                   dk  ry | j                   }d| _         t        j                  |       y )Nr   r   )rN   r   r   r  s     r   r   zfile_wrapper.closeo  s+    ww{BDGHHRLr   c                     | j                   S r!   )rN   r   s    r   r   zfile_wrapper.filenov  s    77Nr   r!   )r   r   r   rm   r	  r   r   r   r'   r,   r   r   r   r   r   r   r   P  s1    
	!		+	,	6 		r   r   c                       e Zd ZddZd Zy)file_dispatcherNc                     t         j                  | d |       d| _        	 |j                         }| j                  |       t        j                  |d       y # t        $ r Y 3w xY w)NTF)r_   rm   rf   r   AttributeErrorset_filer   set_blocking)rk   rN   rK   s      r   rm   zfile_dispatcher.__init__{  s[    dC0!DNYY[ MM"OOB&	 " s   A 	A$#A$c                     t        |      | _        | j                  j                         | _        | j	                          y r!   )r   rj   r   rc   rz   r  s     r   r  zfile_dispatcher.set_file  s.    &r*DK;;--/DLr   r!   )r   r   r   rm   r  r   r   r   r  r  y  s    		'	r   r  )g        N)g      >@FNNr}   ).__doc__r1   rj   r   rG   r  r   r:   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r;   r@   r   r   	Exceptionr   KeyboardInterrupt
SystemExitr#   r'   r,   r/   r>   rQ   rV   poll3r]   r_   r   r   r   r   r   r  r   r   r   <module>r!     s
  B*   
   	   
 :xL% " #'	i 	  !2J? (%N"4 	$a aP	: 68*> 77g' 'R* U Q  Js   B9 9CC