òÕYf.lã@sdZddlZddlZddlZddlZddlZddlZddlmZddlm 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 ‡S)Ú_OverlappedFuturez†Subclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. ÚloopNcs3tƒjd|ƒ|jr&|jd=||_dS)Nrréÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr)Ú __class__©ú;/opt/alt/python35/lib64/python3.5/asyncio/windows_events.pyr-s  z_OverlappedFuture.__init__csZtƒjƒ}|jdk rV|jjr0dnd}|jdd||jjfƒ|S)NÚpendingZ completedrzoverlapped=<%s, %#x>)rÚ _repr_inforrÚinsertÚaddress)rÚinfoÚstate)rrrr3s  z_OverlappedFuture._repr_infocCs—|jdkrdSy|jjƒWnctk r‰}zCddd|d|i}|jrg|j|d<|jj|ƒWYdd}~XnXd|_dS)NÚmessagez&Cancelling an overlapped future failedÚ 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'Js z_OverlappedFuture.cancelcstƒj|ƒ|jƒdS)N)rÚ set_exceptionr-)rr$)rrrr.Nsz_OverlappedFuture.set_exceptioncstƒj|ƒd|_dS)N)rÚ set_resultr)rÚresult)rrrr/Rsz_OverlappedFuture.set_result) Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr-r'r.r/rr)rrr's  rcsšeZdZdZdd‡fdd†Zdd„Z‡fdd †Zd d „Zd d „Z‡fdd†Z ‡fdd†Z ‡fdd†Z ‡S)Ú_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.rNcsNtƒjd|ƒ|jr&|jd=||_||_||_d|_dS)NrrTr)rrrrÚ_handleÚ _wait_handleÚ _registered)rrÚhandleÚ wait_handler)rrrrZs     z_BaseWaitHandleFuture.__init__cCstj|jdƒtjkS)Nr)Ú_winapiZWaitForSingleObjectr6Z WAIT_OBJECT_0)rrrrÚ_pollhsz_BaseWaitHandleFuture._pollcs~tƒjƒ}|jd|jƒ|jdk rW|jƒrDdnd}|j|ƒ|jdk rz|jd|jƒ|S)Nz handle=%#xZsignaledZwaitingzwait_handle=%#x)rrÚappendr6r<r7)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|ƒWnytk r´}zY|jtjkr¢ddd|d|i}|jrŽ|j|d<|jj |ƒdSWYdd}~XnX|j dƒdS)NFr#z$Failed to unregister the wait handler$r%r&) r8r7r ZUnregisterWaitr(ÚwinerrorÚERROR_IO_PENDINGrr)r*r?)rr:r+r,rrrÚ_unregister_wait|s"       z&_BaseWaitHandleFuture._unregister_waitcs|jƒtƒjƒS)N)rBrr')r)rrrr'”s z_BaseWaitHandleFuture.cancelcs|jƒtƒj|ƒdS)N)rBrr.)rr$)rrrr.˜s z#_BaseWaitHandleFuture.set_exceptioncs|jƒtƒj|ƒdS)N)rBrr/)rr0)rrrr/œs z _BaseWaitHandleFuture.set_result) r1r2r3r4rr<rr?rBr'r.r/rr)rrr5Ws    r5csLeZdZdZdd‡fdd†Zdd„Z‡fdd †Z‡S) Ú_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. rNcs)tƒj|||d|ƒd|_dS)Nr)rrÚ_done_callback)rrÚeventr:r)rrrr¦sz_WaitCancelFuture.__init__cCstdƒ‚dS)Nz'_WaitCancelFuture must not be cancelled)Ú RuntimeError)rrrrr'«sz_WaitCancelFuture.cancelcs3tt|ƒjƒ|jdk r/|j|ƒdS)N)rrCÚ_schedule_callbacksrD)r)rrrrG®sz%_WaitCancelFuture._schedule_callbacks)r1r2r3r4rr'rGrr)rrrC¡s  rCcsFeZdZdd‡fdd†Z‡fdd†Zdd„Z‡S) Ú_WaitHandleFuturerNcsVtƒj|||d|ƒ||_d|_tjddddƒ|_d|_dS)NrTF)rrÚ _proactorZ_unregister_proactorr Z CreateEventÚ_eventÚ _event_fut)rrr9r:Úproactorr)rrrrµs   z_WaitHandleFuture.__init__csa|jdk r1tj|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ƒWnytk rº}zY|jtjkr¨ddd|d|i}|jr”|j|d<|j j |ƒdSWYdd}~XnX|j j |j|j ƒ|_dS)NFr#z$Failed to unregister the wait handler$r%r&)r8r7r ZUnregisterWaitExrJr(r@rArr)r*rIÚ _wait_cancelr?rK)rr:r+r,rrrrBÎs$       z"_WaitHandleFuture._unregister_wait)r1r2r3rr?rBrr)rrrH´s rHc@sXeZdZdZdd„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 Cs�|jƒrdStjtjB}|r3|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ÚpiperrrrWÿs     zPipeServer._server_pipe_handlecCs |jdkS)N)rQ)rrrrrZszPipeServer.closedcCsu|jdk r%|jjƒd|_|jdk rqx|jD]}|jƒq>Wd|_d|_|jjƒdS)N)rVr'rQrTÚcloserUÚclear)rrarrrrbs    zPipeServer.closeN) r1r2r3r4rrYrWrZrbÚ__del__rrrrrPès     rPc@s"eZdZdZdd„ZdS)Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.cCs tjƒS)N)r Ú socketpair)rrrrÚ _socketpair&sz%_WindowsSelectorEventLoop._socketpairN)r1r2r3r4rgrrrrre#s recspeZdZdZd‡fdd†Zdd„Zedd„ƒZed d „ƒZedd d „ƒZ ‡S) rz2Windows version of proactor event loop using IOCP.Ncs)|dkrtƒ}tƒj|ƒdS)N)rrr)rrL)rrrr-s  zProactorEventLoop.__init__cCs tjƒS)N)r rf)rrrrrg2szProactorEventLoop._socketpairccsN|jj|ƒ}|EdH}|ƒ}|j||dd|iƒ}||fS)NÚextraÚaddr)rIÚ connect_pipeÚ_make_duplex_pipe_transport)rÚprotocol_factoryr ÚfraÚprotocolÚtransrrrÚcreate_pipe_connection5s   z(ProactorEventLoop.create_pipe_connectioncsAtˆƒ‰d‡‡‡‡‡fdd†‰ˆjˆƒˆgS)Ncsbd}y“|rj|jƒ}ˆjj|ƒˆjƒrE|jƒdSˆƒ}ˆj||ddˆiƒˆjƒ}|dkr†dSˆjj|ƒ}Wn¬t k r#}zh|rò|j ƒd kròˆj ddd|d|iƒ|jƒnˆj rt jd|d d ƒWYdd}~Xn;tjk rG|rC|jƒYnX|ˆ_|jˆƒdS) Nrhrirr#zPipe accept failedr$razAccept pipe failed on pipe %rÚexc_infoTr)r0rTÚdiscardrZrbrkrYrIÚ accept_piper(Úfilenor*Z_debugr ZwarningrÚCancelledErrorrVÚadd_done_callback)rmrarnr+)r Úloop_accept_piperlrÚserverrrrwBs<           z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)rPZ call_soon)rrlr r)r rwrlrrxrÚstart_serving_pipe>s !( z$ProactorEventLoop.start_serving_pipec ks¬|jƒ} t||||||||d| d|| �} y | EdHWn+tk rv} z | } WYdd} ~ XnXd} | dk r¨| jƒ| jƒEdH| ‚| S)NÚwaiterrh)Ú create_futureÚ_WindowsSubprocessTransportÚ ExceptionrbZ_wait)rrnÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizerhÚkwargsrzZtranspr+ÚerrrrrÚ_make_subprocess_transportms      z,ProactorEventLoop._make_subprocess_transport) r1r2r3r4rrgr rpryr†rr)rrr*s   /c@s6eZdZdZddd„Zdd„Zdd„Zd d d „Zd d „Zddd„Z ddd„Z dd„Z dd„Z dd„Z edd„ƒZd dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd d)d*„Zd+d,„Zd-d.„Zd/d0„Zd S)1rz#Proactor implementation using IOCP.lÿÿcCsdd|_g|_tjtjtd|ƒ|_i|_tj ƒ|_ g|_ tj ƒ|_ dS)Nr) r)Ú_resultsr ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr[Ú_iocpÚ_cacherRrSr8Ú _unregisteredÚ_stopped_serving)rZ concurrencyrrrrŠs    zIocpProactor.__init__cCs)d|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 Cs¥|j|ƒtjtƒ}yHt|tjƒrM|j|jƒ||ƒn|j|jƒ|ƒWnt k r…|j dƒSYnXdd„}|j |||ƒS)NócSsay|jƒSWnLtk r\}z,|jtjkrGt|jŒ‚n‚WYdd}~XnXdS)N)Ú getresultr(r@r Ú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.recvcCs|j|ƒtjtƒ}t|tjƒrJ|j|jƒ||ƒn|j|jƒ|ƒdd„}|j |||ƒS)NcSsay|jƒSWnLtk r\}z,|jtjkrGt|jŒ‚n‚WYdd}~XnXdS)N)r–r(r@r 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.sendcs¯|jˆƒ|jˆjƒ‰tjtƒ}|jˆjƒˆjƒƒ‡‡fdd†}tdd„ƒ}|j |ˆ|ƒ}||ˆƒ}t j |d|j ƒ|S)Ncs^|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 ss6y |EdHWn"tjk r1|jƒ‚YnXdS)N)rrurb)r%r¡rrrÚ accept_coroàs   z(IocpProactor.accept..accept_coror) 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ƒWnStk r}z3|jtjkrT‚ˆj ƒddkrm‚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_connectüs   z,IocpProactor.connect..finish_connect)r›r Z BindLocalrtr¯r(r@ÚerrnoZ WSAEINVALZ getsocknamerœr[Z ConnectExr )rr¡r Úerr²r)r¡rÚconnectîs zIocpProactor.connectcsi|jˆƒtjtƒ}|jˆjƒƒ}|rD|jˆƒS‡fdd†}|j|ˆ|ƒS)Ncs|jƒˆS)N)r–)ror™r)rarrÚfinish_accept_pipes z4IocpProactor.accept_pipe..finish_accept_pipe)r›r rœr[ZConnectNamedPipertr”r )rrarZ connectedr¶r)rarrss  zIocpProactor.accept_pipeccs™t}xƒytj|ƒ}PWn:tk rY}z|jtjkrG‚WYdd}~XnXt|dtƒ}tj |d|j ƒEdHq Wt j |ƒS)Nér) ÚCONNECT_PIPE_INIT_DELAYr Z ConnectPiper(r@ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYrZsleepr)r r\)rr Zdelayr9r+rrrrjszIocpProactor.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)rr9r‘rrrÚwait_for_handle*szIocpProactor.wait_for_handlecCs"|j|ddƒ}||_|S)NT)r»rD)rrEZ done_callbackr>rrrrO2s zIocpProactor._wait_cancelcsß|dkrtj}ntj|dƒ}tjtƒ}tj||j|j |ƒ}|r|t |||d|j ƒ‰nt ||||d|j ƒ‰ˆj r­ˆj d=‡fdd†}ˆ|d|f|j|j <ˆS)Ng@�@rrcs ˆjƒS)N)r<)ror™r)rmrrÚfinish_wait_for_handleMsz=IocpProactor._wait_for_handle..finish_wait_for_handlerr)r;ÚINFINITEÚmathÚceilr rœr[ZRegisterWaitWithQueuerŠr rCr)rHrr‹)rr9r‘Z _is_cancelÚmsrr:r½r)rmrr»9s      zIocpProactor._wait_for_handlecCsB||jkr>|jj|ƒtj|jƒ|jddƒdS)Nr)r8r]r rˆrtrŠ)rÚobjrrrr›Ysz IocpProactor._register_with_iocpcCs©t|d|jƒ}|jr(|jd=|js‰y|dd|ƒ}Wn2tk r{}z|j|ƒWYdd}~XnX|j|ƒ||||f|j|j<|S)Nrrr) rr)rrr(r.r/r‹r )rrrÂÚcallbackrmr“r´rrrr cs     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._unregistercCs tj|ƒ}|jdƒ|S)Nr)ržrª)rr¯Úsrrrr®Šs zIocpProactor._get_accept_socketcCs|dkrt}nF|dkr0tdƒ‚n+tj|dƒ}|tkr[tdƒ‚xutj|j|ƒ}|dkr€Pd}|\}}}}y"|jj|ƒ\}} } } Wnrt k r.|j j ƒr|j j dddd||||fiƒ|dtj fkr'tj|ƒw^YnX| |jkrK|jƒq^|jƒs^y| ||| ƒ} WnBtk r±} z"|j| ƒ|jj|ƒWYdd} ~ Xq^X|j| ƒ|jj|ƒq^Wx'|jD]} |jj| jdƒqÝW|jjƒdS) Nrznegative timeoutg@�@ztimeout too bigr#z8GetQueuedCompletionStatus() returned an unexpected eventÚstatusz)err=%s transferred=%s key=%#x address=%#x)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_servingcCs7xÓt|jjƒƒD]¼\}\}}}}|jƒr=qt|tƒrOqy|jƒWqtk rÑ}zR|jdk r¿ddd|d|i}|j r¯|j |d<|jj |ƒWYdd}~XqXqWx)|jr|j dƒsÙt j dƒqÙWg|_|jdk r3tj|jƒd|_dS)Nr#zCancelling a future failedr$r%r&rz"taking long time to close proactor)Úlistr‹ÚitemsZ cancelledr�rCr'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__)r1r2r3r4rr�r�r’r”r£r¦r±rµrsr rjr¼rOr»r›r rNr®r<rÊrbrdrrrrr‡s.          7  c@seZdZdd„ZdS)r|c swtj|d|d|d|d|d||�ˆ_‡fdd†}ˆjjjtˆjjƒƒ} | j|ƒdS)Nrr€r�r‚rƒcs ˆjjƒ}ˆj|ƒdS)N)Ú_procZpollZ_process_exited)rmÚ returncode)rrrrÃ÷sz4_WindowsSubprocessTransport._start..callback) r ÚPopenrÎr)rIr¼Úintr6rv) rr~rr€r�r‚rƒr„rÃrmr)rrÚ_startòs !z"_WindowsSubprocessTransport._startN)r1r2r3rÒrrrrr|ðs r|c@seZdZeZdS)Ú_WindowsDefaultEventLoopPolicyN)r1r2r3r Z _loop_factoryrrrrrÓs rÓ)-r4r;r³r¿ržr§rRÚrrrrrrr r Z coroutinesr Úlogr Ú__all__r[r¾ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr¸rºZFuturerr5rCrHÚobjectrPZBaseSelectorEventLoopreZBaseProactorEventLooprrZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrÓrrrrrÚsJ        0J4;]ÿj