???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................
YfN                 @   s  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 y e Wn e k
 r i  Z Yn Xd d   Z Gd d   d e  Z e e e f Z d d	   Z d
 d   Z  d d   Z! d d   Z" d d d d  Z# d d d d  Z$ e$ Z% d d d d d d  Z& Gd d   d  Z' Gd d   d e'  Z( d d   Z) d d d d   Z* e j+ d! k r	Gd" d#   d#  Z, Gd$ d%   d% e'  Z- d S)&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             C   sO   y t  j |   SWn7 t t t f k
 rJ |  t k r> t |  Sd |  SYn Xd  S)NzUnknown error %s)osstrerror
ValueErrorOverflowError	NameErrorr   )err r   -/opt/alt/python35/lib64/python3.5/asyncore.py	_strerrorD   s    r   c               @   s   e  Z d  Z d S)ExitNowN)__name__
__module____qualname__r   r   r   r   r   L   s   r   c             C   s;   y |  j    Wn& t k
 r%   Yn |  j   Yn Xd  S)N)handle_read_event_reraised_exceptionshandle_error)objr   r   r   readQ   s    r    c             C   s;   y |  j    Wn& t k
 r%   Yn |  j   Yn Xd  S)N)handle_write_eventr   r   )r   r   r   r   writeY   s    r"   c             C   s;   y |  j    Wn& t k
 r%   Yn |  j   Yn Xd  S)N)handle_expt_eventr   r   )r   r   r   r   
_exceptiona   s    r$   c             C   s   yn | t  j @r |  j   | t  j @r1 |  j   | t  j @rH |  j   | t  j t  j Bt  j	 B@rm |  j
   Wnt t k
 r } z/ | j d t k r |  j   n
 |  j
   WYd  d  } ~ Xn& t k
 r   Yn |  j   Yn Xd  S)Nr   )selectPOLLINr   POLLOUTr!   POLLPRIr#   ZPOLLHUPZPOLLERRZPOLLNVALhandle_closeOSErrorargs_DISCONNECTEDr   r   )r   flagser   r   r   	readwritei   s"    


r/   g        c       	      C   s  | d  k r t  } | rg  } g  } g  } x t | j    D]m \ } } | j   } | j   } | rt | j |  | r | j r | j |  | s | r= | j |  q= Wg  | k o | k o | k n r t j |   d  St	 j	 | | | |   \ } } } x6 | D]. } | j
 |  } | d  k r2qt |  qWx6 | D]. } | j
 |  } | d  k rkqGt |  qGWx6 | D]. } | j
 |  } | d  k rqt |  qWd  S)N)
socket_maplistitemsreadablewritableappend	acceptingtimeZsleepr%   getr    r"   r$   )	timeoutmaprwr.   fdr   Zis_rZis_wr   r   r   poll}   sD      '!r>   c             C   s  | d  k r t  } |  d  k	 r. t |  d  }  t j   } | rx t | j    D]k \ } } d } | j   r | t j t j BO} | j	   r | j
 r | t j O} | rS | j | |  qS W| j |   } x? | D]7 \ } } | j |  } | d  k rq t | |  q Wd  S)Ni  r   )r0   intr%   r>   r1   r2   r3   r&   r(   r4   r6   r'   registerr8   r/   )r9   r:   Zpollsterr=   r   r-   r;   r   r   r   poll2   s(    rA   g      >@Fc             C   s   | d  k r t  } | r0 t t d  r0 t } n t } | d  k r_ xJ | r[ | |  |  qE Wn0 x- | r | d k r | |  |  | d } qb Wd  S)Nr>   r      )r0   hasattrr%   rA   r>   )r9   Zuse_pollr:   countZpoll_funr   r   r   loop   s    		rE   c               @   s  e  Z d  Z d Z d Z d Z d Z d Z d Z e	 d h  Z
 d d d d  Z d d   Z e Z d d d	  Z d d
 d  Z e j e j d d  Z d d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d& d' d(  Z  d) d*   Z! d+ d,   Z" d- d.   Z# d/ d0   Z$ d1 d2   Z% d3 d4   Z& d5 d6   Z' d7 d8   Z( d9 d:   Z) d; d<   Z* d= d>   Z+ d? d@   Z, d S)A
