£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     fv                 @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
l
mZ ddlmZ dZdZdZdZdZdZdZG dd dejZG dd dejZG dd deZG dd deZG dd de Z!G dd dej"Z#G dd dej$Z%G d d! d!Z&G d"d# d#ej'Z(e#Z)G d$d% d%ej*Z+G d&d' d'ej*Z,e+Z-dS )(z.Selector and proactor event loops for Windows.    N   )events)base_subprocess)futures)proactor_events)selector_events)tasks)windows_utils)logger)SelectorEventLoopProactorEventLoopIocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicyl    i  i  gMbP?g?c                   s^   e Zd ZdZdd fdd
Z fddZdd	 Z fd
dZ fddZ fddZ	  Z
S )_OverlappedFuturezSubclass of Future which represents an overlapped operation.

    Cancelling it will immediately cancel the overlapped operation.
    N)loopc               s&   t  j|d | jr| jd= || _d S )N)r   )super__init___source_traceback_ov)selfovr   )	__class__ ;/opt/alt/python37/lib64/python3.7/asyncio/windows_events.pyr   0   s    z_OverlappedFuture.__init__c                sH   t   }| jd k	rD| jjr dnd}|dd| d| jjdd |S )NpendingZ	completedr   zoverlapped=<z, z#x>)r   
_repr_infor   r   insertaddress)r   infostate)r   r   r   r   6   s
    

 z_OverlappedFuture._repr_infoc          
   C   sr   | j d krd S y| j   W nJ tk
rf } z,d|| d}| jrJ| j|d< | j| W d d }~X Y nX d | _ d S )Nz&Cancelling an overlapped future failed)message	exceptionfuturesource_traceback)r   cancelOSErrorr   _loopcall_exception_handler)r   exccontextr   r   r   _cancel_overlapped=   s    

