a 7dgN@s(dZddlZddlZddlZddlZddlZddlZddlZz ddlZWne y^dZYn0ddl m Z ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd lmZd dZddZGddde jZGdddejejZGdddeZGdddeZdS))BaseSelectorEventLoopN) base_events) constants)events)futures) protocols)sslproto) transports)trsock)loggercCs6z||}Wnty"YdS0t|j|@SdSNF)get_keyKeyErrorboolr)selectorfdeventkeyr3/usr/local/lib/python3.9/asyncio/selector_events.py_test_selector_event s  rcCs tdurt|tjrtddS)Nz"Socket cannot be of type SSLSocket)ssl isinstanceZ SSLSocket TypeError)sockrrr_check_ssl_socket+srcseZdZdRfdd ZdSdddddZdTddddejdd d ZdUd d Zfd dZ ddZ ddZ ddZ ddZ ddZdddejfddZdddejfddZddejfddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3ZdVd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dWdDdEZ$dFdGZ%dHdIZ&dJdKZ'dLdMZ(dNdOZ)dPdQZ*Z+S)XrNcsFt|durt}td|jj||_| t |_ dS)NzUsing selector: %s) super__init__ selectorsDefaultSelectorr debug __class____name__ _selector_make_self_pipeweakrefWeakValueDictionary _transports)selfrr"rrr6s zBaseSelectorEventLoop.__init__extraservercCst||||||SN)_SelectorSocketTransport)r)rprotocolwaiterr,r-rrr_make_socket_transport@s z,BaseSelectorEventLoop._make_socket_transportF) server_sideserver_hostnamer,r-ssl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)r5r+)r Z SSLProtocolr/Z_app_transport) r)Zrawsockr0 sslcontextr1r3r4r,r-r5Z ssl_protocolrrr_make_ssl_transportEsz)BaseSelectorEventLoop._make_ssl_transportcCst||||||Sr.)_SelectorDatagramTransport)r)rr0addressr1r,rrr_make_datagram_transportRsz.BaseSelectorEventLoop._make_datagram_transportcsL|rtd|rdS|t|jdurH|jd|_dS)Nz!Cannot close a running event loop)Z is_running RuntimeError is_closed_close_self_pipercloser$r)r*rrr>Ws   zBaseSelectorEventLoop.closecCsB||j|jd|_|jd|_|jd8_dS)Nr)_remove_reader_ssockfilenor>_csock _internal_fdsr?rrrr=bs   z&BaseSelectorEventLoop._close_self_pipecCsNt\|_|_|jd|jd|jd7_||j|jdS)NFr) socket socketpairrArC setblockingrD _add_readerrB_read_from_selfr?rrrr%js   z%BaseSelectorEventLoop._make_self_pipecCsdSr.rr)datarrr_process_self_datarsz(BaseSelectorEventLoop._process_self_datacCsTz"|jd}|sWqP||Wqty8YqYqtyLYqPYq0qdS)Ni)rArecvrLInterruptedErrorBlockingIOErrorrJrrrrIus   z%BaseSelectorEventLoop._read_from_selfcCsL|j}|durdSz|dWn&tyF|jrBtjdddYn0dS)Nz3Fail to write a null byte into the self-pipe socketTexc_info)rCsendOSError_debugr r!)r)Zcsockrrr_write_to_selfs z$BaseSelectorEventLoop._write_to_selfdc Cs"|||j||||||dSr.)rHrB_accept_connection)r)protocol_factoryrr6r-backlogr5rrr_start_servings z$BaseSelectorEventLoop._start_servingc Cst|D]}z0|\}} |jr0td|| ||dWntttfyXYdSt y} zl| j t j t j t j t jfvr|d| t|d|||tj|j||||||nWYd} ~ qd} ~ 00d| i} |||| |||} || qdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message exceptionrEpeername)rangeacceptrUr r!rGrOrNConnectionAbortedErrorrTerrnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr TransportSocketr@rBZ call_laterrZACCEPT_RETRY_DELAYr[_accept_connection2Z create_task) r)rYrr6r-rZr5_connaddrexcr,r`rrrrXs@    z(BaseSelectorEventLoop._accept_connectionc sd}d}zr|}|} |r8|j|||| d|||d}n|j||| ||d}z| IdHWntyv|Yn0WntttfyYn^ty} zF|jrd| d} |dur|| d<|dur|| d<|| WYd} ~ n d} ~ 00dS)NT)r1r3r,r-r5)r1r,r-z3Error on transport creation for incoming connection)r\r]r0 transport) create_futurer7r2 BaseExceptionr> SystemExitKeyboardInterruptrUrc) r)rYrgr,r6r-r5r0rjr1ricontextrrrres@  z)BaseSelectorEventLoop._accept_connection2c Cs|}t|tsHzt|}Wn(tttfyFtd|dYn0z|j|}WntyhYn0|st d|d|dS)NzInvalid file object: zFile descriptor z is used by transport ) rintrBAttributeErrorr ValueErrorr(r is_closingr;)r)rrBrjrrr_ensure_fd_no_transports   z-BaseSelectorEventLoop._ensure_fd_no_transportc Gs|t|||d}z|j|}Wn(tyP|j|tj|dfYn>0|j|j }\}}|j ||tjB||f|dur| |Sr.) _check_closedrHandler$rrregisterr EVENT_READrKmodifycancel r)rcallbackargshandlermaskreaderwriterrrrrHs   z!BaseSelectorEventLoop._add_readercCs|r dSz|j|}Wnty0YdS0|j|j}\}}|tjM}|sb|j|n|j ||d|f|dur| dSdSdSNFT) r<r$rrrrKrrx unregisterryrzr)rrrrrrrrr@s  z$BaseSelectorEventLoop._remove_readerc Gs|t|||d}z|j|}Wn(tyP|j|tjd|fYn>0|j|j }\}}|j ||tjB||f|dur| |Sr.) rurrvr$rrrwr EVENT_WRITErKryrzr{rrr _add_writer&s   z!BaseSelectorEventLoop._add_writercCs|r dSz|j|}Wnty0YdS0|j|j}\}}|tjM}|sb|j|n|j |||df|dur| dSdSdSr) r<r$rrrrKrrrryrzrrrr_remove_writer6s  z$BaseSelectorEventLoop._remove_writercGs"|||j||g|RdSr.)rtrHr)rr|r}rrr add_readerMs z BaseSelectorEventLoop.add_readercCs||||Sr.)rtr@r)rrrr remove_readerRs z#BaseSelectorEventLoop.remove_readercGs"|||j||g|RdSr.)rtrrrrr add_writerWs z BaseSelectorEventLoop.add_writercCs||||Sr.)rtrrrrr remove_writer\s z#BaseSelectorEventLoop.remove_writerc st||jr"|dkr"tdz ||WSttfyDYn0|}|}| || ||j |||}| t j|j||d|IdHSNrthe socket must be non-blockingr~)rrU gettimeoutrrrMrOrNrkrBrtrH _sock_recvadd_done_callback functoolspartial_sock_read_done)r)rnfutrr~rrr sock_recvas  zBaseSelectorEventLoop.sock_recvcCs|dus|s||dSr.) cancelledrr)rrr~rrrrwsz%BaseSelectorEventLoop._sock_read_donec Cs|r dSz||}WnZttfy2YdSttfyHYn8tyt}z||WYd}~nd}~00||dSr.) donerMrOrNrmrnrl set_exception set_result)r)rrrrKrirrrr{s z BaseSelectorEventLoop._sock_recvc st||jr"|dkr"tdz ||WSttfyDYn0|}|}| || ||j |||}| t j|j||d|IdHSr)rrUrrr recv_intorOrNrkrBrtrH_sock_recv_intorrrr)r)rbufrrr~rrrsock_recv_intos  z$BaseSelectorEventLoop.sock_recv_intoc Cs|r dSz||}WnZttfy2YdSttfyHYn8tyt}z||WYd}~nd}~00||dSr.) rrrOrNrmrnrlrr)r)rrrnbytesrirrrrs z%BaseSelectorEventLoop._sock_recv_intoc st||jr"|dkr"tdz||}WnttfyJd}Yn0|t|kr\dS|}| }| || ||j ||t ||g}|tj|j||d|IdHSr)rrUrrrrSrOrNlenrkrBrtr _sock_sendall memoryviewrrr_sock_write_done)r)rrKrrrr~rrr sock_sendalls&     z"BaseSelectorEventLoop.sock_sendallc Cs|r dS|d}z|||d}Wn\ttfyBYdSttfyXYn0ty}z||WYd}~dSd}~00||7}|t|kr| dn||d<dS)Nr) rrSrOrNrmrnrlrrr)r)rrviewposstartrrirrrrs    z#BaseSelectorEventLoop._sock_sendallcst||jr"|dkr"tdttdr8|jtjkrf|j||j|j |dIdH}|d\}}}}}| }| ||||IdHS)NrrAF_UNIX)familyprotoloop) rrUrrrhasattrrErrZ_ensure_resolvedrrk _sock_connect)r)rr9Zresolvedrfrrrr sock_connects z"BaseSelectorEventLoop.sock_connectc Cs|}z||Wnttfyb|||||j|||}|tj |j ||dYnNt t fyxYn8t y}z||WYd}~nd}~00|ddS)Nr)rBconnectrOrNrtr_sock_connect_cbrrrrrmrnrlrr)r)rrr9rr~rirrrrs    z#BaseSelectorEventLoop._sock_connectcCs|dus|s||dSr.)rrrrrrr sz&BaseSelectorEventLoop._sock_write_donec Cs|r dSz,|tjtj}|dkr6t|d|WnXttfyNYnNtt fydYn8t y}z| |WYd}~nd}~00| ddS)NrzConnect call failed ) r getsockoptrE SOL_SOCKETSO_ERRORrTrOrNrmrnrlrr)r)rrr9errrirrrrs z&BaseSelectorEventLoop._sock_connect_cbcs@t||jr"|dkr"td|}||||IdHS)Nrr)rrUrrrrk _sock_accept)r)rrrrr sock_accept$s  z!BaseSelectorEventLoop.sock_acceptc Cs|}z|\}}|dWnttfyl|||||j||}|t j |j ||dYnRt t fyYn<ty}z||WYd}~nd}~00|||fdS)NFr)rBr`rGrOrNrtrHrrrrrrmrnrlrr)r)rrrrgr9r~rirrrr3s   z"BaseSelectorEventLoop._sock_acceptc s|j|j=|}||IdHzL|j|j|||ddIdHW||rZ|||j|j<S||j|j<n"||r|||j|j<0dS)NF)fallback) r(_sock_fd is_reading pause_reading_make_empty_waiterZ sock_sendfile_sock_reset_empty_waiterresume_reading)r)Ztranspfileoffsetcountrrrr_sendfile_nativeDs*   z&BaseSelectorEventLoop._sendfile_nativecCs|D]v\}}|j|j}\}}|tj@rL|durL|jrB||n |||tj@r|dur|jrp||q||qdSr.) fileobjrKrrxZ _cancelledr@Z _add_callbackrr)r)Z event_listrrrrrrrr_process_eventsRs    z%BaseSelectorEventLoop._process_eventscCs|||dSr.)r@rBr>)r)rrrr _stop_serving`sz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N),r# __module__ __qualname__rr2rZSSL_HANDSHAKE_TIMEOUTr7r:r>r=r%rLrIrVr[rXrertrHr@rrrrrrrrrrrrrrrrrrrrrr __classcell__rrr*rr0sh        . )  rcseZdZdZeZdZdfdd ZddZddZ d d Z d d Z d dZ ddZ ejfddZdddZddZddZddZddZZS) _SelectorTransportiNcst||t||jd<z||jd<WntyLd|jd<Yn0d|jvrz||jd<Wntj yd|jd<Yn0||_ | |_ d|_ ||||_||_d|_d|_|jdur|j||j|j <dS)NrEZsocknamer^Fr)rrr rd_extra getsocknamerT getpeernamerEerrorrrBr_protocol_connected set_protocol_server_buffer_factory_buffer _conn_lost_closingZ_attachr()r)rrr0r,r-r*rrrqs,       z_SelectorTransport.__init__cCs|jjg}|jdur |dn|jr0|d|d|j|jdur|jst|jj |jt j }|rz|dn |dt|jj |jt j }|rd}nd}| }|d|d |d d d |S) Nclosedclosingzfd=z read=pollingz read=idlepollingZidlezwrite=z<{}> )r"r#rappendrr_loopr<rr$rrxrget_write_buffer_sizeformatjoin)r)inforstatebufsizerrr__repr__s.      z_SelectorTransport.__repr__cCs|ddSr.) _force_closer?rrrabortsz_SelectorTransport.abortcCs||_d|_dSNT) _protocolrr)r0rrrrsz_SelectorTransport.set_protocolcCs|jSr.)rr?rrr get_protocolsz_SelectorTransport.get_protocolcCs|jSr.)rr?rrrrssz_SelectorTransport.is_closingcCsT|jr dSd|_|j|j|jsP|jd7_|j|j|j|jddSNTr) rrr@rrrr call_soon_call_connection_lostr?rrrr>sz_SelectorTransport.closecCs,|jdur(|d|t|d|jdS)Nzunclosed transport )source)rResourceWarningr>)r)_warnrrr__del__s z_SelectorTransport.__del__Fatal error on transportcCsNt|tr(|jr@tjd||ddn|j||||jd||dS)Nz%r: %sTrQ)r\r]rjr0) rrTr get_debugr r!rcrr)r)rir\rrr _fatal_errors  z_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j|j|j|jsBd|_|j|j|jd7_|j|j |dSr) rrclearrrrrr@rrr)rirrrrs z_SelectorTransport._force_closecCszN|jr|j|W|jd|_d|_d|_|j}|dur|d|_n:|jd|_d|_d|_|j}|dur|d|_0dSr.)rrZconnection_lostrr>rrZ_detach)r)rir-rrrrs&  z(_SelectorTransport._call_connection_lostcCs t|jSr.)rrr?rrrrsz(_SelectorTransport.get_write_buffer_sizecGs$|jr dS|jj||g|RdSr.)rrrHrrrrrHsz_SelectorTransport._add_reader)NN)r)r#rrmax_size bytearrayrrrrrrrrsr>warningswarnrrrrrrHrrrr*rres    rcseZdZdZejjZd#fdd ZfddZ ddZ d d Z d d Z d dZ ddZddZddZddZddZddZddZfddZdd Zd!d"ZZS)$r/TNcs~d|_t|||||d|_d|_d|_t|j|j |j j ||j |j |j|j|durz|j tj|ddSr )_read_ready_cbrr_eof_paused _empty_waiterrZ _set_nodelayrrrrconnection_maderHr _read_readyr_set_result_unless_cancelled)r)rrr0r1r,r-r*rrrs   z!_SelectorSocketTransport.__init__cs.t|tjr|j|_n|j|_t|dSr.)rrZBufferedProtocol_read_ready__get_bufferr_read_ready__data_receivedrrrr*rrrs  z%_SelectorSocketTransport.set_protocolcCs|j o|j Sr.)rrr?rrrrsz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j|j|jr:td|dS)NTz%r pauses reading)rrrr@rrr r!r?rrrrs   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_||j|j|jr)r)Z keep_openrirrrrms  z,_SelectorSocketTransport._read_ready__on_eofc Cs0t|tttfs$tdt|j|jr2td|j durDtd|sLdS|j rz|j t j krht d|j d7_ dS|jsz|j|}Wn\ttfyYn^ttfyYnHty}z||dWYd}~dSd}~00||d}|sdS|j|j|j|j||dS)N/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progresssocket.send() raised exception.r%Fatal write error on socket transport)rbytesrrrtyper#rr;rrr!LOG_THRESHOLD_FOR_CONNLOST_WRITESr warningrrrSrOrNrmrnrlrrrr _write_readyextend_maybe_pause_protocol)r)rKrrirrrwrites>      z_SelectorSocketTransport.writec Cs|jr dSz|j|j}Wnttfy2YnttfyHYnty}zF|j |j |j | |d|jdur|j|WYd}~nvd}~00|r|jd|=||js|j |j |jdur|jd|jr|dn|jr|jtjdS)Nr )rrrSrrOrNrmrnrlrrrrrrr_maybe_resume_protocolrrrrshutdownrESHUT_WR)r)rrirrrrs2   "    z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|jtjdSr)rrrrrrErr?rrr write_eofs  z"_SelectorSocketTransport.write_eofcCsdSrrr?rrr can_write_eofsz&_SelectorSocketTransport.can_write_eofcs*t||jdur&|jtddS)NzConnection is closed by peer)rrrrConnectionErrorrr*rrrs   z._SelectorSocketTransport._call_connection_lostcCs6|jdurtd|j|_|js0|jd|jS)NzEmpty waiter is already set)rr;rrkrrr?rrrrs    z+_SelectorSocketTransport._make_empty_waitercCs d|_dSr.)rr?rrrrsz,_SelectorSocketTransport._reset_empty_waiter)NNN)r#rrZ_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrrrrrrrrrrrrrrrrrrr*rr/s( %' r/csFeZdZejZd fdd ZddZddZd dd Z d d Z Z S)r8Ncs^t||||||_|j|jj||j|j|j|j |durZ|jt j |ddSr.) rr_addressrrrrrHrrrr)r)rrr0r9r1r,r*rrrs  z#_SelectorDatagramTransport.__init__cCstdd|jDS)Ncss|]\}}t|VqdSr.)r).0rKrfrrr zC_SelectorDatagramTransport.get_write_buffer_size..)sumrr?rrrrsz0_SelectorDatagramTransport.get_write_buffer_sizec Cs|jr dSz|j|j\}}Wnttfy6Yntyd}z|j|WYd}~n\d}~0t t fyzYn>t y}z| |dWYd}~nd}~00|j ||dS)Nz&Fatal read error on datagram transport)rrrecvfromrrOrNrTrerror_receivedrmrnrlrZdatagram_receivedr)rKrhrirrrrs "z&_SelectorDatagramTransport._read_readyc Cst|tttfs$tdt|j|s,dS|jrV|d|jfvrPtd|j|j}|j r|jr|j t j krxt d|j d7_ dS|jsdz,|jdr|j|n|j||WdSttfy|j|j|jYn~ty}z|j|WYd}~dSd}~0ttfy0Yn4tyb}z||dWYd}~dSd}~00|j t||f|!dS)Nr z!Invalid address: must be None or r rr^'Fatal write error on datagram transport)"rr rrrr r#rrrrrrr rrrrrSsendtorOrNrrr _sendto_readyrTrr rmrnrlrrrr!rrrr#sJ      z!_SelectorDatagramTransport.sendtoc Cs|jr|j\}}z*|jdr.|j|n|j||Wqttfyh|j||fYqYqt y}z|j |WYd}~dSd}~0t t fyYqty}z||dWYd}~dSd}~00q||js|j|j|jr|ddS)Nr^r")rpopleftrrrSr#rOrN appendleftrTrr rmrnrlrrrrrrrr!rrrr$2s0  z(_SelectorDatagramTransport._sendto_ready)NNN)N) r#rr collectionsdequerrrrr#r$rrrr*rr8s  +r8)__all__r'rbrrrErr&r ImportErrorrrrrrr r r logr rrZ BaseEventLooprZ_FlowControlMixinZ Transportrr/r8rrrrsD             9o