dispatcherFNwarningc             C   s   | d  k r t  |  _ n	 | |  _ d  |  _ | r | j d  |  j | |  d |  _ y | j   |  _ Wq t k
 r } z: | j	 d t
 t f k r d |  _ n |  j |    WYd  d  } ~ Xq Xn	 d  |  _ d  S)Nr   TF)r0   _map_filenosetblocking
set_socket	connectedZgetpeernameaddrr*   r+   r   r   del_channelsocket)selfsockr:   r   r   r   r   __init__   s     			zdispatcher.__init__c             C   s   |  j  j d |  j  j g } |  j r? |  j r? | j d  n |  j rU | j d  |  j d  k	 r y | j d |  j  Wn( t k
 r | j t |  j   Yn Xd d j	 |  t
 |   f S)N.Z	listeningrL   z%s:%dz<%s at %#x> )	__class__r   r   r6   rM   r5   rL   	TypeErrorreprjoinid)rP   Zstatusr   r   r   __repr__   s    	zdispatcher.__repr__c             C   s&   | d  k r |  j  } |  | |  j <d  S)N)rH   rI   )rP   r:   r   r   r   add_channel  s    	zdispatcher.add_channelc             C   s>   |  j  } | d  k r |  j } | | k r1 | | =d  |  _  d  S)N)rI   rH   )rP   r:   r=   r   r   r   rN     s    		zdispatcher.del_channelc             C   s?   | | f |  _  t j | |  } | j d  |  j |  d  S)Nr   )Zfamily_and_typerO   rJ   rK   )rP   ZfamilytyperQ   r   r   r   create_socket  s    zdispatcher.create_socketc             C   s)   | |  _  | j   |  _ |  j |  d  S)N)rO   filenorI   r[   )rP   rQ   r:   r   r   r   rK      s    	zdispatcher.set_socketc             C   sR   y9 |  j  j t  j t  j |  j  j t  j t  j  d B Wn t k
 rM Yn Xd  S)NrB   )rO   Z
setsockopt
SOL_SOCKETZSO_REUSEADDR
getsockoptr*   )rP   r   r   r   set_reuse_addr&  s    	zdispatcher.set_reuse_addrc             C   s   d S)NTr   )rP   r   r   r   r3   7  s    zdispatcher.readablec             C   s   d S)NTr   )rP   r   r   r   r4   :  s    zdispatcher.writablec             C   s:   d |  _  t j d k r* | d k r* d } |  j j |  S)NTnt   )r6   r   namerO   listen)rP   Znumr   r   r   re   A  s    	zdispatcher.listenc             C   s   | |  _  |  j j |  S)N)rM   rO   bind)rP   rM   r   r   r   rf   G  s    	zdispatcher.bindc             C   s   d |  _  d |  _ |  j j |  } | t t t f k sT | t k ra t j	 d k ra | |  _
 d  S| d t f k r | |  _
 |  j   n t | t |   d  S)NFTrb   cer   )rb   rg   )rL   
