CMa.l@sdZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddddgZdZdZdZdZdZdZGddde jZGddde jZGdddeZGdddeZGdd d e Z!Gd!d"d"e j"Z#Gd#dde j$Z%Gd$ddZ&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)loggerSelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyliigMbP?g?cseZdZdZddfddZfddZdd Zfd d Zfd d ZfddZ S)_OverlappedFuturezSubclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. loopNcs3tjd||jr&|jd=||_dS)Nrr)super__init___source_traceback_ov)selfovr) __class__;/opt/alt/python35/lib64/python3.5/asyncio/windows_events.pyr-s  z_OverlappedFuture.__init__csZtj}|jdk rV|jjr0dnd}|jdd||jjf|S)NpendingZ completedrzoverlapped=<%s, %#x>)r _repr_inforrinsertaddress)rinfostate)rrrr3s  z_OverlappedFuture._repr_infocCs|jdkrdSy|jjWnctk r}zCddd|d|i}|jrg|j|d<|jj|WYdd}~XnXd|_dS)Nmessagez&Cancelling an overlapped future failed exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextrrr_cancel_overlapped:s   #z$_OverlappedFuture._cancel_overlappedcs|jtjS)N)r-rr')r)rrrr'Js z_OverlappedFuture.cancelcstj||jdS)N)r set_exceptionr-)rr$)rrrr.Nsz_OverlappedFuture.set_exceptioncstj|d|_dS)N)r set_resultr)rresult)rrrr/Rsz_OverlappedFuture.set_result) __name__ __module__ __qualname____doc__rrr-r'r.r/rr)rrr's  rcseZdZdZddfddZddZfdd Zd d Zd d ZfddZ fddZ fddZ S)_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.rNcsNtjd||jr&|jd=||_||_||_d|_dS)NrrTr)rrrr_handle _wait_handle _registered)rrhandle wait_handler)rrrrZs     z_BaseWaitHandleFuture.__init__cCstj|jdtjkS)Nr)_winapiZWaitForSingleObjectr6Z WAIT_OBJECT_0)rrrr_pollhsz_BaseWaitHandleFuture._pollcs~tj}|jd|j|jdk rW|jrDdnd}|j||jdk rz|jd|j|S)Nz handle=%#xZsignaledZwaitingzwait_handle=%#x)rrappendr6r<r7)rr!r")rrrrms z _BaseWaitHandleFuture._repr_infocCs d|_dS)N)r)rfutrrr_unregister_wait_cbwsz)_BaseWaitHandleFuture._unregister_wait_cbcCs|js dSd|_|j}d|_ytj|Wnytk r}zY|jtjkrddd|d|i}|jr|j|d<|jj |dSWYdd}~XnX|j ddS)NFr#z$Failed to unregister the wait handler$r%r&) r8r7r ZUnregisterWaitr(winerrorERROR_IO_PENDINGrr)r*r?)rr:r+r,rrr_unregister_wait|s"       z&_BaseWaitHandleFuture._unregister_waitcs|jtjS)N)rBrr')r)rrrr's z_BaseWaitHandleFuture.cancelcs|jtj|dS)N)rBrr.)rr$)rrrr.s z#_BaseWaitHandleFuture.set_exceptioncs|jtj|dS)N)rBrr/)rr0)rrrr/s z _BaseWaitHandleFuture.set_result) r1r2r3r4rr<rr?rBr'r.r/rr)rrr5Ws    r5csLeZdZdZddfddZddZfdd ZS) _WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. rNcs)tj|||d|d|_dS)Nr)rr_done_callback)rreventr:r)rrrrsz_WaitCancelFuture.__init__cCstddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeError)rrrrr'sz_WaitCancelFuture.cancelcs3tt|j|jdk r/|j|dS)N)rrC_schedule_callbacksrD)r)rrrrGsz%_WaitCancelFuture._schedule_callbacks)r1r2r3r4rr'rGrr)rrrCs  rCcsFeZdZddfddZfddZddZS) _WaitHandleFuturerNcsVtj|||d|||_d|_tjdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorr Z CreateEvent_event _event_fut)rrr9r:proactorr)rrrrs   z_WaitHandleFuture.__init__csa|jdk r1tj|jd|_d|_|jj|jd|_tj|dS)N) rJr; CloseHandlerKrI _unregisterrrr?)rr>)rrrr?s   z%_WaitHandleFuture._unregister_wait_cbcCs|js dSd|_|j}d|_ytj||jWnytk r}zY|jtjkrddd|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,rrrrBs$       z"_WaitHandleFuture._unregister_wait)r1r2r3rr?rBrr)rrrHs rHc@sXeZdZdZddZddZddZdd 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)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)rr rrrrs    zPipeServer.__init__cCs |j|jd}|_|S)NF)rUrW)rtmprrr_get_unconnected_pipesz PipeServer._get_unconnected_pipec Cs|jrdStjtjB}|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_FOREVERNULL PipeHandlerTadd)rfirstflagshpiperrrrWs     zPipeServer._server_pipe_handlecCs |jdkS)N)rQ)rrrrrZszPipeServer.closedcCsu|jdk r%|jjd|_|jdk rqx|jD]}|jq>Wd|_d|_|jjdS)N)rVr'rQrTcloserUclear)rrarrrrbs    zPipeServer.closeN) r1r2r3r4rrYrWrZrb__del__rrrrrPs     rPc@s"eZdZdZddZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.cCs tjS)N)r socketpair)rrrr _socketpair&sz%_WindowsSelectorEventLoop._socketpairN)r1r2r3r4rgrrrrre#s recspeZdZdZdfddZddZeddZed d Zedd d Z S) rz2Windows version of proactor event loop using IOCP.Ncs)|dkrt}tj|dS)N)rrr)rrL)rrrr-s  zProactorEventLoop.__init__cCs tjS)N)r rf)rrrrrg2szProactorEventLoop._socketpairccsN|jj|}|EdH}|}|j||dd|i}||fS)Nextraaddr)rI connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr fraprotocoltransrrrcreate_pipe_connection5s   z(ProactorEventLoop.create_pipe_connectioncsAtdfddjgS)Ncsbd}y|rj|j}jj|jrE|jdS}j||ddij}|dkrdSjj|}Wnt k r#}zh|r|j d krj ddd|d|i|jnj rt jd|d d WYdd}~Xn;tjk rG|rC|jYnX|_|jdS) Nrhrirr#zPipe accept failedr$razAccept pipe failed on pipe %rexc_infoTr)r0rTdiscardrZrbrkrYrI accept_piper(filenor*Z_debugr ZwarningrCancelledErrorrVadd_done_callback)rmrarnr+)r loop_accept_piperlrserverrrrwBs<           z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)rPZ call_soon)rrlr r)r rwrlrrxrstart_serving_pipe>s !( z$ProactorEventLoop.start_serving_pipec ks|j} t||||||||d| d|| } y | EdHWn+tk rv} z | } WYdd} ~ XnXd} | dk r| j| jEdH| | S)Nwaiterrh) create_future_WindowsSubprocessTransport ExceptionrbZ_wait)rrnargsshellstdinstdoutstderrbufsizerhkwargsrzZtranspr+errrrr_make_subprocess_transportms      z,ProactorEventLoop._make_subprocess_transport) r1r2r3r4rrgr rpryrrr)rrr*s   /c@s6eZdZdZdddZddZddZd d d Zd d ZdddZ dddZ ddZ ddZ ddZ eddZd ddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd d)d*Zd+d,Zd-d.Zd/d0Zd S)1rz#Proactor implementation using IOCP.lcCsdd|_g|_tjtjtd||_i|_tj |_ g|_ tj |_ dS)Nr) r)_resultsr CreateIoCompletionPortINVALID_HANDLE_VALUEr[_iocp_cacherRrSr8 _unregistered_stopped_serving)rZ concurrencyrrrrs    zIocpProactor.__init__cCs)d|jjt|jt|jfS)Nz<%s overlapped#=%s result#=%s>)rr1lenrr)rrrr__repr__szIocpProactor.__repr__cCs ||_dS)N)r))rrrrrset_loopszIocpProactor.set_loopNcCs,|js|j||j}g|_|S)N)rr<)rtimeoutrXrrrselects     zIocpProactor.selectcCs |jj}|j||S)N)r)r{r/)rvaluer>rrr_results zIocpProactor._resultrc Cs|j|tjt}yHt|tjrM|j|j||n|j|j|Wnt k r|j dSYnXdd}|j |||S)NcSsay|jSWnLtk r\}z,|jtjkrGt|jnWYdd}~XnXdS)N) getresultr(r@r ERROR_NETNAME_DELETEDConnectionResetErrorr~)rokeyrr+rrr finish_recvs z&IocpProactor.recv..finish_recv) _register_with_iocpr Overlappedr[ isinstancesocketZWSARecvrtZReadFileBrokenPipeErrorr _register)rconnnbytesr_rrrrrrecvs   zIocpProactor.recvcCs|j|tjt}t|tjrJ|j|j||n|j|j|dd}|j |||S)NcSsay|jSWnLtk r\}z,|jtjkrGt|jnWYdd}~XnXdS)N)rr(r@r rrr~)rorrr+rrr finish_sends z&IocpProactor.send..finish_send) rr rr[rrZWSASendrtZ WriteFiler)rrbufr_rrrrrsends  zIocpProactor.sendcs|j|jjtjt}|jjjfdd}tdd}|j ||}||}t j |d|j |S)Ncs^|jtjdj}jtjtj|j j j fS)Nz@P) rstructZpackrt setsockoptr SOL_SOCKETr ZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rorrr)rlistenerrr finish_accepts    z*IocpProactor.accept..finish_acceptc ss6y |EdHWn"tjk r1|jYnXdS)N)rrurb)r%rrrr accept_coros   z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyr rr[ZAcceptExrtr rrZ ensure_futurer))rrrrrr%coror)rrraccepts   zIocpProactor.acceptcs|jytjjjWnStk r}z3|jtjkrTj ddkrmWYdd}~XnXtj t }|j j|fdd}|j ||S)Nrrcs'|jjtjtjdS)Nr)rrrrr ZSO_UPDATE_CONNECT_CONTEXT)rorr)rrrfinish_connects   z,IocpProactor.connect..finish_connect)rr Z BindLocalrtrr(r@errnoZ WSAEINVALZ getsocknamerr[Z ConnectExr)rrr errr)rrconnects zIocpProactor.connectcsi|jtjt}|jj}|rD|jSfdd}|j||S)Ncs|jS)N)r)rorr)rarrfinish_accept_pipes z4IocpProactor.accept_pipe..finish_accept_pipe)rr rr[ZConnectNamedPipertrr)rrarZ connectedrr)rarrss  zIocpProactor.accept_pipeccst}xytj|}PWn:tk rY}z|jtjkrGWYdd}~XnXt|dt}tj |d|j EdHq Wt j |S)Nr) CONNECT_PIPE_INIT_DELAYr Z ConnectPiper(r@ZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYrZsleepr)r r\)rr Zdelayr9r+rrrrjszIocpProactor.connect_pipecCs|j||dS)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)rr9rrrrwait_for_handle*szIocpProactor.wait_for_handlecCs"|j|dd}||_|S)NT)rrD)rrEZ done_callbackr>rrrrO2s zIocpProactor._wait_cancelcs|dkrtj}ntj|d}tjt}tj||j|j |}|r|t |||d|j nt ||||d|j j rj d=fdd}|d|f|j|j <S)Ng@@rrcs jS)N)r<)rorr)rmrrfinish_wait_for_handleMsz=IocpProactor._wait_for_handle..finish_wait_for_handlerr)r;INFINITEmathceilr rr[ZRegisterWaitWithQueuerr rCr)rHrr)rr9rZ _is_cancelmsrr:rr)rmrr9s      zIocpProactor._wait_for_handlecCsB||jkr>|jj|tj|j|jdddS)Nr)r8r]r rrtr)robjrrrrYsz IocpProactor._register_with_iocpcCst|d|j}|jr(|jd=|jsy|dd|}Wn2tk r{}z|j|WYdd}~XnX|j|||||f|j|j<|S)Nrrr) rr)rrr(r.r/rr )rrrcallbackrmrrrrrrcs     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)rr=)rrrrrrNszIocpProactor._unregistercCs tj|}|jd|S)Nr)rr)rrsrrrrs zIocpProactor._get_accept_socketcCs|dkrt}nF|dkr0tdn+tj|d}|tkr[tdxutj|j|}|dkrPd}|\}}}}y"|jj|\}} } } Wnrt k r.|j j r|j j dddd||||fi|dtj fkr'tj|w^YnX| |jkrK|jq^|js^y| ||| } WnBtk r} z"|j| |jj|WYdd} ~ Xq^X|j| |jj|q^Wx'|jD]} |jj| jdqW|jjdS) Nrznegative timeoutg@@ztimeout too bigr#z8GetQueuedCompletionStatus() returned an unexpected eventstatusz)err=%s transferred=%s key=%#x address=%#x)r ValueErrorrrr ZGetQueuedCompletionStatusrrpopKeyErrorr)Z get_debugr*rr;rMrr'doner(r.rr=r/rr rc)rrrrrZ transferredrr rmrrrrrrrrr<sJ      "      # zIocpProactor._pollcCs|jj|dS)N)rr])rrrrr _stop_servingszIocpProactor._stop_servingcCs7xt|jjD]\}\}}}}|jr=qt|trOqy|jWqtk r}zR|jdk rddd|d|i}|j r|j |d<|jj |WYdd}~XqXqWx)|jr|j dst j dqWg|_|jdk r3tj|jd|_dS)Nr#zCancelling a future failedr$r%r&rz"taking long time to close proactor)listritemsZ cancelledrrCr'r(r)rr*r<r debugrrr;rM)rr r>rrrr+r,rrrrbs,.    '  zIocpProactor.closecCs|jdS)N)rb)rrrrrdszIocpProactor.__del__)r1r2r3r4rrrrrrrrrrsr rjrrOrrrrNrr<rrbrdrrrrrs.          7  c@seZdZddZdS)r|c swtj|d|d|d|d|d||_fdd}jjjtjj} | j|dS)Nrrrrrcs jj}j|dS)N)_procZpollZ_process_exited)rm returncode)rrrrsz4_WindowsSubprocessTransport._start..callback) r Popenrr)rIrintr6rv) rr~rrrrrrrrmr)rr_starts !z"_WindowsSubprocessTransport._startN)r1r2r3rrrrrr|s r|c@seZdZeZdS)_WindowsDefaultEventLoopPolicyN)r1r2r3r Z _loop_factoryrrrrrs r)-r4r;rrrrrRrrrrrrr r Z coroutinesr logr __all__r[rZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrZFuturerr5rCrHobjectrPZBaseSelectorEventLoopreZBaseProactorEventLooprrZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrrrrrrsJ        0J4;]j