z$_OverlappedFuture._cancel_overlappedc                s   |    t  S )N)r.   r   r(   )r   )r   r   r   r(   M   s    z_OverlappedFuture.cancelc                s   t  | |   d S )N)r   set_exceptionr.   )r   r%   )r   r   r   r/   Q   s    z_OverlappedFuture.set_exceptionc                s   t  | d | _d S )N)r   
set_resultr   )r   result)r   r   r   r0   U   s    z_OverlappedFuture.set_result)__name__
__module____qualname____doc__r   r   r.   r(   r/   r0   __classcell__r   r   )r   r   r   *   s   r   c                   sn   e Zd ZdZdd fdd
Zdd Z fdd	Zd
d Zdd Z fddZ	 fddZ
 fddZ  ZS )_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.N)r   c               s8   t  j|d | jr| jd= || _|| _|| _d| _d S )N)r   r   T)r   r   r   r   _handle_wait_handle_registered)r   r   handlewait_handler   )r   r   r   r   ]   s    z_BaseWaitHandleFuture.__init__c             C   s   t | jdt jkS )Nr   )_winapiZWaitForSingleObjectr8   ZWAIT_OBJECT_0)r   r   r   r   _pollk   s    z_BaseWaitHandleFuture._pollc                sd   t   }|d| jd | jd k	rB|  r4dnd}|| | jd k	r`|d| jd |S )Nzhandle=z#xZsignaledZwaitingzwait_handle=)r   r   appendr8   r>   r9   )r   r"   r#   )r   r   r   r   p   s    



z _BaseWaitHandleFuture._repr_infoc             C   s
   d | _ d S )N)r   )r   futr   r   r   _unregister_wait_cbz   s    z)_BaseWaitHandleFuture._unregister_wait_cbc          
   C   s   | j s
d S d| _ | j}d | _yt| W nZ tk
r } z<|jtjkrtd|| d}| jrd| j|d< | j	| d S W d d }~X Y nX | 
d  d S )NFz$Failed to unregister the wait handle)r$   r%   r&   r'   )r:   r9   _overlappedZUnregisterWaitr)   winerrorERROR_IO_PENDINGr   r*   r+   rA   )r   r<   r,   r-   r   r   r   _unregister_wait   s"    
z&_BaseWaitHandleFuture._unregister_waitc                s   |    t  S )N)rE   r   r(   )r   )r   r   r   r(      s    z_BaseWaitHandleFuture.cancelc                s   |    t | d S )N)rE   r   r/   )r   r%   )r   r   r   r/      s    z#_BaseWaitHandleFuture.set_exceptionc                s   |    t | d S )N)rE   r   r0   )r   r1   )r   r   r   r0      s    z _BaseWaitHandleFuture.set_result)r2   r3   r4   r5   r   r>   r   rA   rE   r(   r/   r0   r6   r   r   )r   r   r7   Z   s   
r7   c                   sF   e Zd ZdZdd fdd
Zdd Z fdd	Z fd
dZ  ZS )_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a
    _WaitHandleFuture using an event.
    N)r   c               s   t  j||||d d | _d S )N)r   )r   r   _done_callback)r   r   eventr<   r   )r   r   r   r      s    z_WaitCancelFuture.__init__c             C   s   t dd S )Nz'_WaitCancelFuture must not be cancelled)RuntimeError)r   r   r   r   r(      s    z_WaitCancelFuture.cancelc                s$   t  | | jd k	r | |  d S )N)r   r0   rG   )r   r1   )r   r   r   r0      s    
z_WaitCancelFuture.set_resultc                s$   t  | | jd k	r | |  d S )N)r   r/   rG   )r   r%   )r   r   r   r/      s    
z_WaitCancelFuture.set_exception)	r2   r3   r4   r5   r   r(   r0   r/   r6   r   r   )r   r   rF      s
   rF   c                   s6   e Zd Zdd fdd
Z fddZdd Z  ZS )	_WaitHandleFutureN)r   c               s<   t  j||||d || _d| _td ddd | _d | _d S )N)r   TF)r   r   	_proactorZ_unregister_proactorrB   ZCreateEvent_event
_event_fut)r   r   r;   r<   proactorr   )r   r   r   r      s
    z_WaitHandleFuture.__init__c                sF   | j d k	r"t| j  d | _ d | _| j| j d | _t | d S )N)	rL   r=   CloseHandlerM   rK   _unregisterr   r   rA   )r   r@   )r   r   r   rA      s    
	z%_WaitHandleFuture._unregister_wait_cbc          
   C   s   | j s
d S d| _ | j}d | _yt|| j W nZ tk
r } z<|jtjkrxd|| d}| jrh| j|d< | j	
| d S W d d }~X Y nX | j| j| j| _d S )NFz$Failed to unregister the wait handle)r$   r%   r&   r'   )r:   r9   rB   ZUnregisterWaitExrL   r)   rC   rD   r   r*   r+   rK   _wait_cancelrA   rM   )r   r<   r,   r-   r   r   r   rE      s$    

z"_WaitHandleFuture._unregister_wait)r2   r3   r4   r   rA   rE   r6   r   r   )r   r   rJ      s   rJ   c               @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZeZ	dS )
PipeServerzXClass representing a pipe server.

    This is much like a bound, listening socket.
    c             C   s,   || _ t | _d | _d | _| d| _d S )NT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)r   r!   r   r   r   r      s
    
zPipeServer.__init__c             C   s   | j | d }| _ |S )NF)rW   rY   )r   tmpr   r   r   _get_unconnected_pipe   s    z PipeServer._get_unconnected_pipec          
   C   sr   |   rd S tjtjB }|r&|tjO }t| j|tjtjB tj	B tj
tjtjtjtj}t|}| j| |S )N)closedr=   ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperS   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr	   ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL
PipeHandlerV   add)r   firstflagshpiper   r   r   rY     s    


zPipeServer._server_pipe_handlec             C   s
   | j d kS )N)rS   )r   r   r   r   r\     s    zPipeServer.closedc             C   sV   | j d k	r| j   d | _ | jd k	rRx| jD ]}|  q,W d | _d | _| j  d S )N)rX   r(   rS   rV   closerW   clear)r   rc   r   r   r   rd     s    


zPipeServer.closeN)
r2   r3   r4   r5   r   r[   rY   r\   rd   __del__r   r   r   r   rR      s   
rR   c               @   s   e Zd ZdZdS )_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r2   r3   r4   r5   r   r   r   r   rg   +  s   rg   c                   s<   e Zd ZdZd fdd	Zdd Zdd Zdd	d
Z  ZS )r   z2Windows version of proactor event loop using IOCP.Nc                s   |d krt  }t | d S )N)r   r   r   )r   rN   )r   r   r   r   2  s    zProactorEventLoop.__init__c                s8   | j |}|I d H }| }| j||d|id}||fS )Naddr)extra)rK   connect_pipe_make_duplex_pipe_transport)r   protocol_factoryr!   frc   protocoltransr   r   r   create_pipe_connection7  s    
z(ProactorEventLoop.create_pipe_connectionc                s.   t  d fdd	 gS )Nc          
      s  d }yj| rL|   }j|  r2|  d S  }j||d id  }|d kr`d S j|} W n t	k
