
    kcA                     `   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mZmZm	Z	m
Z
mZmZmZmZmZ ddlmZmZ 	 e  G d de      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jF                  dk(  rddl$Z$ G d d      Z% G d de      Z&yy# e$ r i ZY tw 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 preemptive
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ENOTCONN	ESHUTDOWNEINTREISCONN	errorcode)	as_stringas_bytesc                       e Zd Zy)ExitNowN)__name__
__module____qualname__     ?/usr/lib/python3/dist-packages/supervisor/medusa/asyncore_25.pyr   r   A   s    r   r   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wN)handle_read_eventr   handle_errorobjs    r   readr   D   1         0c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr   )handle_write_eventr   r   r   s    r   writer!   L   s1      r   c                 f    	 | j                          y # t        $ r   | j                          Y y xY wr   )handle_expt_eventr   r   r   s    r   
_exceptionr$   T   r   r   c                    	 |t         j                  t         j                  z  z  r| j                          |t         j                  z  r| j                          |t         j                  t         j                  z  t         j                  z  z  r| j                          y y # t        $ r   | j                          Y y xY wr   )selectPOLLINPOLLPRIr   POLLOUTr    POLLERRPOLLHUPPOLLNVALr#   r   r   )r   flagss     r   	readwriter.   \   s    
FMMFNN23!!#6>>!""$FNNV^^3fooEF!!# G s   BB   B=c                    |t         }|r4g }g }g }|j                         D ]a  \  }}|j                         }|j                         }|r|j	                  |       |r|j	                  |       |s|sQ|j	                  |       c g |cxk(  r|cxk(  r|k(  rn nt        j                  |        n	 t        j                  ||||       \  }}}|D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t        |       # |D ]!  }|j                  |      }|t        |       # y y # t        j                  $ r!}	|	j                  d   t        k7  r Y d }	~	y d }	~	ww xY wNr   )
socket_mapitemsreadablewritableappendtimesleepr&   errorargsr	   getr   r!   r$   )
timeoutmaprwefdr   is_ris_werrs
             r   pollrD   i   so   
{
BByy{ 	GB<<>D<<>Dt	 a1JJw --1a91a  	B''"+C{I		  	B''"+C{#J		  	B''"+C{sO		E   << 88A;%'	s   1E E5E00E5c                    |t         }| t        | dz        } t        j                         }|r|j	                         D ]  \  }}d}|j                         r$|t        j                  t        j                  z  z  }|j                         r|t        j                  z  }|sb|t        j                  t        j                  z  t        j                  z  z  }|j                  ||        	 |j                  |       }|D ]%  \  }}|j#                  |      }|t%        ||       ' y y # t        j                  $ r#}|j                  d   t         k7  r g }Y d }~]d }~ww xY w)Ni  r   )r1   intr&   rD   r2   r3   r'   r(   r4   r)   r*   r+   r,   registerr8   r9   r	   r:   r.   )r;   r<   pollsterr@   r   r-   r=   rC   s           r   poll2rI      s2   
{gdl#{{}H
yy{ 
	-GBE||~77||~' &..86??JJ!!"e,
	-	g&A
  	"IB''"+C{c5!		"%  || 	xx{e#A	s   +D( (E;EE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 )NrD   r      )r1   hasattrr&   rI   rD   )r;   use_pollr<   countpoll_funs        r   looprP      sh    
{GFF+}Wc"  eaiWc"QJE eaicicr   c                       e Zd ZdZdZdZdZdZd dZd Z	d!dZ
d!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d"dZd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$y)#
dispatcherFNc                    |t         | _        n|| _        |rK| j                  ||       | j                  j	                  d       d| _        	 |j                         | _        y d | _        y # t        j                  $ r Y y w xY w)Nr   T)	r1   _map
set_socketsocketsetblocking	connectedgetpeernameaddrr8   selfsockr<   s      r   __init__zdispatcher.__init__   su    ;"DIDIOOD#&KK##A&!DN ,,.	
 DK	 << s   A+ +B 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.	listeningrX   z%s:%dz<%s at %#x> )	__class__r   r   	acceptingrZ   r5   rX   	TypeErrorreprjoinid)r\   statuss     r   __repr__zdispatcher.__repr__   s    ..++C/0G0GGH>>diiMM+&^^MM+&99 /g		12  0"T(;;;  /d499o./s   C -C32C3c                 >    || j                   }| || j                  <   y r   )rT   _fileno)r\   r<   s     r   add_channelzdispatcher.add_channel   s    ;))C DLLr   c                 T    | j                   }|| j                  }||v r||= d | _         y r   )rl   rT   )r\   r<   r@   s      r   del_channelzdispatcher.del_channel   s.    \\;))C9Br   c                     ||f| _         t        j                  ||      | _        | j                  j                  d       | j                  j                         | _        | j                          y r0   )family_and_typerV   rW   filenorl   rm   )r\   familytypes      r   create_socketzdispatcher.create_socket  sR    %t|mmFD1"{{))+r   c                 ^    || _         |j                         | _        | j                  |       y r   )rV   rr   rl   rm   r[   s      r   rU   zdispatcher.set_socket  s$    {{}r   c                    	 | j                   j                  t         j                  t         j                  | j                   j	                  t         j                  t         j                        dz         y # t         j
                  $ r Y y w xY w)NrK   )rV   
setsockopt
SOL_SOCKETSO_REUSEADDR
getsockoptr8   r\   s    r   set_reuse_addrzdispatcher.set_reuse_addr  sn    	KK""!!6#6#6&&v'8'8'-':':<>?@
 || 		s   A2A5 5B
Bc                      yNTr   r|   s    r   r3   zdispatcher.readable      r   c                      yr   r   r|   s    r   r4   zdispatcher.writable"  r   r   c                 z    d| _         t        j                  dk(  r|dkD  rd}| j                  j	                  |      S )NTnt   rK   )rd   osnamerV   listen)r\   nums     r   r   zdispatcher.listen)  s4    77d?sQwC{{!!#&&r   c                 F    || _         | j                  j                  |      S r   )rZ   rV   bind)r\   rZ   s     r   r   zdispatcher.bind/  s    	{{%%r   c                     d| _         | j                  j                  |      }|t        t        t
        fv ry |dt        fv r|| _        d| _         | j                          y t        j                  |t        |         )NFr   T)rX   rV   
connect_exr   r   r   r
   rZ   handle_connectr8   r   )r\   addressrC   s      r   connectzdispatcher.connect3  sj    kk$$W-;+661g,DI!DN!,,sIcN33r   c                     	 | j                   j                         \  }}||fS # t         j                  $ r"}|j                  d   t        k(  rn Y d }~y d }~ww xY wr0   )rV   acceptr8   r9   r   )r\   connrZ   whys       r   r   zdispatcher.accept@  sV    	++-JD$:|| 	xx{k) 	s    # AAAc                     	 | j                   j                  |      }|S # t         j                  $ r!}|j                  d   t        k(  rY d }~y d }~ww xY wr0   )rV   sendr8   r9   r   )r\   dataresultr   s       r   r   zdispatcher.sendK  sJ    	[[%%d+FM|| 	xx{k)		s    AAAAc                    	 | j                   j                  |      }|s| j                          y|S # t         j                  $ r;}|j                  d   t
        t        t        fv r| j                          Y d }~y d }~ww xY w)Nr   r   )rV   recvhandle_closer8   r9   r   r   r   )r\   buffer_sizer   r   s       r   r   zdispatcher.recvU  sq    	;;##K0D !!#|| 	xx{z8Y??!!#	s   -2 2 B 0A;:A;;B c                 X    | j                          | j                  j                          y r   )ro   rV   closer|   s    r   r   zdispatcher.closeg  s    r   c                 .    t        | j                  |      S r   )getattrrV   )r\   attrs     r   __getattr__zdispatcher.__getattr__m  s    t{{D))r   c                 Z    t         j                  j                  dt        |      z         y )Nzlog: %s
)sysstderrr!   str)r\   messages     r   logzdispatcher.logt  s    

s7|34r   c                 &    	 t        |d|       y )Nz: )print)r\   r   rt   s      r   log_infozdispatcher.log_infow  s    dG,-r   c                     | j                   r$| j                  sd| _        | j                          y | j                  s(| j                          d| _        | j	                          y | j	                          y r   )rd   rX   handle_acceptr   handle_readr|   s    r   r   zdispatcher.handle_read_event{  sW    >> >>!% !!DNr   c                 j    | j                   s| j                          d| _         | j                          y r   )rX   r   handle_writer|   s    r   r    zdispatcher.handle_write_event  s(    ~~!!DNr   c                 $    | j                          y r   )handle_exptr|   s    r   r#   zdispatcher.handle_expt_event  s    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 (:rb   )r8   )compact_tracebackrf   rh   r   r   )r\   niltvtbinfo	self_reprs         r   r   zdispatcher.handle_error  sg    -/Q6	OT
I 		 	 	

	OCbhNIs   A Ac                 (    | j                  dd       y )Nzunhandled exceptionwarningr   r|   s    r   r   zdispatcher.handle_expt  s    +Y7r   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                 (    | j                  dd       y )Nzunhandled accept eventr   r   r|   s    r   r   zdispatcher.handle_accept  s    .	:r   c                 H    | j                  dd       | j                          y )Nzunhandled close eventr   )r   r   r|   s    r   r   zdispatcher.handle_close  s    -y9

r   NNr   )info)%r   r   r   debugrX   rd   closingrZ   r^   rj   rm   ro   ru   rU   r}   r3   r4   r   r   r   r   r   r   r   r   r   r   r   r    r#   r   r   r   r   r   r   r   r   r   r   rR   rR      s    EIIGD*<!	"'&4	$*5.(89:<;r   rR   c                   ,    e Zd ZddZd Zd Zd Zd Zy)dispatcher_with_sendNc                 @    t         j                  | ||       d| _        y )Nr   )rR   r^   
out_bufferr[   s      r   r^   zdispatcher_with_send.__init__  s    D$,r   c                 r    t         j                  | | j                  d d       }| j                  |d  | _        y )Ni   )rR   r   r   )r\   num_sents     r   initiate_sendz"dispatcher_with_send.initiate_send  s/    ??4#)>?//()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   )rX   lenr   r|   s    r   r4   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   rf   r   r   )r\   r   s     r   r   zdispatcher_with_send.send  s:    ::MM,d34//D0r   r   )r   r   r   r^   r   r   r4   r   r   r   r   r   r     s    5<r   r   c                     t        j                         \  } }}g }|sJ |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| ||fS c c}w )Nrb   z
[%s|%s|%s])r   exc_infor5   tb_framef_codeco_filenameco_namer   	tb_linenotb_nextrg   )	r   r   tbr   filefunctionlinexr   s	            r   r   r     s    ||~HAq"FI2
KK**KK&& 	
 ZZ  	!":D(D88v6!\A%67D(D!1a-- 7s   ,Cc                     | t         } | j                         D ]  }|j                  j                           | j	                          y r   )r1   valuesrV   r   clear)r<   r   s     r   	close_allr     s8    
{ZZ\ 	IIKr   posixc                   2    e Zd Zd Zd Zd ZeZeZd Zd Z	y)file_wrapperc                     || _         y r   r@   r\   r@   s     r   r^   zfile_wrapper.__init__  s	    DGr   c                 T    t        t        j                  | j                  |            S r   )r   r   r   r@   )r\   
buffersizes     r   r   zfile_wrapper.recv
  s    RWWTWWj9::r   c                 T    t        j                  | j                  t        |            S r   )r   r!   r@   r   )r\   ss     r   r   zfile_wrapper.send  s    88DGGXa[11r   c                 B    t        j                  | j                         y r   )r   r   r@   r|   s    r   r   zfile_wrapper.close  s    HHTWWr   c                     | j                   S r   r   r|   s    r   rr   zfile_wrapper.fileno  s    77Nr   N)
r   r   r   r^   r   r   r   r!   r   rr   r   r   r   r   r     s'    		;	2 		r   r   c                       e Zd ZddZd Zy)file_dispatcherNc                    t         j                  | d |       d| _        | j                  |       t	        j                  |t        j
                  d      }|t        j                  z  }t	        j                  |t        j                  |       y )NTr   )	rR   r^   rX   set_filefcntlF_GETFLr   
O_NONBLOCKF_SETFL)r\   r@   r<   r-   s       r   r^   zfile_dispatcher.__init__  s_    dC0!DNMM"KKEMM15ER]]"EKKEMM51r   c                 R    || _         t        |      | _        | j                          y r   )rl   r   rV   rm   r   s     r   r   zfile_dispatcher.set_file$  s!    DL&r*DKr   r   )r   r   r   r^   r   r   r   r   r   r     s    	2	r   r   )g        N)g      >@FNNr   )'__doc__r&   rV   r   r6   r   errnor   r   r   r   r   r   r	   r
   r   supervisor.compatr   r   r1   	NameError	Exceptionr   r   r!   r$   r.   rD   rI   poll3rP   rR   r   r   r   r   r   r   r   r   r   r   <module>r      s   8*   
  	4 4 4 2	i 	)V"@ 	$p pn: 4.&( 77g ,* 3 E  Js   B# #B-,B-