connectingrO   Z
connect_exr   r   r   r   r   rd   rM   r	   handle_connect_eventr*   r   )rP   Zaddressr   r   r   r   connectK  s    				zdispatcher.connectc             C   s   y |  j  j   \ } } Wn] t k
 r1 d  SYnR t k
 rx } z( | j d t t t f k rc d  S  WYd  d  } ~ Xn X| | f Sd  S)Nr   )rO   acceptrV   r*   r+   r   r   r   )rP   ZconnrM   whyr   r   r   rk   Y  s    zdispatcher.acceptc             C   s   y |  j  j |  } | SWn` t k
 r| } z@ | j d t k rF d S| j d t k rg |  j   d S  WYd  d  } ~ Xn Xd  S)Nr   )rO   sendr*   r+   r   r,   r)   )rP   dataresultrl   r   r   r   rm   g  s    
zdispatcher.sendc             C   s~   y. |  j  j |  } | s) |  j   d S| SWnI t k
 ry } z) | j d t k rd |  j   d S  WYd  d  } ~ Xn Xd  S)N    r   )rO   recvr)   r*   r+   r,   )rP   Zbuffer_sizern   rl   r   r   r   rq   t  s    

zdispatcher.recvc             C   s   d |  _  d |  _ d |  _ |  j   |  j d  k	 r y |  j j   WnA t k
 r } z! | j d t t	 f k rv   WYd  d  } ~ Xn Xd  S)NFr   )
rL   r6   rh   rN   rO   closer*   r+   r   r
   )rP   rl   r   r   r   rr     s    			
zdispatcher.closec             C   s   t  j j d t |   d  S)Nzlog: %s
)sysstderrr"   str)rP   messager   r   r   log  s    zdispatcher.loginfoc             C   s'   | |  j  k r# t d | | f  d  S)Nz%s: %s)ignore_log_typesprint)rP   rv   r\   r   r   r   log_info  s    zdispatcher.log_infoc             C   sM   |  j  r |  j   n3 |  j s? |  j r2 |  j   |  j   n
 |  j   d  S)N)r6   handle_acceptrL   rh   ri   handle_read)rP   r   r   r   r     s    			
zdispatcher.handle_read_eventc             C   s\   |  j  j t  j t  j  } | d k r< t | t |    |  j   d |  _ d |  _ d  S)Nr   TF)	rO   r`   r_   SO_ERRORr*   r   handle_connectrL   rh   )rP   r   r   r   r   ri     s    
	zdispatcher.handle_connect_eventc             C   s7   |  j  r d  S|  j s) |  j r) |  j   |  j   d  S)N)r6   rL   rh   ri   handle_write)rP   r   r   r   r!     s    			