r } zF|r|
 dkrd||d |  njrtjd|dd W d d }~X Y n2 tjk
r   |r|  Y nX | _|  d S )	Nrh   )ri   r   zPipe accept failed)r$   r%   rc   zAccept pipe failed on pipe %rT)exc_info)r1   rV   discardr\   rd   rk   r[   rK   accept_piper)   filenor+   Z_debugr
   Zwarningr   CancelledErrorrX   add_done_callback)rm   rc   rn   r,   )r!   loop_accept_piperl   r   serverr   r   rw   B  s<    

z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)rR   Z	call_soon)r   rl   r!   r   )r!   rw   rl   r   rx   r   start_serving_pipe?  s    (
z$ProactorEventLoop.start_serving_pipec	          	      sl   |   }
t| |||||||f|
|d|	}y|
I d H  W n, tk
rf   |  | I d H   Y nX |S )N)waiterri   )create_future_WindowsSubprocessTransport	Exceptionrd   Z_wait)r   rn   argsshellstdinstdoutstderrbufsizeri   kwargsrz   Ztranspr   r   r   _make_subprocess_transportm  s    

z,ProactorEventLoop._make_subprocess_transport)N)N)	r2   r3   r4   r5   r   rp   ry   r   r6   r   r   )r   r   r   /  s
   0r   c               @   s   e Zd ZdZd7ddZdd Zdd Zd	d
 Zd8ddZdd Z	d9ddZ
d:ddZd;ddZdd Zdd Zdd Zdd Zdd  Zd<d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd=d/d0Zd1d2 Zd3d4 Zd5d6 ZdS )>r   z#Proactor implementation using IOCP.    c             C   sD   d | _ g | _ttjtd|| _i | _t	 | _
g | _t	 | _d S )Nr   )r*   _resultsrB   CreateIoCompletionPortINVALID_HANDLE_VALUEr]   _iocp_cacherT   rU   r:   _unregistered_stopped_serving)r   Zconcurrencyr   r   r   r     s    
zIocpProactor.__init__c             C   s   | j d krtdd S )NzIocpProactor is closed)r   rI   )r   r   r   r   _check_closed  s    
zIocpProactor._check_closedc             C   sF   dt | j dt | j g}| jd kr0|d d| jjd|f S )Nzoverlapped#=%sz
result#=%sr\   z<%s %s> )lenr   r   r   r?   r   r2   join)r   r"   r   r   r   __repr__  s
    

zIocpProactor.__repr__c             C   s
   || _ d S )N)r*   )r   r   r   r   r   set_loop  s    zIocpProactor.set_loopNc             C   s    | j s| | | j }g | _ |S )N)r   r>   )r   timeoutrZ   r   r   r   select  s
    
zIocpProactor.selectc             C   s   | j  }|| |S )N)r*   r{   r0   )r   valuer@   r   r   r   _result  s    

zIocpProactor._resultr   c             C   sz   |  | tt}y4t|tjr6|| || n|| | W n t	k
rb   | 
dS X dd }| |||S )N    c          
   S   sP   y|  S  tk
rJ } z$|jtjtjfkr8t|j n W d d }~X Y nX d S )N)	getresultr)   rC   rB   ERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorr~   )ro   keyr   r,   r   r   r   finish_recv  s    
z&IocpProactor.recv.<locals>.finish_recv)_register_with_iocprB   
Overlappedr]   
isinstancesocketZWSARecvrt   ZReadFileBrokenPipeErrorr   	_register)r   connnbytesra   r   r   r   r   r   recv  s    


zIocpProactor.recvc             C   sz   |  | tt}y4t|tjr6|| || n|| | W n t	k
rb   | 
dS X dd }| |||S )Nr   c          
   S   sP   y|  S  tk
rJ } z$|jtjtjfkr8t|j n W d d }~X Y nX d S )N)r   r)   rC   rB   r   r   r   r~   )ro   r   r   r,   r   r   r   r     s    
z+IocpProactor.recv_into.<locals>.finish_recv)r   rB   r   r]   r   r   ZWSARecvIntort   ZReadFileIntor   r   r   )r   r   bufra   r   r   r   r   r   	recv_into  s    


zIocpProactor.recv_intoc             C   sZ   |  | tt}t|tjr4|| || n|| | dd }| 	|||S )Nc          
   S   sP   y|  S  tk
