3 \·lã@s†dZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddddgZdZdZdZdZdZdZGdd„de jƒZGdd„de jƒZGdd„deƒZGdd„deƒZGdd „d e ƒZ!Gd!d"„d"e j"ƒZ#Gd#d„de j$ƒZ%Gd$d„dƒZ&Gd%d&„d&e j'ƒZ(e#Z)Gd'd(„d(ej*ƒZ+e+Z,dS))z.Selector and proactor event loops for Windows.éNé)Úevents)Úbase_subprocess)Úfutures)Úproactor_events)Úselector_events)Útasks)Ú windows_utils)Ú _overlapped)Ú coroutine)ÚloggerÚSelectorEventLoopÚProactorEventLoopÚ IocpProactorÚDefaultEventLoopPolicylÿÿiÉiÔgü©ñÒMbP?gš™™™™™¹?cs^eZdZdZddœ‡fdd„ Z‡fdd„Zdd „Z‡fd d „Z‡fd d „Z‡fdd„Z ‡Z S)Ú_OverlappedFuturez†Subclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. N)Úloopcs&tƒj|d�|jr|jd=||_dS)N)rréÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr)Ú __class__©ú./usr/lib64/python3.6/asyncio/windows_events.pyr-sz_OverlappedFuture.__init__cs@tƒjƒ}|jdk r<|jjr dnd}|jdd||jjfƒ|S)NÚpendingZ completedrzoverlapped=<%s, %#x>)rÚ _repr_inforrÚinsertÚaddress)rÚinfoÚstate)rrrr3s   z_OverlappedFuture._repr_infocCsr|jdkrdSy|jjƒWnJtk rf}z.d||dœ}|jrJ|j|d<|jj|ƒWYdd}~XnXd|_dS)Nz&Cancelling an overlapped future failed)ÚmessageÚ exceptionÚfutureÚsource_traceback)rÚcancelÚOSErrorrÚ_loopÚcall_exception_handler)rÚexcÚcontextrrrÚ_cancel_overlapped:s  z$_OverlappedFuture._cancel_overlappedcs|jƒtƒjƒS)N)r-rr')r)rrrr'Jsz_OverlappedFuture.cancelcstƒj|ƒ|jƒdS)N)rÚ set_exceptionr-)rr$)rrrr.Ns z_OverlappedFuture.set_exceptioncstƒj|ƒd|_dS)N)rÚ set_resultr)rÚresult)rrrr/Rs z_OverlappedFuture.set_result) Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr-r'r.r/Ú __classcell__rr)rrr's   rcsneZdZdZddœ‡fdd„ Zdd„Z‡fdd „Zd d „Zd d „Z‡fdd„Z ‡fdd„Z ‡fdd„Z ‡Z S)Ú_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.N)rcs8tƒj|d�|jr|jd=||_||_||_d|_dS)N)rrTr)rrrrÚ_handleÚ _wait_handleÚ _registered)rrÚhandleÚ wait_handler)rrrrZsz_BaseWaitHandleFuture.__init__cCstj|jdƒtjkS)Nr)Ú_winapiZWaitForSingleObjectr7Z WAIT_OBJECT_0)rrrrÚ_pollhs z_BaseWaitHandleFuture._pollcs\tƒjƒ}|jd|jƒ|jdk r>|jƒr0dnd}|j|ƒ|jdk rX|jd|jƒ|S)Nz handle=%#xZsignaledZwaitingzwait_handle=%#x)rrÚappendr7r=r8)rr!r")rrrrms    z _BaseWaitHandleFuture._repr_infocCs d|_dS)N)r)rÚfutrrrÚ_unregister_wait_cbwsz)_BaseWaitHandleFuture._unregister_wait_cbcCs”|js dSd|_|j}d|_ytj|ƒWnZtk r„}z>|jtjkrtd||dœ}|jrd|j|d<|jj |ƒdSWYdd}~XnX|j dƒdS)NFz$Failed to unregister the wait handle)r#r$r%r&) r9r8r ZUnregisterWaitr(ÚwinerrorÚERROR_IO_PENDINGrr)r*r@)rr;r+r,rrrÚ_unregister_wait|s"   z&_BaseWaitHandleFuture._unregister_waitcs|jƒtƒjƒS)N)rCrr')r)rrrr'”sz_BaseWaitHandleFuture.cancelcs|jƒtƒj|ƒdS)N)rCrr.)rr$)rrrr.˜sz#_BaseWaitHandleFuture.set_exceptioncs|jƒtƒj|ƒdS)N)rCrr/)rr0)rrrr/œsz _BaseWaitHandleFuture.set_result) r1r2r3r4rr=rr@rCr'r.r/r5rr)rrr6Ws   r6csFeZdZdZddœ‡fdd„ Zdd„Z‡fdd „Z‡fd d „Z‡ZS) Ú_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. N)rcstƒj||||d�d|_dS)N)r)rrÚ_done_callback)rrÚeventr;r)rrrr¦sz_WaitCancelFuture.__init__cCs tdƒ‚dS)Nz'_WaitCancelFuture must not be cancelled)Ú RuntimeError)rrrrr'«sz_WaitCancelFuture.cancelcs$tƒj|ƒ|jdk r |j|ƒdS)N)rr/rE)rr0)rrrr/®s  z_WaitCancelFuture.set_resultcs$tƒj|ƒ|jdk r |j|ƒdS)N)rr.rE)rr$)rrrr.³s  z_WaitCancelFuture.set_exception) r1r2r3r4rr'r/r.r5rr)rrrD¡s  rDcs6eZdZddœ‡fdd„ Z‡fdd„Zdd„Z‡ZS) Ú_WaitHandleFutureN)rcs<tƒj||||d�||_d|_tjddddƒ|_d|_dS)N)rTF)rrÚ _proactorZ_unregister_proactorr Z CreateEventÚ_eventÚ _event_fut)rrr:r;Úproactorr)rrrrºs z_WaitHandleFuture.__init__csF|jdk r"tj|jƒd|_d|_|jj|jƒd|_tƒj|ƒdS)N) rJr<Ú CloseHandlerKrIÚ _unregisterrrr@)rr?)rrrr@Ás   z%_WaitHandleFuture._unregister_wait_cbcCs¢|js dSd|_|j}d|_ytj||jƒWnZtk rˆ}z>|jtjkrxd||dœ}|jrh|j|d<|j j |ƒdSWYdd}~XnX|j j |j|j ƒ|_dS)NFz$Failed to unregister the wait handle)r#r$r%r&)r9r8r ZUnregisterWaitExrJr(rArBrr)r*rIÚ _wait_cancelr@rK)rr;r+r,rrrrCÓs$    z"_WaitHandleFuture._unregister_wait)r1r2r3rr@rCr5rr)rrrH¹s rHc@s<eZdZdZdd„Zdd„Zdd„Zdd „Zd d „ZeZ d S) Ú PipeServerzXClass representing a pipe server. This is much like a bound, listening socket. cCs,||_tjƒ|_d|_d|_|jdƒ|_dS)NT)Ú_addressÚweakrefÚWeakSetÚ_free_instancesÚ_pipeÚ_accept_pipe_futureÚ_server_pipe_handle)rr rrrròs  zPipeServer.__init__cCs|j|jdƒ}|_|S)NF)rUrW)rÚtmprrrÚ_get_unconnected_pipeüsz PipeServer._get_unconnected_pipec Csr|jƒr dStjtjB}|r&|tjO}tj|j|tjtjBtj Btj t j t j tj tjƒ}t j|ƒ}|jj|ƒ|S)N)Úclosedr<ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperQZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr ZBUFSIZEZNMPWAIT_WAIT_FOREVERÚNULLÚ PipeHandlerTÚadd)rÚfirstÚflagsÚhÚpiperrrrWs      zPipeServer._server_pipe_handlecCs |jdkS)N)rQ)rrrrrZszPipeServer.closedcCsV|jdk r|jjƒd|_|jdk rRx|jD] }|jƒq,Wd|_d|_|jjƒdS)N)rVr'rQrTÚcloserUÚclear)rrarrrrbs     zPipeServer.closeN) r1r2r3r4rrYrWrZrbÚ__del__rrrrrPís  rPc@seZdZdZdd„ZdS)Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.cCstjƒS)N)r Ú socketpair)rrrrÚ _socketpair+sz%_WindowsSelectorEventLoop._socketpairN)r1r2r3r4rgrrrrre(srecsPeZdZdZd ‡fdd„ Zdd„Zedd„ƒZed d „ƒZedd d „ƒZ ‡Z S)rz2Windows version of proactor event loop using IOCP.Ncs|dkrtƒ}tƒj|ƒdS)N)rrr)rrL)rrrr2szProactorEventLoop.__init__cCstjƒS)N)r rf)rrrrrg7szProactorEventLoop._socketpairccs8|jj|ƒ}|EdH}|ƒ}|j||d|id�}||fS)NÚaddr)Úextra)rIÚ connect_pipeÚ_make_duplex_pipe_transport)rÚprotocol_factoryr ÚfraÚprotocolÚtransrrrÚcreate_pipe_connection:s    z(ProactorEventLoop.create_pipe_connectioncs.tˆƒ‰d‡‡‡‡‡fdd„ ‰ˆjˆƒˆgS)Ncsd}yj|rL|jƒ}ˆjj|ƒˆjƒr2|jƒdSˆƒ}ˆj||dˆid�ˆjƒ}|dkr`dSˆjj|ƒ}Wn„t k rÒ}zH|r¬|j ƒd kr¬ˆj d||dœƒ|jƒnˆj rÂt jd|dd�WYdd}~Xn2tjk rò|rî|jƒYnX|ˆ_|jˆƒdS) Nrh)rirzPipe accept failed)r#r$razAccept pipe failed on pipe %rT)Úexc_infor)r0rTÚdiscardrZrbrkrYrIÚ accept_piper(Úfilenor*Z_debugr ZwarningrÚCancelledErrorrVÚadd_done_callback)rmrarnr+)r Úloop_accept_piperlrÚserverrrrwGs<   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rPZ call_soon)rrlr r)r rwrlrrxrÚstart_serving_pipeCs( z$ProactorEventLoop.start_serving_pipec ksŒ|jƒ} t||||||||f| |dœ| —Ž} y| EdHWn&tk r`} z | } WYdd} ~ XnXd} | dk rˆ| jƒ| jƒEdH| ‚| S)N)Úwaiterri)Ú create_futureÚ_WindowsSubprocessTransportÚ ExceptionrbZ_wait)rrnÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizeriÚkwargsrzZtranspr+ÚerrrrrÚ_make_subprocess_transportrs  z,ProactorEventLoop._make_subprocess_transport)N)N) r1r2r3r4rrgr rpryr†r5rr)rrr/s /c@sÐeZdZdZd1dd„Zdd„Zdd„Zd2d d „Zd d „Zd3dd„Z d4dd„Z dd„Z dd„Z dd„Z edd„ƒZd5dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd6d)d*„Zd+d,„Zd-d.„Zd/d0„Zd S)7rz#Proactor implementation using IOCP.ìÿÿcCsDd|_g|_tjtjtd|ƒ|_i|_tj ƒ|_ g|_ tj ƒ|_ dS)Nr) r)Ú_resultsr ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr[Ú_iocpÚ_cacherRrSr9Ú _unregisteredÚ_stopped_serving)rZ concurrencyrrrr�s zIocpProactor.__init__cCsd|jjt|jƒt|jƒfS)Nz<%s overlapped#=%s result#=%s>)rr1ÚlenrŒrˆ)rrrrÚ__repr__™szIocpProactor.__repr__cCs ||_dS)N)r))rrrrrÚset_loopžszIocpProactor.set_loopNcCs |js|j|ƒ|j}g|_|S)N)rˆr=)rÚtimeoutrXrrrÚselect¡s  zIocpProactor.selectcCs|jjƒ}|j|ƒ|S)N)r)r{r/)rÚvaluer?rrrÚ_result¨s  zIocpProactor._resultrc Csz|j|ƒtjtƒ}y4t|tjƒr6|j|jƒ||ƒn|j|jƒ|ƒWnt k rb|j dƒSXdd„}|j |||ƒS)NócSsJy|jƒStk rD}z |jtjkr2t|jŽ‚n‚WYdd}~XnXdS)N)Ú getresultr(rAr ÚERROR_NETNAME_DELETEDÚConnectionResetErrorr~)roÚkeyrr+rrrÚ finish_recv¸s   z&IocpProactor.recv..finish_recv) Ú_register_with_iocpr Ú Overlappedr[Ú isinstanceÚsocketZWSARecvrtZReadFileÚBrokenPipeErrorr•Ú _register)rÚconnÚnbytesr_rr›rrrÚrecv­s     zIocpProactor.recvcCsZ|j|ƒtjtƒ}t|tjƒr4|j|jƒ||ƒn|j|jƒ|ƒdd„}|j |||ƒS)NcSsJy|jƒStk rD}z |jtjkr2t|jŽ‚n‚WYdd}~XnXdS)N)r—r(rAr r˜r™r~)roršrr+rrrÚ finish_sendËs   z&IocpProactor.send..finish_send) rœr r�r[ržrŸZWSASendrtZ WriteFiler¡)rr¢Úbufr_rr¥rrrÚsendÃs    zIocpProactor.sendcsz|jˆƒ|jˆjƒ‰tjtƒ}|jˆjƒˆjƒƒ‡‡fdd„}tdd„ƒ}|j |ˆ|ƒ}||ˆƒ}t j ||j d�|S)NcsD|jƒtjdˆjƒƒ}ˆjtjtj|ƒˆj ˆj ƒƒˆˆj ƒfS)Nz@P) r—ÚstructZpackrtÚ setsockoptrŸÚ SOL_SOCKETr ZSO_UPDATE_ACCEPT_CONTEXTÚ settimeoutZ gettimeoutZ getpeername)roršrr¦)r¢ÚlistenerrrÚ finish_acceptÜs  z*IocpProactor.accept..finish_acceptc ss4y|EdHWn tjk r.|jƒ‚YnXdS)N)rrurb)r%r¢rrrÚ accept_coroås z(IocpProactor.accept..accept_coro)r) rœÚ_get_accept_socketÚfamilyr r�r[ZAcceptExrtr r¡rZ ensure_futurer))rr¬rr­r®r%Úcoror)r¢r¬rÚacceptÖs     zIocpProactor.acceptcs˜|jˆƒytjˆjƒˆjƒWnBtk rb}z&|jtjkr@‚ˆj ƒddkrR‚WYdd}~XnXtj t ƒ}|j ˆjƒ|ƒ‡fdd„}|j |ˆ|ƒS)Nrrcs|jƒˆjtjtjdƒˆS)Nr)r—r©rŸrªr ZSO_UPDATE_CONNECT_CONTEXT)roršr)r¢rrÚfinish_connects z,IocpProactor.connect..finish_connect)rœr Z BindLocalrtr°r(rAÚerrnoZ WSAEINVALZ getsocknamer�r[Z ConnectExr¡)rr¢r Úerr³r)r¢rÚconnectós    zIocpProactor.connectcsJ|jˆƒtjtƒ}|jˆjƒƒ}|r0|jˆƒS‡fdd„}|j|ˆ|ƒS)Ncs |jƒˆS)N)r—)roršr)rarrÚfinish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rœr r�r[ZConnectNamedPipertr•r¡)rrarZ connectedr·r)rarrs s    zIocpProactor.accept_pipeccszt}xjytj|ƒ}PWn0tk rF}z|jtjkr6‚WYdd}~XnXt|dtƒ}tj ||j d�EdHqWt j |ƒS)Né)r) ÚCONNECT_PIPE_INIT_DELAYr Z ConnectPiper(rAZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYrZsleepr)r r\)rr Zdelayr:r+rrrrjs  zIocpProactor.connect_pipecCs|j||dƒS)z°Wait 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)rr:r’rrrÚwait_for_handle/szIocpProactor.wait_for_handlecCs|j|ddƒ}||_|S)NT)r¼rE)rrFZ done_callbackr?rrrrO7szIocpProactor._wait_cancelcsš|dkrtj}ntj|dƒ}tjtƒ}tj||j|j |ƒ}|rTt ||||j d�‰nt |||||j d�‰ˆj rvˆj d=‡fdd„}ˆ|d|f|j|j <ˆS)Ng@�@)rrcsˆjƒS)N)r=)roršr)rmrrÚfinish_wait_for_handleRsz=IocpProactor._wait_for_handle..finish_wait_for_handlerr)r<ÚINFINITEÚmathÚceilr r�r[ZRegisterWaitWithQueuer‹r rDr)rHrrŒ)rr:r’Z _is_cancelÚmsrr;r¾r)rmrr¼>s    zIocpProactor._wait_for_handlecCs0||jkr,|jj|ƒtj|jƒ|jddƒdS)Nr)r9r]r r‰rtr‹)rÚobjrrrrœ^s  z IocpProactor._register_with_iocpcCs‚t||jd�}|jr|jd=|jsjy|dd|ƒ}Wn,tk r^}z|j|ƒWYdd}~Xn X|j|ƒ||||f|j|j<|S)N)rrr) rr)rrr(r.r/rŒr )rrrÃÚcallbackrmr”rµrrrr¡hs zIocpProactor._registercCs|jj|ƒdS)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>)rrrrrrN†szIocpProactor._unregistercCstj|ƒ}|jdƒ|S)Nr)rŸr«)rr°Úsrrrr¯�s  zIocpProactor._get_accept_socketcCsŒ|dkrt}n0|dkr tdƒ‚ntj|dƒ}|tkr>tdƒ‚�xtj|j|ƒ}|dkrZPd}|\}}}}y|jj|ƒ\}} } } WnVt k rØ|j j ƒrº|j j dd||||fdœƒ|dtj fkrÒtj|ƒwBYnX| |jkrî|jƒqB|jƒsBy| ||| ƒ} Wn:tk �r@} z|j| ƒ|jj|ƒWYdd} ~ XqBX|j| ƒ|jj|ƒqBWx |jD]} |jj| jdƒ�qdW|jjƒdS)Nrznegative timeoutg@�@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r#Ústatus)r¿Ú ValueErrorrÀrÁr ZGetQueuedCompletionStatusr‹rŒÚpopÚKeyErrorr)Z get_debugr*rŠr<rMrŽr'Údoner(r.rˆr>r/r�r rc)rr’rÂrÆr…Z transferredršr rmrrÃrÄr”rµrrrr=”sJ         zIocpProactor._pollcCs|jj|ƒdS)N)rŽr])rrÃrrrÚ _stop_servingËszIocpProactor._stop_servingcCsâxšt|jjƒƒD]ˆ\}\}}}}|jƒr*qt|tƒr6qy |jƒWqtk r–}z8|jdk r†d||dœ}|j rz|j |d<|jj |ƒWYdd}~XqXqWx|jrº|j dƒsžt j dƒqžWg|_|jdk rÞtj|jƒd|_dS)NzCancelling a future failed)r#r$r%r&rz"taking long time to close proactor)ÚlistrŒÚitemsZ cancelledržrDr'r(r)rr*r=r Údebugrˆr‹r<rM)rr r?rrÃrÄr+r,rrrrbÑs,     "   zIocpProactor.closecCs |jƒdS)N)rb)rrrrrdñszIocpProactor.__del__)r‡)N)r)r)N)N)r1r2r3r4rr�r‘r“r•r¤r§r²r¶rsr rjr½rOr¼rœr¡rNr¯r=rËrbrdrrrrrŒs.          7 c@seZdZdd„ZdS)r|c  sPtj|f|||||dœ|—Žˆ_‡fdd„}ˆjjjtˆjjƒƒ} | j|ƒdS)N)rr€r�r‚rƒcsˆjjƒ}ˆj|ƒdS)N)Ú_procZpollZ_process_exited)rmÚ returncode)rrrrÄüs z4_WindowsSubprocessTransport._start..callback) r ÚPopenrÏr)rIr½Úintr7rv) rr~rr€r�r‚rƒr„rÄrmr)rrÚ_start÷s   z"_WindowsSubprocessTransport._startN)r1r2r3rÓrrrrr|õsr|c@seZdZeZdS)Ú_WindowsDefaultEventLoopPolicyN)r1r2r3r Z _loop_factoryrrrrrÔsrÔ)-r4r<r´rÀrŸr¨rRÚrrrrrrr r Z coroutinesr Úlogr Ú__all__r[r¿ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr¹r»ZFuturerr6rDrHÚobjectrPZBaseSelectorEventLoopreZBaseProactorEventLooprrZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrÔrrrrrÚsL          0J4;]k