B ?oy"@s"dZdZddlZddlZddlZddlZddlZddlZddlZy ddl Z Wne k rddZ YnXddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd lmZd dZddZGddde 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)loggercCs6y||}Wntk r"dSXt|j|@SdS)NF)get_keyKeyErrorboolr)selectorfdZeventkeyr:/opt/alt/python37/lib/python3.7/asyncio/selector_events.py_test_selector_events rcCs tdk rt|tjrtddS)Nz"Socket cannot be of type SSLSocket)ssl isinstanceZ SSLSocket TypeError)sockrrr_check_ssl_socket*srcseZdZdZdQfdd ZdRdddddZdSddddejd d d ZdTd d Z fddZ ddZ ddZ ddZ ddZddZdddejfddZdddejfddZddejfdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*Z+S)UrzJSelector event loop. See events.EventLoop for API specification. NcsFt|dkrt}td|jj||_| t |_ dS)NzUsing selector: %s) super__init__ selectorsZDefaultSelectorr debug __class____name__ _selector_make_self_pipeweakrefZWeakValueDictionary _transports)selfr)rrrr5s zBaseSelectorEventLoop.__init__)extraservercCst||||||S)N)_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)r-)r%r&)r Z SSLProtocolr'Z_app_transport) r$Zrawsockr( sslcontextr)r+r,r%r&r-Z ssl_protocolrrr_make_ssl_transportDs z)BaseSelectorEventLoop._make_ssl_transportcCst||||||S)N)_SelectorDatagramTransport)r$rr(addressr)r%rrr_make_datagram_transportQsz.BaseSelectorEventLoop._make_datagram_transportcsL|rtd|rdS|t|jdk rH|jd|_dS)Nz!Cannot close a running event loop)Z is_running RuntimeError is_closed_close_self_pipercloser )r$)rrrr6Vs   zBaseSelectorEventLoop.closecCsB||j|jd|_|jd|_|jd8_dS)Nr)_remove_reader_ssockfilenor6_csock _internal_fds)r$rrrr5as   z&BaseSelectorEventLoop._close_self_pipecCsNt\|_|_|jd|jd|jd7_||j|jdS)NFr) socketZ socketpairr8r: setblockingr; _add_readerr9_read_from_self)r$rrrr!is   z%BaseSelectorEventLoop._make_self_pipecCsdS)Nr)r$datarrr_process_self_dataqsz(BaseSelectorEventLoop._process_self_datacCsVxPy |jd}|sP||Wqtk r8wYqtk rLPYqXqWdS)Ni)r8recvrAInterruptedErrorBlockingIOError)r$r@rrrr?ts z%BaseSelectorEventLoop._read_from_selfcCsJ|j}|dk rFy|dWn(tk rD|jr@tjdddYnXdS)Nz3Fail to write a null byte into the self-pipe socketT)exc_info)r:sendOSError_debugr r)r$Zcsockrrr_write_to_selfsz$BaseSelectorEventLoop._write_to_selfdc Cs"|||j||||||dS)N)r>r9_accept_connection)r$protocol_factoryrr.r&backlogr-rrr_start_servings z$BaseSelectorEventLoop._start_servingc Csxt|D]}y0|\}} |jr4td|| ||dWntttfk rZdSt k r} z^| j t j t j t j t jfkr|d| |d|||tj|j||||||nWdd} ~ XYq Xd| i} |||| |||} || q WdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message exceptionr<peername)rangeacceptrIr rr=rDrCConnectionAbortedErrorrHerrnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr7r9Z call_laterrZACCEPT_RETRY_DELAYrO_accept_connection2Z create_task) r$rMrr.r&rNr-_connaddrexcr%rTrrrrLs6      z(BaseSelectorEventLoop._accept_connectionc sd}d}yl|}|} |r8|j|||| d|||d}n|j||| ||d}y| IdHWn|YnXWn\tk r} z>|jrd| d} |dk r|| d<|dk r|| d<|| Wdd} ~ XYnXdS)NT)r)r+r%r&r-)r)r%r&z3Error on transport creation for incoming connection)rPrQr( transport) create_futurer/r*r6 ExceptionrIrW) r$rMrZr%r.r&r-r(r]r)r\contextrrrrXs6  z)BaseSelectorEventLoop._accept_connection2c Cs|}t|tsJyt|}Wn*tttfk rHtd|dYnXy|j|}Wntk rlYnX|st d|d|dS)NzInvalid file object: zFile descriptor z is used by transport ) rintr9AttributeErrorr ValueErrorr#r is_closingr3)r$rr9r]rrr_ensure_fd_no_transports z-BaseSelectorEventLoop._ensure_fd_no_transportc Gs|t|||d}y|j|}Wn*tk rR|j|tj|dfYn>X|j|j }\}}|j ||tjB||f|dk r| dS)N) _check_closedrHandler r r registerr EVENT_READr@modifycancel) r$rcallbackargshandlermaskreaderwriterrrrr>s  z!BaseSelectorEventLoop._add_readercCs|r dSy|j|}Wntk r0dSX|j|j}\}}|tjM}|sb|j|n|j ||d|f|dk r| dSdSdS)NFT) r4r r r rr@rri unregisterrjrk)r$rrrorprqrrrr7 s z$BaseSelectorEventLoop._remove_readerc Gs|t|||d}y|j|}Wn*tk rR|j|tjd|fYn>X|j|j }\}}|j ||tjB||f|dk r| dS)N) rfrrgr r r rhr EVENT_WRITEr@rjrk) r$rrlrmrnrrorprqrrr _add_writer s  z!BaseSelectorEventLoop._add_writercCs|r dSy|j|}Wntk r0dSX|j|j}\}}|tjM}|sb|j|n|j |||df|dk r| dSdSdS)zRemove a writer callback.FNT) r4r r r rr@rrsrrrjrk)r$rrrorprqrrr_remove_writer/s z$BaseSelectorEventLoop._remove_writercGs|||j||f|S)zAdd a reader callback.)rer>)r$rrlrmrrr add_readerFs z BaseSelectorEventLoop.add_readercCs||||S)zRemove a reader callback.)rer7)r$rrrr remove_readerKs z#BaseSelectorEventLoop.remove_readercGs|||j||f|S)zAdd a writer callback..)rert)r$rrlrmrrr add_writerPs z BaseSelectorEventLoop.add_writercCs||||S)zRemove a writer callback.)reru)r$rrrr remove_writerUs z#BaseSelectorEventLoop.remove_writercsDt||jr"|dkr"td|}||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. rzthe socket must be non-blockingN)rrI gettimeoutrcr^ _sock_recv)r$rnfutrrr sock_recvZs zBaseSelectorEventLoop.sock_recvc Cs|dk r|||rdSy||}Wn`ttfk rb|}|||j||||Yn6tk r}z| |Wdd}~XYn X| |dS)N) rw cancelledrBrDrCr9rvr{r_ set_exception set_result)r$r} registered_fdrr|r@rr\rrrr{hs z BaseSelectorEventLoop._sock_recvcsDt||jr"|dkr"td|}||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. rzthe socket must be non-blockingN)rrIrzrcr^_sock_recv_into)r$rbufr}rrrsock_recv_into}s z$BaseSelectorEventLoop.sock_recv_intoc Cs|dk r|||rdSy||}Wn`ttfk rb|}|||j||||Yn6tk r}z| |Wdd}~XYn X| |dS)N) rwr recv_intorDrCr9rvrr_rr)r$r}rrrnbytesrr\rrrrs z%BaseSelectorEventLoop._sock_recv_intocsTt||jr"|dkr"td|}|r@||d||n |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. rzthe socket must be non-blockingN)rrIrzrcr^ _sock_sendallr)r$rr@r}rrr sock_sendalls  z"BaseSelectorEventLoop.sock_sendallc Cs|dk r|||rdSy||}WnFttfk rHd}Yn,tk rr}z||dSd}~XYnX|t|kr|dn.|r||d}| }| ||j ||||dS)Nr) ryrrGrDrCr_rlenrr9rxr)r$r}rrr@r|r\rrrrrs"     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. rzthe socket must be non-blockingAF_UNIX)familyprotoloopN) rrIrzrchasattrr<rrZ_ensure_resolvedrr^ _sock_connect)r$rr1ZresolvedrYr}rrr sock_connectsz"BaseSelectorEventLoop.sock_connectc Cs|}y||Wnjttfk rV|t|j||||j |||Yn6t k r}z| |Wdd}~XYn X| ddS)N) r9ZconnectrDrCZadd_done_callback functoolspartial_sock_connect_donerx_sock_connect_cbr_rr)r$r}rr1rr\rrrrsz#BaseSelectorEventLoop._sock_connectcCs||dS)N)ry)r$rr}rrrrsz(BaseSelectorEventLoop._sock_connect_donec Cs|r dSy,|tjtj}|dkr6t|d|WnBttfk rPYn6tk rz}z| |Wdd}~XYn X| ddS)NrzConnect call failed ) rZ getsockoptr<Z SOL_SOCKETZSO_ERRORrHrDrCr_rr)r$r}rr1errr\rrrrsz&BaseSelectorEventLoop._sock_connect_cbcsBt||jr"|dkr"td|}||d||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. rzthe socket must be non-blockingFN)rrIrzrcr^ _sock_accept)r$rr}rrr sock_accepts z!BaseSelectorEventLoop.sock_acceptc Cs|}|r|||r"dSy|\}}|dWnVttfk rh|||j|d|Yn:t k r}z| |Wdd}~XYnX| ||fdS)NFT) r9rwrrTr=rDrCrvrr_rr)r$r}Z registeredrrrZr1r\rrrrs  z"BaseSelectorEventLoop._sock_acceptc sl|j|j=|}||IdHz|j|j|||ddIdHS||rZ|||j|j<XdS)NF)Zfallback) r#_sock_fd is_reading pause_reading_make_empty_waiterZ sock_sendfile_sock_reset_empty_waiterresume_reading)r$Ztranspfileoffsetcountrrrr_sendfile_natives z&BaseSelectorEventLoop._sendfile_nativecCsx~|D]v\}}|j|j}\}}|tj@rN|dk rN|jrD||n |||tj@r|dk r|jrr||q||qWdS)N) fileobjr@rriZ _cancelledr7Z _add_callbackrsru)r$Z event_listrrorrprqrrr_process_events-s   z%BaseSelectorEventLoop._process_eventscCs|||dS)N)r7r9r6)r$rrrr _stop_serving;sz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN),r __module__ __qualname____doc__rr*rZSSL_HANDSHAKE_TIMEOUTr/r2r6r5r!rAr?rJrOrLrXrer>r7rtrurvrwrxryr~r{rrrrrrrrrrrrr __classcell__rr)rrr/sZ    +$ rcseZdZdZeZdZdfdd ZddZddZ d d Z d d Z d dZ ddZ ddZdddZddZddZddZddZZS) _SelectorTransportiNcst||||jd<y||jd<Wntk rHd|jd<YnXd|jkry||jd<Wn tjk rd|jd<YnX||_| |_ d|_ | |||_ ||_d|_d|_|j dk r|j ||j|j <dS)Nr<ZsocknamerRFr)rr_extraZ getsocknamerHZ getpeernamer<errorrr9r_protocol_connected set_protocol_server_buffer_factory_buffer _conn_lost_closingZ_attachr#)r$rrr(r%r&)rrrrLs,       z_SelectorTransport.__init__cCs|jjg}|jdkr |dn|jr0|d|d|j|jdk r|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<{}> )rrrappendrr_loopr4rr rrirsget_write_buffer_sizeformatjoin)r$inforstatebufsizerrr__repr__fs*       z_SelectorTransport.__repr__cCs|ddS)N) _force_close)r$rrrabortsz_SelectorTransport.abortcCs||_d|_dS)NT) _protocolr)r$r(rrrrsz_SelectorTransport.set_protocolcCs|jS)N)r)r$rrr get_protocolsz_SelectorTransport.get_protocolcCs|jS)N)r)r$rrrrdsz_SelectorTransport.is_closingcCsT|jr dSd|_|j|j|jsP|jd7_|j|j|j|jddS)NTr) rrr7rrrru call_soon_call_connection_lost)r$rrrr6sz_SelectorTransport.closecCs.|jdk r*tjd|t|d|jdS)Nzunclosed transport )source)rwarningswarnResourceWarningr6)r$rrr__del__s z_SelectorTransport.__del__Fatal error on transportcCsNt|tr(|jr@tjd||ddn|j||||jd||dS)Nz%r: %sT)rF)rPrQr]r() rrHr get_debugr rrWrr)r$r\rPrrr _fatal_errors   z_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j|j|j|jsBd|_|j|j|jd7_|j|j |dS)NTr) rrclearrrurrr7rr)r$r\rrrrs z_SelectorTransport._force_closecCsVz|jr|j|Wd|jd|_d|_d|_|j}|dk rP|d|_XdS)N)rrZconnection_lostrr6rrZ_detach)r$r\r&rrrrs z(_SelectorTransport._call_connection_lostcCs t|jS)N)rr)r$rrrrsz(_SelectorTransport.get_write_buffer_sizecGs"|jr dS|jj||f|dS)N)rrr>)r$rrlrmrrrr>sz_SelectorTransport._add_reader)NN)r)rrrmax_size bytearrayrrrrrrrrdr6rrrrrr>rrr)rrr@s    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|dk rz|j tj|ddS)NF)_read_ready_cbrr_eof_paused _empty_waiterrZ _set_nodelayrrrrconnection_mader>r _read_readyr_set_result_unless_cancelled)r$rrr(r)r%r&)rrrrs    z!_SelectorSocketTransport.__init__cs.t|tjr|j|_n|j|_t|dS)N)rrZBufferedProtocol_read_ready__get_bufferr_read_ready__data_receivedrr)r$r()rrrrs  z%_SelectorSocketTransport.set_protocolcCs|j o|j S)N)rr)r$rrrrsz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j|j|jr:td|dS)NTz%r pauses reading)rrrr7rrr r)r$rrrrs   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_||j|j|jrrrrrr r)r$rrrrs   z'_SelectorSocketTransport.resume_readingcCs |dS)N)r)r$rrrrsz$_SelectorSocketTransport._read_readyc Cs|jr dSy |jd}t|s(tdWn.tk rX}z||ddSd}~XYnXy|j|}WnDt t fk rdStk r}z||ddSd}~XYnX|s| dSy|j |Wn0tk r}z||dWdd}~XYnXdS)Nz%get_buffer() returned an empty bufferz/Fatal error: protocol.get_buffer() call failed.z$Fatal read error on socket transportz3Fatal error: protocol.buffer_updated() call failed.) rrZ get_bufferrr3r_rrrrDrC_read_ready__on_eofZbuffer_updated)r$rr\rrrrr s2   z0_SelectorSocketTransport._read_ready__get_bufferc Cs|jr dSy|j|j}WnDttfk r4dStk r`}z||ddSd}~XYnX|sr|dSy|j |Wn.tk r}z||dWdd}~XYnXdS)Nz$Fatal read error on socket transportz2Fatal error: protocol.data_received() call failed.) rrrBrrDrCr_rrrZ data_received)r$r@r\rrrr*s" z3_SelectorSocketTransport._read_ready__data_receivedc Cst|jrtd|y|j}Wn.tk rR}z||ddSd}~XYnX|rh|j|j n| dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrr rrZ eof_receivedr_rr7rr6)r$Z keep_openr\rrrr?s  z,_SelectorSocketTransport._read_ready__on_eofc Cst|tttfs$tdt|j|jr2td|j dk rDtd|sLdS|j rz|j t j krht d|j d7_ dS|jsy|j|}WnDttfk rYnBtk r}z||ddSd}~XYnX||d}|sdS|j|j|j|j||dS)Nz/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progresszsocket.send() raised exception.rz%Fatal write error on socket transport)rbytesr memoryviewrtyperrr3rrr!LOG_THRESHOLD_FOR_CONNLOST_WRITESr warningrrrGrDrCr_rrrtr _write_readyextend_maybe_pause_protocol)r$r@r|r\rrrwriteRs6      z_SelectorSocketTransport.writec Cs|jstd|jrdSy|j|j}Wnrttfk rBYntk r}z>|j |j |j | |d|j dk r|j |Wdd}~XYnnX|r|jd|=||js |j |j |j dk r|j d|jr|dn|jr |jtjdS)NzData should not be emptyz%Fatal write error on socket transport)rAssertionErrorrrrGrDrCr_rrurrrrr_maybe_resume_protocolrrrrshutdownr<SHUT_WR)r$r|r\rrrrws0       z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|jtjdS)NT)rrrrrr<r)r$rrr write_eofs  z"_SelectorSocketTransport.write_eofcCsdS)NTr)r$rrr can_write_eofsz&_SelectorSocketTransport.can_write_eofcs*t||jdk r&|jtddS)NzConnection is closed by peer)rrrrConnectionError)r$r\)rrrrs  z._SelectorSocketTransport._call_connection_lostcCs6|jdk rtd|j|_|js0|jd|jS)NzEmpty waiter is already set)rr3rr^rr)r$rrrrs    z+_SelectorSocketTransport._make_empty_waitercCs d|_dS)N)r)r$rrrrsz,_SelectorSocketTransport._reset_empty_waiter)NNN)rrrZ_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrrrrrrrrrrrrrrrrrr)rrr's& % r'csFeZdZejZd fdd ZddZddZd dd Z d d Z Z S)r0Ncs^t||||||_|j|jj||j|j|j|j |dk rZ|jt j |ddS)N) rr_addressrrrrr>rrrr)r$rrr(r1r)r%)rrrrs   z#_SelectorDatagramTransport.__init__cCstdd|jDS)Ncss|]\}}t|VqdS)N)r).0r@rYrrr szC_SelectorDatagramTransport.get_write_buffer_size..)sumr)r$rrrrsz0_SelectorDatagramTransport.get_write_buffer_sizec Cs|jr dSy|j|j\}}Wnpttfk r8Ynhtk rd}z|j|Wdd}~XYn<t k r}z| |dWdd}~XYnX|j ||dS)Nz&Fatal read error on datagram transport) rrZrecvfromrrDrCrHrerror_receivedr_rZdatagram_received)r$r@r[r\rrrrsz&_SelectorDatagramTransport._read_readyc Csdt|tttfs$tdt|j|s,dS|jrV|d|jfkrPtd|j|j}|j r|jr|j t j krxt d|j d7_ dS|jsDy*|jdr|j|n|j||dSttfk r|j|j|jYn^tk r}z|j|dSd}~XYn0tk rB}z||ddSd}~XYnX|jt||f|dS)Nz/data argument must be a bytes-like object, not z!Invalid address: must be None or zsocket.send() raised exception.rrRz'Fatal write error on datagram transport) rrrrrrrrrcrrrr rrrrrGsendtorDrCrrtr _sendto_readyrHrrr_rrr)r$r@r[r\rrrrs>     z!_SelectorDatagramTransport.sendtoc Csx|jr|j\}}y*|jdr0|j|n|j||Wqttfk rj|j||fPYqt k r}z|j |dSd}~XYqt k r}z| |ddSd}~XYqXqW||js|j|j|jr|ddS)NrRz'Fatal write error on datagram transport)rpopleftrrrGrrDrC appendleftrHrrr_rrrrurrr)r$r@r[r\rrrrs*  z(_SelectorDatagramTransport._sendto_ready)NNN)N) rrr collectionsdequerrrrrrrrr)rrr0s  )r0)r__all__rrVrrr<rr"r ImportErrorrrrrrr r logr rrZ BaseEventLooprZ_FlowControlMixinZ Transportrr'r0rrrrsB           _