rJ } z$|jtjtjfkr8t|j n W d d }~X Y nX d S )N)r   r)   rC   rB   r   r   r   r~   )ro   r   r   r,   r   r   r   finish_send  s    
z&IocpProactor.send.<locals>.finish_send)
r   rB   r   r]   r   r   ZWSASendrt   Z	WriteFiler   )r   r   r   ra   r   r   r   r   r   send  s    


zIocpProactor.sendc                sv   |   | j tt}|     fdd}dd }| ||}|| }t	j
|| jd |S )Nc                sD   |   td } tjtj|  	
     fS )Nz@P)r   structZpackrt   
setsockoptr   
SOL_SOCKETrB   ZSO_UPDATE_ACCEPT_CONTEXT
settimeoutZ
gettimeoutZgetpeername)ro   r   r   r   )r   listenerr   r   finish_accept  s    
z*IocpProactor.accept.<locals>.finish_acceptc                s4   y| I d H  W n  t jk
r.   |   Y nX d S )N)r   ru   rd   )r&   r   r   r   r   accept_coro  s
    z(IocpProactor.accept.<locals>.accept_coro)r   )r   _get_accept_socketfamilyrB   r   r]   ZAcceptExrt   r   r   Zensure_futurer*   )r   r   r   r   r   r&   coror   )r   r   r   accept  s    

	
zIocpProactor.acceptc          
      s   |    yt   j W nB tk
rb } z$|jtjkr@  	 d dkrR W d d }~X Y nX t
t}|  |  fdd}| | |S )Nr   r   c                s   |    tjtjd  S )Nr   )r   r   r   r   rB   ZSO_UPDATE_CONNECT_CONTEXT)ro   r   r   )r   r   r   finish_connect  s    
z,IocpProactor.connect.<locals>.finish_connect)r   rB   Z	BindLocalrt   r   r)   rC   errnoZ	WSAEINVALZgetsocknamer   r]   Z	ConnectExr   )r   r   r!   er   r   r   )r   r   connect  s    

zIocpProactor.connectc       	   	   C   sb   |  | tt}|d@ }|d? d@ }|| t| |||dd dd }| |||S )Nl        r   c          
   S   sP   y|  S  tk
rJ } z$|jtjtjfkr8t|j n W d d }~X Y nX d S )N)r   r)   rC   rB   r   r   r   r~   )ro   r   r   r,   r   r   r   finish_sendfile%  s    
z.IocpProactor.sendfile.<locals>.finish_sendfile)	r   rB   r   r]   ZTransmitFilert   msvcrtZget_osfhandler   )	r   Zsockfileoffsetcountr   Z
offset_lowZoffset_highr   r   r   r   sendfile  s    



	zIocpProactor.sendfilec                sJ   |    tt}|  }|r0|  S  fdd}| | |S )Nc                s   |    S )N)r   )ro   r   r   )rc   r   r   finish_accept_pipe;  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)r   rB   r   r]   ZConnectNamedPipert   r   r   )r   rc   r   Z	connectedr   r   )rc   r   rs   0  s    


zIocpProactor.accept_pipec          
      sz   t }xjyt|}P W n0 tk
rF } z|jtjkr6 W d d }~X Y nX t|d t}tj	|| j
dI d H  qW t|S )N   )r   )CONNECT_PIPE_INIT_DELAYrB   ZConnectPiper)   rC   ZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr   Zsleepr*   r	   r^   )r   r!   Zdelayr;   r,   r   r   r   rj   A  s    
zIocpProactor.connect_pipec             C   s   |  ||dS )zWait for a handle.

        Return a Future object. The result of the future is True if the wait
        completed, or False if the wait did not complete (on timeout).
        F)_wait_for_handle)r   r;   r   r   r   r   wait_for_handleT  s    zIocpProactor.wait_for_handlec             C   s   |  |d d}||_|S )NT)r   rG   )r   rH   Zdone_callbackr@   r   r   r   rQ   \  s    zIocpProactor._wait_cancelc                s   |    |d krtj}nt|d }tt}t|| j	|j
|}|r\t|||| jd nt|||| | jd  jr~ jd=  fdd} |d|f| j|j
<  S )Ng     @@)r   r   c                s      S )N)r>   )ro   r   r   )rm   r   r   finish_wait_for_handley  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )r   r=   INFINITEmathceilrB   r   r]   ZRegisterWaitWithQueuer   r!   rF   r*   rJ   r   r   )r   r;   r   Z
_is_cancelmsr   r<   r   r   )rm   r   r   c  s     


	zIocpProactor._wait_for_handlec             C   s0   || j kr,| j | t| | jdd d S )Nr   )r:   r_   rB   r   rt   r   )r   objr   r   r   r     s    
