a dL@s$dZdZddlZddlZddlZddlZddlZddlZddlZz ddl Z Wne ybdZ Yn0ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd lmZddZGddde jZGdddejejZGdddeZGdddeZdS)zEvent loop using a selector and related classes. A selector is a "notify-when-ready" multiplexer. For a subclass which also includes support for signal handling, see the unix_events sub-module. )BaseSelectorEventLoopN) base_events) constants)events)futures) protocols)sslproto) transports)trsock)loggercCs6z||}Wnty"YdS0t|j|@SdSNF)get_keyKeyErrorboolr)selectorfdeventkeyr//usr/lib64/python3.9/asyncio/selector_events.py_test_selector_event s  rcseZdZdZdSfdd ZdTdddddZdUddddejd d d ZdVd d Z fddZ ddZ ddZ ddZ ddZddZdddejfddZdddejfddZddejfdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4ZdWd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dXdEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+Z,S)YrzJSelector event loop. See events.EventLoop for API specification. NcsFt|durt}td|jj||_| t |_ dS)NzUsing selector: %s) super__init__ selectorsDefaultSelectorr debug __class____name__ _selector_make_self_pipeweakrefWeakValueDictionary _transports)selfrrrrr1s zBaseSelectorEventLoop.__init__extraservercCst||||||SN)_SelectorSocketTransport)r$sockprotocolwaiterr'r(rrr_make_socket_transport;s z,BaseSelectorEventLoop._make_socket_transportF) server_sideserver_hostnamer'r(ssl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)r1r&)r SSLProtocolr*_app_transport) r$rawsockr, sslcontextr-r/r0r'r(r1 ssl_protocolrrr_make_ssl_transport@sz)BaseSelectorEventLoop._make_ssl_transportcCst||||||Sr))_SelectorDatagramTransport)r$r+r,addressr-r'rrr_make_datagram_transportMsz.BaseSelectorEventLoop._make_datagram_transportcsL|rtd|rdS|t|jdurH|jd|_dS)Nz!Cannot close a running event loop) is_running RuntimeError is_closed_close_self_pipercloserr$r%rrr?Rs   zBaseSelectorEventLoop.closecCsB||j|jd|_|jd|_|jd8_dS)Nr)_remove_reader_ssockfilenor?_csock _internal_fdsr@rrrr>]s   z&BaseSelectorEventLoop._close_self_pipecCsNt\|_|_|jd|jd|jd7_||j|jdS)NFr) socket socketpairrBrD setblockingrE _add_readerrC_read_from_selfr@rrrr es   z%BaseSelectorEventLoop._make_self_pipecCsdSr)rr$datarrr_process_self_datamsz(BaseSelectorEventLoop._process_self_datacCsTz"|jd}|sWqP||Wqty8YqYqtyLYqPYq0qdS)Ni)rBrecvrMInterruptedErrorBlockingIOErrorrKrrrrJps   z%BaseSelectorEventLoop._read_from_selfcCsL|j}|durdSz|dWn&tyF|jrBtjdddYn0dS)Nz3Fail to write a null byte into the self-pipe socketTexc_info)rDsendOSError_debugr r)r$csockrrr_write_to_self|s z$BaseSelectorEventLoop._write_to_selfdc Cs"|||j||||||dSr))rIrC_accept_connection)r$protocol_factoryr+r5r(backlogr1rrr_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 exceptionrFpeername)rangeacceptrVr rrHrPrOConnectionAbortedErrorrUerrnoEMFILEENFILEENOBUFSENOMEMcall_exception_handlerr TransportSocketrArC call_laterrACCEPT_RETRY_DELAYr]_accept_connection2 create_task) r$r[r+r5r(r\r1_connaddrexcr'rbrrrrZs@    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)r-r/r'r(r1)r-r'r(z3Error on transport creation for incoming connection)r^r_r, transport) create_futurer7r. BaseExceptionr? SystemExitKeyboardInterruptrVri) r$r[rpr'r5r(r1r,rsr-rrcontextrrrrms@  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 ) isinstanceintrCAttributeError TypeError ValueErrorr#r is_closingr<)r$rrCrsrrr_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_closedrHandlerrrregisterr EVENT_READrLmodifycancel r$rcallbackargshandlermaskreaderwriterrrrrIs   z!BaseSelectorEventLoop._add_readercCs|r dSz|j|}Wnty0YdS0|j|j}\}}|tjM}|sb|j|n|j ||d|f|dur| dSdSdS)NFT) r=rrrrrLrr unregisterrrr$rrrrrrrrrA s  z$BaseSelectorEventLoop._remove_readerc Gs|t|||d}z|j|}Wn(tyP|j|tjd|fYn>0|j|j }\}}|j ||tjB||f|dur| |Sr)) rrrrrrrr EVENT_WRITErLrrrrrr _add_writer!s   z!BaseSelectorEventLoop._add_writercCs|r dSz|j|}Wnty0YdS0|j|j}\}}|tjM}|sb|j|n|j |||df|dur| dSdSdS)Remove a writer callback.FNT) r=rrrrrLrrrrrrrrr_remove_writer1s  z$BaseSelectorEventLoop._remove_writercGs"|||j||g|RdS)zAdd a reader callback.N)rrIr$rrrrrr add_readerHs z BaseSelectorEventLoop.add_readercCs||||S)zRemove a reader callback.)rrAr$rrrr remove_readerMs z#BaseSelectorEventLoop.remove_readercGs"|||j||g|RdS)zAdd a writer callback..N)rrrrrr add_writerRs z BaseSelectorEventLoop.add_writercCs||||S)r)rrrrrr remove_writerWs z#BaseSelectorEventLoop.remove_writerc st||jr$|dkr$tdz ||WSttfyFYn0|}| }| || ||j |||}| tj|j||d|IdHS)zReceive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by nbytes. rthe socket must be non-blockingrN)r_check_ssl_socketrV gettimeoutr}rNrPrOrtrCrrI _sock_recvadd_done_callback functoolspartial_sock_read_done)r$r+nfutrrrrr sock_recv\s   zBaseSelectorEventLoop.sock_recvcCs|dus|s||dSr)) cancelledrr$rrrrrrrrsz%BaseSelectorEventLoop._sock_read_donec Cs|r dSz||}WnZttfy2YdSttfyHYn8tyt}z||WYd}~nd}~00||dSr)) donerNrPrOrvrwru set_exception set_result)r$rr+rrLrrrrrrvs z BaseSelectorEventLoop._sock_recvc st||jr$|dkr$tdz ||WSttfyFYn0|}| }| || ||j |||}| tj|j||d|IdHS)zReceive data from the socket. The received data is written into *buf* (a writable buffer). The return value is the number of bytes written. rrrN)rrrVrr} recv_intorPrOrtrCrrI_sock_recv_intorrrr)r$r+bufrrrrrrsock_recv_intos   z$BaseSelectorEventLoop.sock_recv_intoc Cs|r dSz||}WnZttfy2YdSttfyHYn8tyt}z||WYd}~nd}~00||dSr)) rrrPrOrvrwrurr)r$rr+rnbytesrrrrrrs z%BaseSelectorEventLoop._sock_recv_intoc st||jr$|dkr$tdz||}WnttfyLd}Yn0|t|kr^dS| }| }| || ||j ||t||g}|tj|j||d|IdHS)aSend data to the socket. The socket must be connected to a remote socket. This method continues to send data from data until either all data has been sent or an error occurs. None is returned on success. On error, an exception is raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. rrNr)rrrVrr}rTrPrOlenrtrCrr _sock_sendall memoryviewrrr_sock_write_done)r$r+rLrrrrrrr 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) rrTrPrOrvrwrurrr)r$rr+viewposstartrrrrrrrs    z#BaseSelectorEventLoop._sock_sendallcst||jr$|dkr$td|jtjksBtjrt|jtj krt|j ||j|j |j |dIdH}|d\}}}}}| }|||||IdHS)zTConnect to a remote socket at address. This method is a coroutine. rr)familytypeprotoloopN)rrrVrr}rrFAF_INET _HAS_IPv6AF_INET6_ensure_resolvedrrrt _sock_connect)r$r+r9resolvedrorrrr sock_connects     z"BaseSelectorEventLoop.sock_connectc Cs|}z||Wnttfyb|||||j|||}|tj |j ||dYnNt t fyxYn8t y}z||WYd}~nd}~00|ddS)Nr)rCconnectrPrOrr_sock_connect_cbrrrrrvrwrurr)r$rr+r9rrrrrrrrs    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 getsockoptrF SOL_SOCKETSO_ERRORrUrPrOrvrwrurr)r$rr+r9errrrrrrrs z&BaseSelectorEventLoop._sock_connect_cbcsBt||jr$|dkr$td|}||||IdHS)aWAccept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection. rrN)rrrVrr}rt _sock_accept)r$r+rrrr sock_accept"s   z!BaseSelectorEventLoop.sock_acceptc Cs|}z|\}}|dWnttfyl|||||j||}|t j |j ||dYnRt t fyYn<ty}z||WYd}~nd}~00|||fdS)NFr)rCrbrHrPrOrrIrrrrrrvrwrurr)r$rr+rrpr9rrrrrrr1s   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_waiter sock_sendfile_sock_reset_empty_waiterresume_reading)r$transpfileoffsetcountrrrr_sendfile_nativeBs*   z&BaseSelectorEventLoop._sendfile_nativecCs|D]v\}}|j|j}\}}|tj@rL|durL|jrB||n |||tj@r|dur|jrp||q||qdSr)) fileobjrLrr _cancelledrA _add_callbackrr)r$ event_listrrrrrrrr_process_eventsPs    z%BaseSelectorEventLoop._process_eventscCs|||dSr))rArCr?)r$r+rrr _stop_serving^sz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N)-r __module__ __qualname____doc__rr.rSSL_HANDSHAKE_TIMEOUTr7r:r?r>r rMrJrXr]rZrmrrIrArrrrrrrrrrrrrrrrrrrrrr __classcell__rrr%rr+sj        . )  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)NrFsocknamer`Fr)rrr rj_extra getsocknamerU getpeernamerFerrorrrCr_protocol_connected set_protocol_server_buffer_factory_buffer _conn_lost_closing_attachr#)r$rr+r,r'r(r%rrros,       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=idlepollingidlezwrite=z<{}> )rrrappendrr_loopr=rrrrrget_write_buffer_sizeformatjoin)r$inforstatebufsizerrr__repr__s.      z_SelectorTransport.__repr__cCs|ddSr)) _force_closer@rrrabortsz_SelectorTransport.abortcCs||_d|_dSNT) _protocolrr$r,rrrrsz_SelectorTransport.set_protocolcCs|jSr))rr@rrr get_protocolsz_SelectorTransport.get_protocolcCs|jSr))rr@rrrr~sz_SelectorTransport.is_closingcCsT|jr dSd|_|j|j|jsP|jd7_|j|j|j|jddSNTr) rrrArrrr 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: %sTrR)r^r_rsr,) ryrUr get_debugr rrirr)r$rrr^rrr _fatal_errors  z_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j|j|j|jsBd|_|j|j|jd7_|j|j |dSr) rrclearrrrrrArrr$rrrrrrs z_SelectorTransport._force_closecCszN|jr|j|W|jd|_d|_d|_|j}|dur|d|_n:|jd|_d|_d|_|j}|dur|d|_0dSr))rrconnection_lostrr?rr_detach)r$rrr(rrrrs&  z(_SelectorTransport._call_connection_lostcCs t|jSr))rrr@rrrrsz(_SelectorTransport.get_write_buffer_sizecGs$|jr dS|jj||g|RdSr))rrrIrrrrrIsz_SelectorTransport._add_reader)NN)r )rrrmax_size bytearrayrrrrrrrr~r?warningswarnr rrrrrIrrrr%rrcs    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_waiterr _set_nodelayrrrrconnection_maderIr _read_readyr_set_result_unless_cancelled)r$rr+r,r-r'r(r%rrrs   z!_SelectorSocketTransport.__init__cs.t|tjr|j|_n|j|_t|dSr))ryrBufferedProtocol_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)rrrrArrr rr@rrrrs   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_||j|j|jr      z_SelectorSocketTransport.writec Cs&|jsJd|jrdSz|j|j}Wnttfy@YnttfyVYnty}zF|j |j |j | |d|jdur|j|WYd}~nxd}~00|r|jd|=||js"|j |j |jdur|jd|jr |dn|jr"|jtjdS)NzData should not be emptyr-)rrrrTrPrOrvrwrurrrrrrr_maybe_resume_protocolrrrrshutdownrFSHUT_WR)r$rrrrrrr1s4   "    z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|jtjdSr)rrrrr6rFr7r@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<rrtrrr@rrrrs    z+_SelectorSocketTransport._make_empty_waitercCs d|_dSr))rr@rrrrsz,_SelectorSocketTransport._reset_empty_waiter)NNN)rrr_start_tls_compatibler _SendfileMode TRY_NATIVE_sendfile_compatiblerrrrrrr!r"r&r4r1r8r9rrrrrrr%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_addressrrrrrIrrrr)r$rr+r,r9r-r'r%rrrs  z#_SelectorDatagramTransport.__init__cCstdd|jDS)Ncss|]\}}t|VqdSr))r).0rLrorrr 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)rrrecvfromrrPrOrUrerror_receivedrvrwrurdatagram_receivedr$rLrqrrrrrrs "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)"ryr.rrr|rrr?r}rrr/r r0rrrrTsendtorPrOrrr _sendto_readyrUrrErvrwrurrr3rGrrrrIsJ      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`rH)rpopleftrrrTrIrPrO appendleftrUrrErvrwrurr5rrrrrrGrrrrJ0s0  z(_SelectorDatagramTransport._sendto_ready)NNN)N) rrr collectionsdequerrrrrIrJrrrr%rr8s  +r8)r__all__rMrdrrrFrr!ssl ImportErrorrrrrrr r r logr r BaseEventLoopr_FlowControlMixin Transportrr*r8rrrrsD             <o