a  zeN@s,dZdZddlZddlZddlZddlZddlZddlZddlZz ddl Z Wne ybdZ Yn0ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd lmZddZddZGddde 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)selectorfdeventkeyrK/opt/bitninja-python-dojo/embedded/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+srcseZdZdZdSfdd 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)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| dSdSdS)NFT) 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| dSdSdS)Remove a writer callback.FNT) r<r$rrrrKrrrryrzrrrr_remove_writer6s  z$BaseSelectorEventLoop._remove_writercGs"|||j||g|RdS)zAdd a reader callback.N)rtrHr)rr|r}rrr add_readerMs z BaseSelectorEventLoop.add_readercCs||||S)zRemove a reader callback.)rtr@r)rrrr remove_readerRs z#BaseSelectorEventLoop.remove_readercGs"|||j||g|RdS)zAdd a writer callback..N)rtrrrrr add_writerWs z BaseSelectorEventLoop.add_writercCs||||S)r)rtrrrrr remove_writer\s z#BaseSelectorEventLoop.remove_writerc st||jr"|dkr"tdz ||WSttfyDYn0|}|}| || ||j |||}| t j|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-blockingr~N)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|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)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|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)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)zTConnect to a remote socket at address. This method is a coroutine. rrAF_UNIX)familyprotoloopN) 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)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)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____doc__rr2rZSSL_HANDSHAKE_TIMEOUTr7r:r>r=r%rLrIrVr[rXrertrHr@rrrrrrrrrrrrrrrrrrrrrr __classcell__rrr*rr0sj        . )  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&|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 )rrrrSrOrNrmrnrlrrrrrrr_maybe_resume_protocolrrrrshutdownrESHUT_WR)r)rrirrrrs4   "    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)r__all__r'rbrrrErr&r ImportErrorrrrrrr r r logr rrZ BaseEventLooprZ_FlowControlMixinZ Transportrr/r8rrrrsF             9o