B –?ÀoÐy"ã@s"dZdZddlZddlZddlZddlZddlZddlZddlZy ddl Z Wne k rddZ YnXddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd lmZd d„Zdd„ZGdd„de jƒZGdd„dejejƒZGdd„deƒZGdd„deƒZdS)zÄEvent 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. )ÚBaseSelectorEventLoopéNé)Ú base_events)Ú constants)Úevents)Úfutures)Ú protocols)Ússlproto)Ú transports)ÚloggercCs6y| |¡}Wntk r"dSXt|j|@ƒSdS)NF)Úget_keyÚKeyErrorÚboolr)ÚselectorÚfdZeventÚkey©rú:/opt/alt/python37/lib/python3.7/asyncio/selector_events.pyÚ_test_selector_events rcCs tdk rt|tjƒrtdƒ‚dS)Nz"Socket cannot be of type SSLSocket)ÚsslÚ isinstanceZ SSLSocketÚ TypeError)ÚsockrrrÚ_check_ssl_socket*srcs†eZdZdZdQ‡fdd„ ZdRdddœdd„ZdSddddejd œd d „ZdTd d „Z ‡fdd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdddejfdd„Zdddejfdd„Zddejfdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Z d=d>„Z!d?d@„Z"dAdB„Z#dCdD„Z$dEdF„Z%dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*‡Z+S)UrzJSelector event loop. See events.EventLoop for API specification. NcsFtƒ ¡|dkrt ¡}t d|jj¡||_|  ¡t   ¡|_ dS)NzUsing selector: %s) ÚsuperÚ__init__Ú selectorsZDefaultSelectorr ÚdebugÚ __class__Ú__name__Ú _selectorÚ_make_self_pipeÚweakrefZWeakValueDictionaryÚ _transports)Úselfr)rrrr5s zBaseSelectorEventLoop.__init__)ÚextraÚservercCst||||||ƒS)N)Ú_SelectorSocketTransport)r$rÚprotocolÚwaiterr%r&rrrÚ_make_socket_transport?s z,BaseSelectorEventLoop._make_socket_transportF)Ú server_sideÚserver_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|j ¡d|_dS)Nz!Cannot close a running event loop)Z is_runningÚ RuntimeErrorÚ is_closedÚ_close_self_piperÚcloser )r$)rrrr6Vs   zBaseSelectorEventLoop.closecCsB| |j ¡¡|j ¡d|_|j ¡d|_|jd8_dS)Nr)Ú_remove_readerÚ_ssockÚfilenor6Ú_csockÚ _internal_fds)r$rrrr5as   z&BaseSelectorEventLoop._close_self_pipecCsNt ¡\|_|_|j d¡|j d¡|jd7_| |j ¡|j¡dS)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 |j d¡}|sP| |¡Wqtk r8wYqtk rLPYqXqWdS)Ni)r8ÚrecvrAÚInterruptedErrorÚBlockingIOError)r$r@rrrr?ts z%BaseSelectorEventLoop._read_from_selfcCsJ|j}|dk rFy| d¡Wn(tk rD|jr@tjdddYnXdS)Nóz3Fail to write a null byte into the self-pipe socketT)Úexc_info)r:ÚsendÚOSErrorÚ_debugr r)r$ZcsockrrrÚ_write_to_self€sz$BaseSelectorEventLoop._write_to_selfédc Cs"| | ¡|j||||||¡dS)N)r>r9Ú_accept_connection)r$Úprotocol_factoryrr.r&Úbacklogr-rrrÚ_start_servings z$BaseSelectorEventLoop._start_servingc Csxüt|ƒD]ð}y0| ¡\}} |jr4t d|| |¡| d¡Wn”tttfk rZdSt k rÔ} z^| j t j t j t j t jfkrÂ| d| |dœ¡| | ¡¡| tj|j||||||¡n‚Wdd} ~ XYq Xd| i} | ||| |||¡} | | ¡q WdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ exceptionr<Úpeername)ÚrangeÚacceptrIr rr=rDrCÚConnectionAbortedErrorrHÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr7r9Z call_laterrZACCEPT_RETRY_DELAYrOÚ_accept_connection2Z create_task) r$rMrr.r&rNr-Ú_ÚconnÚaddrÚexcr%rTrrrrL—s6      z(BaseSelectorEventLoop._accept_connectionc ÃsÖd}d}yl|ƒ}| ¡} |r8|j|||| d|||d}n|j||| ||d}y| IdHWn| ¡‚YnXWn\tk rÐ} z>|jrÀd| 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\ÚcontextrrrrXÃs6  z)BaseSelectorEventLoop._accept_connection2c CsŽ|}t|tƒsJyt| ¡ƒ}Wn*tttfk rHtd|›ƒd‚YnXy|j|}Wntk rlYnX| ¡sŠt d|›d|›ƒ‚dS)NzInvalid file object: zFile descriptor z is used by transport ) rÚintr9ÚAttributeErrorrÚ ValueErrorr#r Ú is_closingr3)r$rr9r]rrrÚ_ensure_fd_no_transportês z-BaseSelectorEventLoop._ensure_fd_no_transportc Gs”| ¡t |||d¡}y|j |¡}Wn*tk rR|j |tj|df¡Yn>X|j|j }\}}|j  ||tjB||f¡|dk r|  ¡dS)N) Ú _check_closedrÚHandler r r ÚregisterrÚ EVENT_READr@ÚmodifyÚcancel) r$rÚcallbackÚargsÚhandlerÚmaskÚreaderÚwriterrrrr>ü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|f¡Yn>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_writercÃsDt|ƒ|jr"| ¡dkr"tdƒ‚| ¡}| |d||¡|IdHS)zÌReceive 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$rÚnÚfutrrrÚ 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_recvcÃsDt|ƒ|jr"| ¡dkr"tdƒ‚| ¡}| |d||¡|IdHS)z¥Receive 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$rÚbufr}rrrÚsock_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_intorDrCr9rvrƒr_r€r)r$r}r‚rr„Únbytesrr\rrrrƒŠs z%BaseSelectorEventLoop._sock_recv_intocÃsTt|ƒ|jr"| ¡dkr"tdƒ‚| ¡}|r@| |d||¡n | d¡|IdHS)ašSend 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_sendall s  z"BaseSelectorEventLoop.sock_sendallc Cs¾|dk r| |¡| ¡rdSy| |¡}WnFttfk rHd}Yn,tk rr}z| |¡dSd}~XYnX|t|ƒkrŒ| d¡n.|rœ||d…}|  ¡}|  ||j ||||¡dS)Nr) ryrrGrDrCr_r€Úlenrr9rxrˆ)r$r}r‚rr@r|r\rrrrrˆ³s"     z#BaseSelectorEventLoop._sock_sendallcÃs†t|ƒ|jr"| ¡dkr"tdƒ‚ttdƒr8|jtjkrf|j||j|j |dIdH}|d\}}}}}|  ¡}|  |||¡|IdHS)zTConnect to a remote socket at address. This method is a coroutine. rzthe socket must be non-blockingÚAF_UNIX)ÚfamilyÚprotoÚloopN) rrIrzrcÚhasattrr<rŒr‹Z_ensure_resolvedrr^Ú _sock_connect)r$rr1ZresolvedrYr}rrrÚ sock_connectÉsz"BaseSelectorEventLoop.sock_connectc Cs| ¡}y| |¡Wnjttfk rV| t |j|¡¡| ||j |||¡Yn6t k r€}z|  |¡Wdd}~XYn X|  d¡dS)N) r9ZconnectrDrCZadd_done_callbackÚ functoolsÚpartialÚ_sock_connect_donerxÚ_sock_connect_cbr_r€r)r$r}rr1rr\rrrrÛsz#BaseSelectorEventLoop._sock_connectcCs| |¡dS)N)ry)r$rr}rrrr”ìsz(BaseSelectorEventLoop._sock_connect_donec CsŠ| ¡r dSy,| tjtj¡}|dkr6t|d|›ƒ‚WnBttfk rPYn6tk rz}z|  |¡Wdd}~XYn X|  d¡dS)NrzConnect call failed ) rZ getsockoptr<Z SOL_SOCKETZSO_ERRORrHrDrCr_r€r)r$r}rr1Úerrr\rrrr•ïsz&BaseSelectorEventLoop._sock_connect_cbcÃsBt|ƒ|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| ¡\}}| d¡WnVttfk rh| ||j|d|¡Yn:t k r’}z|  |¡Wdd}~XYnX|  ||f¡dS)NFT) r9rwrrTr=rDrCrvr—r_r€r)r$r}Z registeredrrrZr1r\rrrr—s  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_waiterÚresume_reading)r$ZtranspÚfileÚoffsetÚcountrŸrrrÚ_sendfile_natives z&BaseSelectorEventLoop._sendfile_nativecCs„x~|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_listrror¤rprqrrrÚ_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{r…rƒr‰rˆr‘rr”r•r˜r—r£r¥r¦Ú __classcell__rr)rrr/sZ    +$ rcsŒeZdZdZeZdZd‡fdd„ Zdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zddd„Zdd„Zdd„Zdd„Zdd„Z‡ZS) Ú_SelectorTransportiNcsètƒ ||¡||jd<y| ¡|jd<Wntk rHd|jd<YnXd|jkrˆy| ¡|jd<Wn tjk r†d|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$rŽrr(r%r&)rrrrLs,       z_SelectorTransport.__init__cCsÖ|jjg}|jdkr | d¡n|jr0| d¡| d|j›¡|jdk rÆ|j ¡sÆt|jj |jt j ƒ}|rz| d¡n | d¡t|jj |jt j ƒ}|r¢d}nd}|  ¡}| d|›d |›d ¡d  d  |¡¡S) NÚclosedÚclosingzfd=z read=pollingz read=idleÚpollingZidlezwrite=z<{}>ú )rrrÚappendr´r™Ú_loopr4rr rrirsÚget_write_buffer_sizeÚformatÚjoin)r$Úinfor·ÚstateÚbufsizerrrÚ__repr__fs*       z_SelectorTransport.__repr__cCs| d¡dS)N)Ú _force_close)r$rrrÚabort‚sz_SelectorTransport.abortcCs||_d|_dS)NT)Ú _protocolr®)r$r(rrrr¯…sz_SelectorTransport.set_protocolcCs|jS)N)rÅ)r$rrrÚ get_protocol‰sz_SelectorTransport.get_protocolcCs|jS)N)r´)r$rrrrdŒsz_SelectorTransport.is_closingcCsT|jr dSd|_|j |j¡|jsP|jd7_|j |j¡|j |jd¡dS)NTr) r´r»r7r™r²r³ruÚ call_soonÚ_call_connection_lost)r$rrrr6sz_SelectorTransport.closecCs.|jdk r*tjd|›t|d|j ¡dS)Nzunclosed transport )Úsource)rÚwarningsÚwarnÚResourceWarningr6)r$rrrÚ__del__™s z_SelectorTransport.__del__úFatal error on transportcCsNt|tƒr(|j ¡r@tjd||ddn|j ||||jdœ¡| |¡dS)Nz%r: %sT)rF)rPrQr]r() rrHr»Ú get_debugr rrWrÅrÃ)r$r\rPrrrÚ _fatal_errorŸs   z_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j ¡|j |j¡|jsBd|_|j |j¡|jd7_|j |j |¡dS)NTr) r³r²Úclearr»rur™r´r7rÇrÈ)r$r\rrrrís z_SelectorTransport._force_closecCsVz|jr|j |¡Wd|j ¡d|_d|_d|_|j}|dk rP| ¡d|_XdS)N)r®rÅZconnection_lostrr6r»r°Z_detach)r$r\r&rrrrȹs z(_SelectorTransport._call_connection_lostcCs t|jƒS)N)rŠr²)r$rrrr¼Çsz(_SelectorTransport.get_write_buffer_sizecGs"|jr dS|jj||f|žŽdS)N)r´r»r>)r$rrlrmrrrr>Êsz_SelectorTransport._add_reader)NN)rÎ)rr§r¨Úmax_sizeÚ bytearrayr±rrrÂrÄr¯rÆrdr6rÍrÐrÃrÈr¼r>rªrr)rrr«@s    r«csªeZdZdZejjZd#‡fdd„ Z‡fdd„Z dd„Z d d „Z d d „Z d d„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z‡fdd„Zdd „Zd!d"„Z‡ZS)$r'TNcs~d|_tƒ |||||¡d|_d|_d|_t |j¡|j   |j j |¡|j   |j |j|j¡|dk rz|j   tj|d¡dS)NF)Ú_read_ready_cbrrÚ_eofÚ_pausedÚ _empty_waiterrZ _set_nodelayrr»rÇrÅÚconnection_mader>r™Ú _read_readyrÚ_set_result_unless_cancelled)r$rŽrr(r)r%r&)rrrrÖs    z!_SelectorSocketTransport.__init__cs.t|tjƒr|j|_n|j|_tƒ |¡dS)N)rrZBufferedProtocolÚ_read_ready__get_bufferrÔÚ_read_ready__data_receivedrr¯)r$r()rrrr¯ís  z%_SelectorSocketTransport.set_protocolcCs|j o|j S)N)rÖr´)r$rrrršõsz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j |j¡|j ¡r:t d|¡dS)NTz%r pauses reading)r´rÖr»r7r™rÏr r)r$rrrr›øs   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_| |j|j¡|j ¡rr™rÙr»rÏr r)r$rrrrŸs   z'_SelectorSocketTransport.resume_readingcCs | ¡dS)N)rÔ)r$rrrrÙsz$_SelectorSocketTransport._read_readyc Cs|jr dSy |j d¡}t|ƒs(tdƒ‚Wn.tk rX}z| |d¡dSd}~XYnXy|j |¡}WnDt t fk r‚dStk r®}z| |d¡dSd}~XYnX|sÀ|  ¡dSy|j  |¡Wn0tk r}z| |d¡Wdd}~XYnXdS)Néÿÿÿÿz%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.) r³rÅZ get_bufferrŠr3r_rÐrr†rDrCÚ_read_ready__on_eofZbuffer_updated)r$r„r\r‡rrrrÛ s2   z0_SelectorSocketTransport._read_ready__get_bufferc Cs¶|jr dSy|j |j¡}WnDttfk r4dStk r`}z| |d¡dSd}~XYnX|sr| ¡dSy|j   |¡Wn.tk r°}z| |d¡Wdd}~XYnXdS)Nz$Fatal read error on socket transportz2Fatal error: protocol.data_received() call failed.) r³rrBrÒrDrCr_rÐrÞrÅZ data_received)r$r@r\rrrrÜ*s" z3_SelectorSocketTransport._read_ready__data_receivedc Cst|j ¡rt d|¡y|j ¡}Wn.tk rR}z| |d¡dSd}~XYnX|rh|j |j ¡n|  ¡dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) r»rÏr rrÅZ eof_receivedr_rÐr7r™r6)r$Z keep_openr\rrrrÞ?s  z,_SelectorSocketTransport._read_ready__on_eofc Cst|tttfƒs$tdt|ƒj›ƒ‚|jr2tdƒ‚|j dk rDtdƒ‚|sLdS|j rz|j t j krht  d¡|j d7_ dS|jsþy|j |¡}WnDttfk rªYnBtk rÖ}z| |d¡dSd}~XYnX||d…}|sìdS|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)rÚbytesrÓÚ memoryviewrÚtyperrÕr3r×r³rÚ!LOG_THRESHOLD_FOR_CONNLOST_WRITESr Úwarningr²rrGrDrCr_rÐr»rtr™Ú _write_readyÚextendÚ_maybe_pause_protocol)r$r@r|r\rrrÚwriteRs6      z_SelectorSocketTransport.writec Csü|jr dSy|j |j¡}Wnrttfk r4YnÄtk rŽ}z>|j |j ¡|j  ¡|  |d¡|j dk r~|j   |¡Wdd}~XYnjX|r |jd|…=| ¡|jsø|j |j ¡|j dk rÒ|j  d¡|jrä| d¡n|jrø|j tj¡dS)Nz%Fatal write error on socket transport)r³rrGr²rDrCr_r»rur™rÑrÐr×r€Ú_maybe_resume_protocolrr´rÈrÕÚshutdownr<ÚSHUT_WR)r$r|r\rrrräws.       z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|j tj¡dS)NT)r´rÕr²rrér<rê)r$rrrÚ write_eof“s  z"_SelectorSocketTransport.write_eofcCsdS)NTr)r$rrrÚ can_write_eofšsz&_SelectorSocketTransport.can_write_eofcs*tƒ |¡|jdk r&|j tdƒ¡dS)NzConnection is closed by peer)rrÈr×r€ÚConnectionError)r$r\)rrrrÈs  z._SelectorSocketTransport._call_connection_lostcCs6|jdk rtdƒ‚|j ¡|_|js0|j d¡|jS)NzEmpty waiter is already set)r×r3r»r^r²r)r$rrrrœ£s    z+_SelectorSocketTransport._make_empty_waitercCs d|_dS)N)r×)r$rrrrž«sz,_SelectorSocketTransport._reset_empty_waiter)NNN)rr§r¨Z_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerr¯ršr›rŸrÙrÛrÜrÞrçrärërìrÈrœržrªrr)rrr'Ñs& % r'csFeZdZejZd ‡fdd„ Zdd„Zdd„Zd dd „Z d d „Z ‡Z S)r0Ncs^tƒ ||||¡||_|j |jj|¡|j |j|j|j ¡|dk rZ|j t j |d¡dS)N) rrÚ_addressr»rÇrÅrØr>r™rÙrrÚ)r$rŽrr(r1r)r%)rrrr³s   z#_SelectorDatagramTransport.__init__cCstdd„|jDƒƒS)Ncss|]\}}t|ƒVqdS)N)rŠ)Ú.0r@rYrrrú ÁszC_SelectorDatagramTransport.get_write_buffer_size..)Úsumr²)r$rrrr¼Àsz0_SelectorDatagramTransport.get_write_buffer_sizec Cs¤|jr dSy|j |j¡\}}Wnpttfk r8Ynhtk rd}z|j |¡Wdd}~XYn<t k r}z|  |d¡Wdd}~XYnX|j  ||¡dS)Nz&Fatal read error on datagram transport) r³rZrecvfromrÒrDrCrHrÅÚerror_receivedr_rÐZdatagram_received)r$r@r[r\rrrrÙÃsz&_SelectorDatagramTransport._read_readyc Csdt|tttfƒs$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|j¡Yn^tk r}z|j |¡dSd}~XYn0tk rB}z| |d¡dSd}~XYnX|j t|ƒ|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) rrßrÓràrrárrîrcr³rrâr rãr²r¬rrGÚsendtorDrCr»rtr™Ú _sendto_readyrHrÅròr_rÐrºræ)r$r@r[r\rrrróÑs>     z!_SelectorDatagramTransport.sendtoc CsøxÆ|jrÆ|j ¡\}}y*|jdr0|j |¡n|j ||¡Wqttfk rj|j ||f¡PYqt k r–}z|j   |¡dSd}~XYqt k rÂ}z|  |d¡dSd}~XYqXqW| ¡|jsô|j |j¡|jrô| d¡dS)NrRz'Fatal write error on datagram transport)r²Úpopleftr¬rrGrórDrCÚ appendleftrHrÅròr_rÐrèr»rur™r´rÈ)r$r@r[r\rrrrôús*  z(_SelectorDatagramTransport._sendto_ready)NNN)N) rr§r¨Ú collectionsÚdequer±rr¼rÙrórôrªrr)rrr0¯s  )r0)r©Ú__all__r÷rVr’rr<rÊr"rÚ ImportErrorÚrrrrrr r Úlogr rrZ BaseEventLooprZ_FlowControlMixinZ Transportr«r'r0rrrrÚsB           _