z IocpProactor._register_with_iocpc          
   C   s   |    t|| jd}|jr$|jd= |jsry|d d |}W n, tk
rf } z|| W d d }~X Y nX || ||||f| j|j	< |S )N)r   r   )
r   r   r*   r   r   r)   r/   r0   r   r!   )r   r   r   callbackrm   r   r   r   r   r   r     s    

zIocpProactor._registerc             C   s   |    | j| dS )a  Unregister an overlapped object.

        Call this method when its future has been cancelled. The event can
        already be signalled (pending in the proactor event queue). It is also
        safe if the event is never signalled (because it was cancelled).
        N)r   r   r?   )r   r   r   r   r   rP     s    zIocpProactor._unregisterc             C   s   t  |}|d |S )Nr   )r   r   )r   r   sr   r   r   r     s    

zIocpProactor._get_accept_socketc             C   s  |d krt }n0|dk r tdnt|d }|t kr>tdxt| j|}|d krZP d}|\}}}}y| j|\}}	}
}W nV t	k
r   | j
 r| j
dd||||f d |dtjfkrt| wBY nX |
| jkr|  qB| sBy||||	}W n: tk
r@ } z|| | j| W d d }~X Y qBX || | j| qBW x | jD ]}	| j|	jd  qdW | j  d S )Nr   znegative timeoutg     @@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r$   status)r   
ValueErrorr   r   rB   ZGetQueuedCompletionStatusr   r   popKeyErrorr*   Z	get_debugr+   r   r=   rO   r   r(   Zdoner)   r/   r   r?   r0   r   r!   re   )r   r   r   r   errZtransferredr   r!   rm   r   r   r   r   r   r   r   r   r>     sJ    






zIocpProactor._pollc             C   s   | j | d S )N)r   r_   )r   r   r   r   r   _stop_serving  s    zIocpProactor._stop_servingc             C   s   | j d krd S xt| j D ]\}\}}}}| r8qt|trDqy|  W q tk
r } z6| j	d k	rd||d}|j
r|j
|d< | j	| W d d }~X Y qX qW d}t }	|	| }
xD| jr|
t krtd| t |	  t | }
| | qW g | _t| j  d | _ d S )NzCancelling a future failed)r$   r%   r&   r'   g      ?z,%r is running after closing for %.1f seconds)r   listr   itemsZ	cancelledr   rF   r(   r)   r*   r   r+   timeZ	monotonicr
   debugr>   r   r=   rO   )r   r!   r@   r   r   r   r,   r-   Z
msg_updateZ
start_timeZnext_msgr   r   r   rd     s:    
 


"
zIocpProactor.closec             C   s   |    d S )N)rd   )r   r   r   r   rf   *  s    zIocpProactor.__del__)r   )N)r   )r   )r   )N)N)r2   r3   r4   r5   r   r   r   r   r   r   r   r   r   r   r   r   rs   rj   r   rQ   r   r   r   rP   r   r>   r   rd   rf   r   r   r   r   r     s4   






"
 

7/r   c               @   s   e Zd Zdd ZdS )r|   c       
         sP   t j|f|||||d| _ fdd} jjt jj}	|	| d S )N)r   r   r   r   r   c                s    j  } | d S )N)_procZpollZ_process_exited)rm   
returncode)r   r   r   r   5  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r	   Popenr   r*   rK   r   intr8   rv   )
r   r~   r   r   r   r   r   r   r   rm   r   )r   r   _start0  s    z"_WindowsSubprocessTransport._startN)r2   r3   r4   r   r   r   r   r   r|   .  s   r|   c               @   s   e Zd ZeZdS )r   N)r2   r3   r4   r   _loop_factoryr   r   r   r   r   @  s   r   c               @   s   e Zd ZeZdS )r   N)r2   r3   r4   r   r   r   r   r   r   r   D  s   r   ).r5   rB   r=   r   r   r   r   r   r   rT    r   r   r   r   r   r   r	   logr
   __all__r]   r   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr   r   ZFuturer   r7   rF   rJ   objectrR   ZBaseSelectorEventLooprg   ZBaseProactorEventLoopr   r   ZBaseSubprocessTransportr|   r   ZBaseDefaultEventLoopPolicyr   r   r   r   r   r   r   <module>   sP   0J4;P   2