U e5dT��@s*dZddlZddlZddlZddlZddlZddlZddlZz ddlZWne k r`dZYnXddl m Z ddl 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))�BaseSelectorEventLoop�N�)� base_events)� constants)�events)�futures)� protocols)�sslproto)� transports)�trsock)�loggercCs8z|�|�}Wntk r$YdSXt|j|@�SdS�NF)�get_key�KeyError�boolr)�selector�fdZevent�key�r�//usr/lib64/python3.8/asyncio/selector_events.py�_test_selector_event s rcCs tdk rt|tj�rtd��dS)Nz"Socket cannot be of type SSLSocket)�ssl� isinstanceZ SSLSocket� TypeError)�sockrrr�_check_ssl_socket+srcs�eZdZdR�fdd� ZdSddd�dd�ZdTddddejd�d d �ZdUd d �Z�fd d�Z dd�Z dd�Z dd�Z dd�Z dd�Zdddejfdd�Zdddejfdd�Zddejfdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zdd?�Z!d@dA�Z"dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&dJdK�Z'dLdM�Z(dNdO�Z)dPdQ�Z*�Z+S)VrNcsFt���|dkrt��}t�d|jj�||_|� �t � �|_ dS)NzUsing selector: %s) �super�__init__� selectorsZDefaultSelectorr �debug� __class__�__name__� _selector�_make_self_pipe�weakrefZWeakValueDictionary� _transports)�selfr�r rrr6s 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)r2r()r Z SSLProtocolr,Z_app_transport) r&Zrawsockr-� sslcontextr.r0r1r)r*r2Z ssl_protocolrrr�_make_ssl_transportEs��z)BaseSelectorEventLoop._make_ssl_transportcCst||||||�Sr+)�_SelectorDatagramTransport)r&rr-�addressr.r)rrr�_make_datagram_transportRs �z.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&r'rrr;Ws   zBaseSelectorEventLoop.closecCsB|�|j���|j��d|_|j��d|_|jd8_dS)Nr)�_remove_reader�_ssock�filenor;�_csock� _internal_fdsr<rrrr:bs   z&BaseSelectorEventLoop._close_self_pipecCsNt��\|_|_|j�d�|j�d�|jd7_|�|j��|j�dS)NFr) �socketZ socketpairr>r@� setblockingrA� _add_readerr?�_read_from_selfr<rrrr#js   z%BaseSelectorEventLoop._make_self_pipecCsdSr+r�r&�datarrr�_process_self_datarsz(BaseSelectorEventLoop._process_self_datacCsXz"|j�d�}|sWqT|�|�Wqtk r:YqYqtk rPYqTYqXqdS)Ni)r>�recvrH�InterruptedError�BlockingIOErrorrFrrrrEus z%BaseSelectorEventLoop._read_from_selfcCsN|j}|dkrdSz|�d�Wn(tk rH|jrDtjddd�YnXdS)N�z3Fail to write a null byte into the self-pipe socketT��exc_info)r@�send�OSError�_debugr r)r&Zcsockrrr�_write_to_self�s�z$BaseSelectorEventLoop._write_to_self�dc Cs"|�|��|j||||||�dSr+)rDr?�_accept_connection)r&�protocol_factoryrr3r*�backlogr2rrr�_start_serving�s�z$BaseSelectorEventLoop._start_servingc Cst|�D]�}z0|��\}} |jr0t�d|| |�|�d�Wn�tttfk rZYdSt k r�} zd| j t j t j t j t jfkr�|�d| t�|�d��|�|���|�tj|j||||||�n�W5d} ~ XYqXd| i} |�||| |||�} |�| �qdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)�message� exceptionrB�peername)�range�acceptrQr rrCrKrJ�ConnectionAbortedErrorrP�errnoZEMFILEZENFILEZENOBUFSZENOMEM�call_exception_handlerr �TransportSocketr=r?Z call_laterrZACCEPT_RETRY_DELAYrW�_accept_connection2Z create_task) r&rUrr3r*rVr2�_�conn�addr�excr)r\rrrrT�sV  � ����z(BaseSelectorEventLoop._accept_connectionc �s�d}d}zt|�}|��} |r8|j|||| d|||d�}n|j||| ||d�}z| IdHWntk rx|���YnXWntttfk r��Yn\tk r�} z>|jr�d| d�} |dk r�|| d<|dk r�|| d<|�| �W5d} ~ XYnXdS)NT)r.r0r)r*r2)r.r)r*z3Error on transport creation for incoming connection)rXrYr-� transport) � create_futurer4r/� BaseExceptionr;� SystemExit�KeyboardInterruptrQr_) r&rUrcr)r3r*r2r-rfr.re�contextrrrra�sP�� �z)BaseSelectorEventLoop._accept_connection2c Cs�|}t|t�sJzt|���}Wn*tttfk rHtd|���d�YnXz|j|}Wntk rlYnX|��s�t d|�d|����dS)NzInvalid file object: zFile descriptor z is used by transport ) r�intr?�AttributeErrorr� ValueErrorr%r� is_closingr8)r&rr?rfrrr�_ensure_fd_no_transport�s �z-BaseSelectorEventLoop._ensure_fd_no_transportc Gs�|��t�|||d�}z|j�|�}Wn*tk rR|j�|tj|df�Yn>X|j|j }\}}|j� ||tjB||f�|dk r�|� �dSr+) � _check_closedr�Handler"rr�registerr� EVENT_READrG�modify�cancel� r&r�callback�argsZhandler�mask�reader�writerrrrrDs � �z!BaseSelectorEventLoop._add_readercCs�|��r dSz|j�|�}Wntk r2YdSX|j|j}\}}|tjM}|sd|j�|�n|j� ||d|f�|dk r�|� �dSdSdS�NFT) r9r"rrrrGrrt� unregisterrurv�r&rrrzr{r|rrrr=s z$BaseSelectorEventLoop._remove_readerc Gs�|��t�|||d�}z|j�|�}Wn*tk rR|j�|tjd|f�Yn>X|j|j }\}}|j� ||tjB||f�|dk r�|� �dSr+) rqrrrr"rrrsr� EVENT_WRITErGrurvrwrrr� _add_writer%s � �z!BaseSelectorEventLoop._add_writercCs�|��r dSz|j�|�}Wntk r2YdSX|j|j}\}}|tjM}|sd|j�|�n|j� |||df�|dk r�|� �dSdSdSr}) r9r"rrrrGrr�r~rurvrrrr�_remove_writer4s z$BaseSelectorEventLoop._remove_writercGs|�|�|j||f|��Sr+)rprD�r&rrxryrrr� add_readerKs z BaseSelectorEventLoop.add_readercCs|�|�|�|�Sr+)rpr=�r&rrrr� remove_readerPs z#BaseSelectorEventLoop.remove_readercGs|�|�|j||f|��Sr+)rpr�r�rrr� add_writerUs z BaseSelectorEventLoop.add_writercCs|�|�|�|�Sr+)rpr�r�rrr� remove_writerZs z#BaseSelectorEventLoop.remove_writerc �s�t|�|jr"|��dkr"td��z |�|�WSttfk rFYnX|��}|��}|� ||j |||�|� t � |j|��|IdHS�Nr�the socket must be non-blocking)rrQ� gettimeoutrnrIrKrJrgr?r�� _sock_recv�add_done_callback� functools�partial�_sock_read_done)r&r�n�futrrrr� sock_recv_s  �zBaseSelectorEventLoop.sock_recvcCs|�|�dSr+)r��r&rr�rrrr�tsz%BaseSelectorEventLoop._sock_read_donec Cs�|��r dSz|�|�}Wn\ttfk r4YdSttfk rL�Yn6tk rv}z|�|�W5d}~XYn X|�|�dSr+) �donerIrKrJrirjrh� set_exception� set_result)r&r�rr�rGrerrrr�wsz BaseSelectorEventLoop._sock_recvc �s�t|�|jr"|��dkr"td��z |�|�WSttfk rFYnX|��}|��}|� ||j |||�|� t � |j|��|IdHSr�)rrQr�rn� recv_intorKrJrgr?r��_sock_recv_intor�r�r�r�)r&r�bufr�rrrr�sock_recv_into�s  �z$BaseSelectorEventLoop.sock_recv_intoc Cs�|��r dSz|�|�}Wn\ttfk r4YdSttfk rL�Yn6tk rv}z|�|�W5d}~XYn X|�|�dSr+) r�r�rKrJrirjrhr�r�)r&r�rr��nbytesrerrrr��sz%BaseSelectorEventLoop._sock_recv_intoc �s�t|�|jr"|��dkr"td��z|�|�}Wnttfk rLd}YnX|t|�kr^dS|��}|� �}|� t � |j |��|�||j||t|�|g�|IdHSr�)rrQr�rnrOrKrJ�lenrgr?r�r�r��_sock_write_doner�� _sock_sendall� memoryview)r&rrGr�r�rrrr� sock_sendall�s&    ��z"BaseSelectorEventLoop.sock_sendallc Cs�|��r dS|d}z|�||d��}Wnbttfk rDYdSttfk r\�Yn2tk r�}z|�|�WY�dSd}~XYnX||7}|t|�kr�|� d�n||d<dS)Nr) r�rOrKrJrirjrhr�r�r�)r&r�rZview�pos�startr�rerrrr��s    z#BaseSelectorEventLoop._sock_sendallc�s�t|�|jr"|��dkr"td��ttd�r8|jtjkrf|j||j|j |d�IdH}|d\}}}}}|� �}|� |||�|IdHS)Nrr��AF_UNIX)�family�proto�loop) rrQr�rn�hasattrrBr�r�Z_ensure_resolvedr�rg� _sock_connect)r&rr6Zresolvedrbr�rrr� sock_connect�s� z"BaseSelectorEventLoop.sock_connectc Cs�|��}z|�|�Wn�ttfk rV|�t�|j|��|�||j |||�YnNt t fk rn�Yn6t k r�}z|� |�W5d}~XYn X|�d�dSr+)r?ZconnectrKrJr�r�r�r�r��_sock_connect_cbrirjrhr�r�)r&r�rr6rrerrrr��s �z#BaseSelectorEventLoop._sock_connectcCs|�|�dSr+)r�r�rrrr�sz&BaseSelectorEventLoop._sock_write_donec Cs�|��r dSz,|�tjtj�}|dkr6t|d|����WnZttfk rPYnNtt fk rh�Yn6t k r�}z|� |�W5d}~XYn X|� d�dS)NrzConnect call failed ) r�Z getsockoptrBZ SOL_SOCKETZSO_ERRORrPrKrJrirjrhr�r�)r&r�rr6�errrerrrr�sz&BaseSelectorEventLoop._sock_connect_cbc�sBt|�|jr"|��dkr"td��|��}|�|d|�|IdHS)Nrr�F)rrQr�rnrg� _sock_accept)r&rr�rrr� sock_accepts z!BaseSelectorEventLoop.sock_acceptc Cs�|��}|r|�|�|��r"dSz|��\}}|�d�Wnnttfk rh|�||j|d|�YnRt t fk r��Yn:t k r�}z|� |�W5d}~XYnX|� ||f�dSr})r?r�r�r\rCrKrJr�r�rirjrhr�r�)r&r�Z registeredrrrcr6rerrrr�*s  z"BaseSelectorEventLoop._sock_acceptc �sp|j|j=|��}|��|��IdHz |j|j|||dd�IdHW�S|��|r^|��||j|j<XdS)NF)Zfallback) r%�_sock_fd� is_reading� pause_reading�_make_empty_waiter�_reset_empty_waiter�resume_readingZ sock_sendfile�_sock)r&Ztransp�file�offset�countr�rrr�_sendfile_native<s �z&BaseSelectorEventLoop._sendfile_nativecCs�|D]v\}}|j|j}\}}|tj@rL|dk rL|jrB|�|�n |�|�|tj@r|dk r|jrp|�|�q|�|�qdSr+) �fileobjrGrrtZ _cancelledr=Z _add_callbackr�r�)r&Z event_listrrzr�r{r|rrr�_process_eventsJs    z%BaseSelectorEventLoop._process_eventscCs|�|���|��dSr+)r=r?r;)r&rrrr� _stop_servingXsz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN),r!� __module__� __qualname__rr/rZSSL_HANDSHAKE_TIMEOUTr4r7r;r:r#rHrErRrWrTrarprDr=r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�� __classcell__rrr'rr0s| � �� �   � � .� )rcs�eZdZdZeZdZd�fdd� Zdd�Zdd�Z d d �Z d d �Z d d�Z dd�Z ejfdd�Zddd�Zdd�Zdd�Zdd�Zdd�Z�ZS) �_SelectorTransportiNcs�t��||�t�|�|jd<z|��|jd<Wntk rNd|jd<YnXd|jkr�z|��|jd<Wn tj k r�d|jd<YnX||_ |� �|_ d|_ |�|�||_|��|_d|_d|_|jdk r�|j��||j|j <dS)NrBZsocknamerZFr)rrr r`�_extraZ getsocknamerPZ getpeernamerB�errorr�r?r��_protocol_connected� set_protocol�_server�_buffer_factory�_buffer� _conn_lost�_closingZ_attachr%)r&r�rr-r)r*r'rrris,      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<{}>� )r r!r��appendr�r��_loopr9rr"rrtr��get_write_buffer_size�format�join)r&�infor��state�bufsizerrr�__repr__�s0    �  �z_SelectorTransport.__repr__cCs|�d�dSr+)� _force_closer<rrr�abort�sz_SelectorTransport.abortcCs||_d|_dS�NT)� _protocolr��r&r-rrrr��sz_SelectorTransport.set_protocolcCs|jSr+)r�r<rrr� get_protocol�sz_SelectorTransport.get_protocolcCs|jSr+)r�r<rrrro�sz_SelectorTransport.is_closingcCsT|jr dSd|_|j�|j�|jsP|jd7_|j�|j�|j�|jd�dS�NTr) r�r�r=r�r�r�r�� call_soon�_call_connection_lostr<rrrr;�sz_SelectorTransport.closecCs,|jdk r(|d|��t|d�|j��dS)Nzunclosed transport )�source)r��ResourceWarningr;)r&Z_warnrrr�__del__�s z_SelectorTransport.__del__�Fatal error on transportcCsNt|t�r(|j��r@tjd||dd�n|j�||||jd��|�|�dS)Nz%r: %sTrM)rXrYrfr-) rrPr�� get_debugr rr_r�r�)r&rerXrrr� _fatal_error�s  �z_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j��|j�|j�|jsBd|_|j�|j�|jd7_|j�|j |�dSr�) r�r��clearr�r�r�r�r=r�r��r&rerrrr��s z_SelectorTransport._force_closecCsVz|jr|j�|�W5|j��d|_d|_d|_|j}|dk rP|��d|_XdSr+)r�r;r�r�r�Z_detachr�Zconnection_lost)r&rer*rrrr��s z(_SelectorTransport._call_connection_lostcCs t|j�Sr+)r�r�r<rrrr��sz(_SelectorTransport.get_write_buffer_sizecGs"|jr dS|jj||f|��dSr+)r�r�rDr�rrrrD�sz_SelectorTransport._add_reader)NN)r�)r!r�r��max_size� bytearrayr�r�rr�r�r�r�ror;�warnings�warnr�r�r�r�r�rDr�rrr'rr�]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�dSr )�_read_ready_cbrr�_eof�_paused� _empty_waiterrZ _set_nodelayr�r�r�r��connection_maderDr�� _read_readyr�_set_result_unless_cancelled)r&r�rr-r.r)r*r'rrr�s   � �z!_SelectorSocketTransport.__init__cs.t|tj�r|j|_n|j|_t��|�dSr+)rrZBufferedProtocol�_read_ready__get_bufferr��_read_ready__data_receivedrr�r�r'rrr� s  z%_SelectorSocketTransport.set_protocolcCs|j o|j Sr+)r�r�r<rrrr�sz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j�|j�|j��r:t�d|�dS)NTz%r pauses reading)r�r�r�r=r�r�r rr<rrrr�s   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_|�|j|j�|j��r�Yn4tk rp}z|� |d�WY�dSd}~XYnX|r�|j� |j �n|� �dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) r�r�r rr�Z eof_receivedrirjrhr�r=r�r;)r&Z keep_openrerrrr�es  �z,_SelectorSocketTransport._read_ready__on_eofc Cs6t|tttf�s$tdt|�j����|jr2td��|j dk rDtd��|sLdS|j rz|j t j krht �d�|j d7_ dS|j�sz|j�|�}Wnbttfk r�Ynbttfk r��YnJtk r�}z|�|d�WY�dSd}~XYnX||d�}|�s dS|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 progress�socket.send() raised exception.r�%Fatal write error on socket transport)r�bytesr�r�r�typer!r�r8r�r�r�!LOG_THRESHOLD_FOR_CONNLOST_WRITESr �warningr�r�rOrKrJrirjrhr�r�r�r�� _write_ready�extend�_maybe_pause_protocol)r&rGr�rerrr�writezs:      z_SelectorSocketTransport.writec Cs|jr dSz|j�|j�}Wn�ttfk r4Yn�ttfk rL�Yn�tk r�}z>|j � |j �|j� �|� |d�|jdk r�|j�|�W5d}~XYnnX|r�|jd|�=|��|j�s|j � |j �|jdk r�|j�d�|jr�|�d�n|j�r|j�tj�dS)Nr�)r�r�rOr�rKrJrirjrhr�r�r�r�r�r�r��_maybe_resume_protocolr�r�r�r��shutdownrB�SHUT_WR)r&r�rerrrr�s2       z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|j�tj�dSr�)r�r�r�r�rrBrr<rrr� write_eof�s  z"_SelectorSocketTransport.write_eofcCsdSr�rr<rrr� can_write_eof�sz&_SelectorSocketTransport.can_write_eofcs*t��|�|jdk r&|j�td��dS)NzConnection is closed by peer)rr�r�r��ConnectionErrorr�r'rrr��s   �z._SelectorSocketTransport._call_connection_lostcCs6|jdk rtd��|j��|_|js0|j�d�|jS)NzEmpty waiter is already set)r�r8r�rgr�r�r<rrrr��s    z+_SelectorSocketTransport._make_empty_waitercCs d|_dSr+)r�r<rrrr��sz,_SelectorSocketTransport._reset_empty_waiter)NNN)r!r�r�Z_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerr�r�r�r�r�r�r�r�rrrrr�r�r�r�rrr'rr,�s*� %' r,csFeZdZejZd �fdd� Zdd�Zdd�Zd dd �Z d d �Z �Z S)r5Ncs^t��||||�||_|j�|jj|�|j�|j|j|j �|dk rZ|j�t j |d�dSr+) rr�_addressr�r�r�r�rDr�r�rr�)r&r�rr-r6r.r)r'rrr�s � �z#_SelectorDatagramTransport.__init__cCstdd�|jD��S)Ncss|]\}}t|�VqdSr+)r�)�.0rGrbrrr� �szC_SelectorDatagramTransport.get_write_buffer_size..)�sumr�r<rrrr��sz0_SelectorDatagramTransport.get_write_buffer_sizec Cs�|jr dSz|j�|j�\}}Wn�ttfk r8Yn�tk rd}z|j�|�W5d}~XYnTt t fk r|�Yn<t k r�}z|� |d�W5d}~XYnX|j� ||�dS)Nz&Fatal read error on datagram transport)r�r�Zrecvfromr�rKrJrPr��error_receivedrirjrhr�Zdatagram_received�r&rGrdrerrrr��sz&_SelectorDatagramTransport._read_readyc Cs�t|tttf�s$tdt|�j����|s,dS|jrV|d|jfkrPtd|j����|j}|j r�|jr�|j t j krxt � d�|j d7_ dS|j�slz,|jdr�|j�|�n|j�||�WdSttfk r�|j�|j|j�Yn�tk �r}z|j�|�WY�dSd}~XYnPttfk �r6�Yn6tk �rj}z|�|d�WY�dSd}~XYnX|j� t|�|f�|�!�dS)Nr�z!Invalid address: must be None or r�rrZ�'Fatal write error on datagram transport)"rr�r�r�rr�r!r rnr�rr�r r�r�r�r�rO�sendtorKrJr�r�r�� _sendto_readyrPr�rrirjrhr�r�rrrrrr�sH �     �z!_SelectorDatagramTransport.sendtoc Cs|jr�|j��\}}z*|jdr.|j�|�n|j�||�Wqttfk rj|j�||f�Yq�Yqt k r�}z|j � |�WY�dSd}~XYqt t fk r��Yqtk r�}z|�|d�WY�dSd}~XYqXq|��|j�s|j�|j�|j�r|�d�dS)NrZr)r��popleftr�r�rOrrKrJ� appendleftrPr�rrirjrhr�rr�r�r�r�r�rrrrr*s2  �z(_SelectorDatagramTransport._sendto_ready)NNN)N) r!r�r�� collections�dequer�rr�r�rrr�rrr'rr5�s�  +r5)�__all__rr^r�rrBr�r$r� ImportError�rrrrrr r r �logr rrZ BaseEventLooprZ_FlowControlMixinZ Transportr�r,r5rrrr�sD            1�o