PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  4h^c@sdZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z mZmZyeWnek riZnXdefdYZdZdZdZd Zd dd Zd dd ZeZd edddZdddYZdefdYZdZ ddZ!ej"dkrddl#Z#dddYZ$defdYZ%ndS(sBasic 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. iN( tEALREADYt EINPROGRESSt EWOULDBLOCKt ECONNRESETtENOTCONNt ESHUTDOWNtEINTRtEISCONNt errorcodetExitNowcBseZRS((t__name__t __module__(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR ?scCs9y|jWn$tk r$n|jnXdS(N(thandle_read_eventR t handle_error(tobj((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytreadBs  cCs9y|jWn$tk r$n|jnXdS(N(thandle_write_eventR R (R((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytwriteJs  cCs9y|jWn$tk r$n|jnXdS(N(thandle_expt_eventR R (R((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt _exceptionRs  cCsyg|tjtjB@r$|jn|tj@r>|jn|tjtjBtjB@rf|j nWn$t k r}n|j nXdS(N( tselecttPOLLINtPOLLPRIR tPOLLOUTRtPOLLERRtPOLLHUPtPOLLNVALRR R (Rtflags((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt readwriteZs    gc Cs|dkrt}n|rg}g}g}xz|jD]l\}}|j}|j}|rt|j|n|r|j|n|s|r:|j|q:q:Wg|ko|ko|knrtj|n[y%tj||||\}}}Wn3tj k r;} | j dt kr4q<dSnXx9|D]1}|j |}|dkrjqCnt |qCWx9|D]1}|j |}|dkrqnt|qWx<|D]1}|j |}|dkrqnt|qWndS(Ni(tNonet socket_maptitemstreadabletwritabletappendttimetsleepRterrortargsRtgetRRR( ttimeouttmaptrtwtetfdRtis_rtis_wterr((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytpollgsL     '%      cCss|dkrt}n|dk r4t|d}ntj}|rox|jD]\}}d}|jr|tjtjBO}n|j r|tj O}n|rS|tj tj Btj BO}|j||qSqSWy|j|}Wn5tjk r&}|jdtkrng}nXxE|D]:\}}|j|}|dkr[q.nt||q.WndS(Nii(RRtintRR1RR RRR!RRRRtregisterR%R&RR'R(R(R)tpollsterR-RRR*R0((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytpoll2s4        g>@cCs|dkrt}n|r3ttdr3t}nt}|dkrbxJ|r^|||qHWn0x-|r|dkr||||d}qeWdS(NR1ii(RRthasattrRR5R1(R(tuse_pollR)tcounttpoll_fun((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytloops      t dispatchercBs=eZeZeZeZeZdZdddZ dZ ddZ ddZ dZ ddZdZdZdZd Zd Zd Zd Zd ZdZdZdZdZddZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%RS(cCs|dkrt|_n ||_|r}|j|||jjdt|_y|j|_ Wqtj k ryqXn d|_dS(Ni( RRt_mapt set_sockettsockett setblockingtTruet connectedt getpeernametaddrR%(tselftsockR)((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt__init__s    cCs|jjd|jjg}|jr?|jr?|jdn|jrX|jdn|jdk ry|jd|jWqtk r|jt |jqXnddj |t |fS(Nt.t listeningRAs%s:%ds <%s at %#x>t ( t __class__R R t acceptingRCR"RARt TypeErrortreprtjointid(RDtstatus((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt__repr__s  cCs)|dkr|j}n|||jR?tfilenoRRRS(RDtfamilyttype((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt create_sockets cCs)||_|j|_|j|dS(N(R>RWRRRS(RDRER)((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR=s cCsTy9|jjtjtj|jjtjtjdBWntjk rOnXdS(Ni(R>t setsockoptt SOL_SOCKETt SO_REUSEADDRt getsockoptR%(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytset_reuse_addr s  cCstS(N(R@(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR scCstS(N(R@(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR! scCs=t|_tjdkr-|dkr-d}n|jj|S(Ntntii(R@RKtostnameR>tlisten(RDtnum((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRc's  cCs||_|jj|S(N(RCR>tbind(RDRC((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRe-s cCst|_|jj|}|tttfkr4dS|dtfkre||_t |_|j ntj |t |dS(Ni( tFalseRAR>t connect_exRRRRRCR@thandle_connectR%R(RDtaddressR0((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytconnect1s    cCsYy#|jj\}}||fSWn/tjk rT}|jdtkrNqUnXdS(Ni(R>tacceptR%R&R(RDtconnRCtwhy((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRk>scCsRy|jj|}|SWn1tjk rM}|jdtkrFdSdSXdS(Ni(R>tsendR%R&R(RDtdatatresultRm((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRnIscCsxy.|jj|}|s)|jdS|SWnCtjk rs}|jdtttgkrm|jdSnXdS(Nti(R>trecvt handle_closeR%R&RRR(RDt buffer_sizeRoRm((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRrTs  cCs|j|jjdS(N(RUR>tclose(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRufs cCst|j|S(N(tgetattrR>(RDtattr((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt __getattr__lscCstjjdt|dS(Nslog: %s (tsyststderrRtstr(RDtmessage((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytlogsstinfocCs(ts|dkr$d||fGHndS(NR~s%s: %s(t __debug__(RDR|RY((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pytlog_infovscCsb|jr+|jst|_n|jn3|jsT|jt|_|jn |jdS(N(RKRAR@t handle_acceptRht handle_read(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR zs        cCs-|js|jt|_n|jdS(N(RARhR@t handle_write(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRs   cCs|jdS(N(t handle_expt(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCsmt\}}}}yt|}Wndt|}nX|jd||||fd|jdS(Ns)<__repr__(self) failed for object at %0x>s:uncaptured python exception, closing channel %s (%s:%s %s)R%(tcompact_tracebackRMRORRu(RDtniltttvttbinfot self_repr((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR scCs|jdddS(Nsunhandled exceptiontwarning(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCs|jdddS(Nsunhandled read eventR(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCs|jdddS(Nsunhandled write eventR(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCs|jdddS(Nsunhandled connect eventR(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRhscCs|jdddS(Nsunhandled accept eventR(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCs|jdd|jdS(Nsunhandled close eventR(RRu(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRssN(&R R RftdebugRARKtclosingRRCRFRQRSRURZR=R_R R!RcReRjRkRnRrRuRxR}RR RRR RRRRhRRs(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR;sD                      tdispatcher_with_sendcBs;eZdddZdZdZdZdZRS(cCs tj|||d|_dS(NRq(R;RFt out_buffer(RDRER)((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRFscCs3d}tj||jd }|j||_dS(Nii(R;RnR(RDtnum_sent((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt initiate_sendscCs|jdS(N(R(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRscCs|j pt|jS(N(RAtlenR(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR!scCsA|jr#|jdt|n|j||_|jdS(Ns sending %s(RRRMRR(RDRo((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRns N(R R RRFRRR!Rn(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRs    c Cstj\}}}g}|s'txD|rm|j|jjj|jjjt|j f|j }q*W~|d\}}}dj g|D]}d|^q}|||f|||fS(NiRIs [%s|%s|%s]( Rytexc_infotAssertionErrorR"ttb_frametf_codet co_filenametco_nameR{t tb_linenottb_nextRN( RRttbRtfiletfunctiontlinetxR~((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRs     &cCsG|dkrt}nx!|jD]}|jjq"W|jdS(N(RRtvaluesR>Rutclear(R)R((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt close_alls   tposixt file_wrappercBsAeZdZdZdZeZeZdZdZRS(cCs ||_dS(N(R-(RDR-((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRFscGstj|j|S(N(RaRR-(RDR&((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRr scGstj|j|S(N(RaRR-(RDR&((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRn scCstj|jdS(N(RaRuR-(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRuscCs|jS(N(R-(RD((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRWs( R R RFRrRnRRRuRW(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRs    tfile_dispatchercBseZddZdZRS(cCshtj|d|t|_|j|tj|tjd}|tj B}tj|tj |dS(Ni( R;RFRR@RAtset_filetfcntltF_GETFLRat O_NONBLOCKtF_SETFL(RDR-R)R((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRFs    cCs&||_t||_|jdS(N(RRRR>RS(RDR-((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyR$s N(R R RRFR(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyRs (((&t__doc__RR>RyR#RaterrnoRRRRRRRRRRt NameErrort ExceptionR RRRRRR1R5tpoll3RfR:R;RRRRbRRR(((sA/usr/lib/python2.7/site-packages/supervisor/medusa/asyncore_25.pyt/s6     @      +