zdispatcher.handle_write_eventc             C   sB   |  j  j t  j t  j  } | d k r4 |  j   n
 |  j   d  S)Nr   )rO   r`   r_   r~   r)   handle_expt)rP   r   r   r   r   r#     s    zdispatcher.handle_expt_eventc             C   sn   t    \ } } } } y t |   } Wn d t |   } Yn X|  j d | | | | f d  |  j   d  S)Nz)<__repr__(self) failed for object at %0x>z:uncaptured python exception, closing channel %s (%s:%s %s)error)compact_tracebackrW   rY   r{   r)   )rP   ZniltvtbinfoZ	self_reprr   r   r   r     s    zdispatcher.handle_errorc             C   s   |  j  d d  d  S)Nz!unhandled incoming priority eventrG   )r{   )rP   r   r   r   r     s    zdispatcher.handle_exptc             C   s   |  j  d d  d  S)Nzunhandled read eventrG   )r{   )rP   r   r   r   r}     s    zdispatcher.handle_readc             C   s   |  j  d d  d  S)Nzunhandled write eventrG   )r{   )rP   r   r   r   r     s    zdispatcher.handle_writec             C   s   |  j  d d  d  S)Nzunhandled connect eventrG   )r{   )rP   r   r   r   r     s    zdispatcher.handle_connectc             C   s)   |  j    } | d  k	 r% |  j |   d  S)N)rk   handle_accepted)rP   Zpairr   r   r   r|     s    zdispatcher.handle_acceptc             C   s   | j    |  j d d  d  S)Nzunhandled accepted eventrG   )rr   r{   )rP   rQ   rM   r   r   r   r     s    
zdispatcher.handle_acceptedc             C   s   |  j  d d  |  j   d  S)Nzunhandled close eventrG   )r{   rr   )rP   r   r   r   r)     s    zdispatcher.handle_close)-r   r   r   debugrL   r6   rh   closingrM   	frozensetry   rR   rZ   __str__r[   rN   rO   ZAF_INETZSOCK_STREAMr]   rK   ra   r3   r4   re   rf   rj   rk   rm   rq   rr   rw   r{   r   ri   r!   r#   r   r   r}   r   r   r|   r   r)   r   r   r   r   rF      sL    	rF   c               @   sR   e  Z d  Z d d d d  Z d d   Z d d   Z d d	   Z d
 d   Z d S)dispatcher_with_sendNc             C   s    t  j |  | |  d |  _ d  S)Nrp   )rF   rR   
out_buffer)rP   rQ   r:   r   r   r   rR     s    zdispatcher_with_send.__init__c             C   s?   d } t  j |  |  j d  d   } |  j | d   |  _ d  S)Nr   i   )rF   rm   r   )rP   Znum_sentr   r   r   initiate_send  s    z"dispatcher_with_send.initiate_sendc             C   s   |  j    d  S)N)r   )rP   r   r   r   r     s    z!dispatcher_with_send.handle_writec             C   s   |  j  p t |  j  S)N)rL   lenr   )rP   r   r   r   r4     s    zdispatcher_with_send.writablec             C   s>   |  j  r  |  j d t |   |  j | |  _ |  j   d  S)Nz
sending %s)r   r{   rW   r   r   )rP   rn   r   r   r   rm     s    	zdispatcher_with_send.send)r   r   r   rR   r   r   r4   rm   r   r   r   r   r     s
   r   c              C   s   t  j   \ }  } } g  } | s- t d   xD | rs | j | j j j | j j j t | j	  f  | j
 } q0 W~ | d \ } } } d j d d   | D  } | | | f |  | | f S)Nztraceback does not existrB   rT   c             S   s   g  |  ] } d  |  q S)z
[%s|%s|%s]r   ).0xr   r   r   
<listcomp>)  s   	 z%compact_traceback.<locals>.<listcomp>)rs   exc_infoAssertionErrorr5   tb_framef_codeco_filenameco_nameru   	tb_linenotb_nextrX   )r   r   tbr   fileZfunctionlinerx   r   r   r   r     s    	r   c             C   s   |  d  k r t  }  x t |  j    D] } y | j   Wq% t k
 r } z$ | j d t k rd n	 | sm   WYd  d  } ~ Xq% t k
 r   Yq% | s   Yq% Xq% W|  j   d  S)Nr   )	r0   r1   valuesrr   r*   r+   r
   r   clear)r:   Z
ignore_allr   r   r   r   	close_all,  s     r   posixc               @   ss   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
 d  Z e Z e Z	 d d   Z
 d d   Z d	 S)file_wrapperc             C   s   t  j |  |  _ d  S)N)r   dupr=   )rP   r=   r   r   r   rR   Q  s    zfile_wrapper.__init__c             C   s1   |  j  d k r# t j d |  t  |  j   d  S)Nr   zunclosed file %r)r=   warningswarnResourceWarningrr   )rP   r   r   r   __del__T  s    zfile_wrapper.__del__c             G   s   t  j |  j |  S)N)r   r    r=   )rP   r+   r   r   r   rq   Y  s    zfile_wrapper.recvc             G   s   t  j |  j |  S)N)r   r"   r=   )rP   r+   r   r   r   rm   \  s    zfile_wrapper.sendNc             C   s9   | t  j k r) | t  j k r) | r) d St d   d  S)Nr   z-Only asyncore specific behaviour implemented.)rO   r_   r~   NotImplementedError)rP   levelZoptnameZbuflenr   r   r   r`   _  s
    zfile_wrapper.getsockoptc             C   s0   |  j  d k  r d  St j |  j   d |  _  d  S)Nr   rB   r   )r=   r   rr   )rP   r   r   r   rr   j  s    zfile_wrapper.closec             C   s   |  j  S)N)r=   )rP   r   r   r   r^   p  s    zfile_wrapper.fileno)r   r   r   rR   r   rq   rm   r`   r    r"   rr   r^   r   r   r   r   r   L  s   r   c               @   s+   e  Z d  Z d d d  Z d d   Z d S)file_dispatcherNc             C   sb   t  j |  d  |  d |  _ y | j   } Wn t k
 r@ Yn X|  j |  t j | d  d  S)NTF)rF   rR   rL   r^   AttributeErrorset_filer   set_blocking)rP   r=   r:   r   r   r   rR   u  s    	zfile_dispatcher.__init__c             C   s/   t  |  |  _ |  j j   |  _ |  j   d  S)N)r   rO   r^   rI   r[   )rP   r=   r   r   r   r     s    zfile_dispatcher.set_file)r   r   r   rR   r   r   r   r   r   r   s  s   r   ).__doc__r%   rO   rs   r7   r   r   errnor   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r,   r0   r   r   	Exceptionr   KeyboardInterrupt
SystemExitr   r    r"   r$   r/   r>   rA   Zpoll3rE   rF   r   r   r   rd   r   r   r   r   r   r   <module>/   s@   X' ,'