B ӭG4+d@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd lmZd ZdZd ZdZdZdZdZGddde jZGddde jZGdddeZGdddeZGddde Z!Gdddej"Z#Gdddej$Z%Gd d!d!Z&Gd"d#d#e j'Z(e#Z)Gd$d%d%e j*Z+Gd&d'd'e j*Z,e+Z-dS)(z.Selector and proactor event loops for Windows.N)events)base_subprocess)futures)proactor_events)selector_events)tasks) windows_utils)logger)SelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicyliigMbP?g?cs^eZdZdZddfdd ZfddZdd Zfd d Zfd d ZfddZ Z S)_OverlappedFuturezSubclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. N)loopcs&tj|d|jr|jd=||_dS)N)r)super__init___source_traceback_ov)selfovr) __class__9/opt/alt/python37/lib/python3.7/asyncio/windows_events.pyr0sz_OverlappedFuture.__init__csHt}|jdk rD|jjr dnd}|dd|d|jjdd|S)NpendingZ completedrz overlapped=)r _repr_inforrinsertaddress)rinfostate)rrrr6s    z_OverlappedFuture._repr_infoc Csr|jdkrdSy|jWnJtk rf}z,d||d}|jrJ|j|d<|j|Wdd}~XYnXd|_dS)Nz&Cancelling an overlapped future failed)message exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextrrr_cancel_overlapped=s  z$_OverlappedFuture._cancel_overlappedcs|tS)N)r.rr()r)rrrr(Msz_OverlappedFuture.cancelcst||dS)N)r set_exceptionr.)rr%)rrrr/Qs z_OverlappedFuture.set_exceptioncst|d|_dS)N)r set_resultr)rresult)rrrr0Us z_OverlappedFuture.set_result) __name__ __module__ __qualname____doc__rrr.r(r/r0 __classcell__rr)rrr*s   rcsneZdZdZddfdd ZddZfdd Zd d Zd d ZfddZ fddZ fddZ Z S)_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.N)rcs8tj|d|jr|jd=||_||_||_d|_dS)N)rrT)rrrr_handle _wait_handle _registered)rrhandle wait_handler)rrrr]sz_BaseWaitHandleFuture.__init__cCst|jdtjkS)Nr)_winapiZWaitForSingleObjectr8Z WAIT_OBJECT_0)rrrr_pollks z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdk rB|r4dnd}|||jdk r`|d|jd|S)Nzhandle=z#xZsignaledZwaitingz wait_handle=)rrappendr8r>r9)rr"r#)rrrrps    z _BaseWaitHandleFuture._repr_infocCs d|_dS)N)r)rfutrrr_unregister_wait_cbzsz)_BaseWaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_yt|WnZtk r}z<|jtjkrtd||d}|jrd|j|d<|j |dSWdd}~XYnX| ddS)NFz$Failed to unregister the wait handle)r$r%r&r') r:r9 _overlappedZUnregisterWaitr)winerrorERROR_IO_PENDINGrr*r+rA)rr<r,r-rrr_unregister_waits"   z&_BaseWaitHandleFuture._unregister_waitcs|tS)N)rErr()r)rrrr(sz_BaseWaitHandleFuture.cancelcs|t|dS)N)rErr/)rr%)rrrr/sz#_BaseWaitHandleFuture.set_exceptioncs|t|dS)N)rErr0)rr1)rrrr0sz _BaseWaitHandleFuture.set_result) r2r3r4r5rr>rrArEr(r/r0r6rr)rrr7Zs   r7csFeZdZdZddfdd ZddZfdd Zfd d ZZS) _WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. N)rcstj||||dd|_dS)N)r)rr_done_callback)rreventr<r)rrrrsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeError)rrrrr(sz_WaitCancelFuture.cancelcs$t||jdk r ||dS)N)rr0rG)rr1)rrrr0s  z_WaitCancelFuture.set_resultcs$t||jdk r ||dS)N)rr/rG)rr%)rrrr/s  z_WaitCancelFuture.set_exception) r2r3r4r5rr(r0r/r6rr)rrrFs  rFcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureN)rcs<tj||||d||_d|_tdddd|_d|_dS)N)rTF)rr _proactorZ_unregister_proactorrBZ CreateEvent_event _event_fut)rrr;r<proactorr)rrrrs z_WaitHandleFuture.__init__csF|jdk r"t|jd|_d|_|j|jd|_t|dS)N) rLr= CloseHandlerMrK _unregisterrrrA)rr@)rrrrAs   z%_WaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_yt||jWnZtk r}z<|jtjkrxd||d}|jrh|j|d<|j |dSWdd}~XYnX|j |j|j |_dS)NFz$Failed to unregister the wait handle)r$r%r&r')r:r9rBZUnregisterWaitExrLr)rCrDrr*r+rK _wait_cancelrArM)rr<r,r-rrrrEs$    z"_WaitHandleFuture._unregister_wait)r2r3r4rrArEr6rr)rrrJs rJc@s<eZdZdZddZddZddZdd Zd d ZeZ d S) PipeServerzXClass representing a pipe server. This is much like a bound, listening socket. cCs,||_t|_d|_d|_|d|_dS)NT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)rr!rrrrs  zPipeServer.__init__cCs|j|d}|_|S)NF)rWrY)rtmprrr_get_unconnected_pipesz PipeServer._get_unconnected_pipec Csr|r dStjtjB}|r&|tjO}t|j|tjtjBtj Btj t j t j tj tj}t |}|j||S)N)closedr=ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperSZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerVadd)rfirstflagshpiperrrrYs      zPipeServer._server_pipe_handlecCs |jdkS)N)rS)rrrrr\szPipeServer.closedcCsV|jdk r|jd|_|jdk rRx|jD] }|q,Wd|_d|_|jdS)N)rXr(rSrVcloserWclear)rrcrrrrds     zPipeServer.closeN) r2r3r4r5rr[rYr\rd__del__rrrrrRs  rRc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r2r3r4r5rrrrrg+srgcs<eZdZdZd fdd ZddZddZd d d ZZS) r z2Windows version of proactor event loop using IOCP.Ncs|dkrt}t|dS)N)r rr)rrN)rrrr2szProactorEventLoop.__init__cs8|j|}|IdH}|}|j||d|id}||fS)Naddr)extra)rK connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr!frcprotocoltransrrrcreate_pipe_connection7s    z(ProactorEventLoop.create_pipe_connectioncs.tdfdd gS)Nc sd}yj|rL|}j|r2|dS}j||did}|dkr`dSj|}Wnt k r}zF|r| dkr d||d|nj rt jd|ddWdd}~XYn2tjk r|r|YnX|_|dS) Nrh)rirzPipe accept failed)r$r%rczAccept pipe failed on pipe %rT)exc_info)r1rVdiscardr\rdrkr[rK accept_piper)filenor+Z_debugr ZwarningrCancelledErrorrXadd_done_callback)rmrcrnr,)r!loop_accept_piperlrserverrrrwBs<   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rRZ call_soon)rrlr!r)r!rwrlrrxrstart_serving_pipe?s( z$ProactorEventLoop.start_serving_pipec sl|} t||||||||f| |d| } y| IdHWn,tk rf| | IdHYnX| S)N)waiterri) create_future_WindowsSubprocessTransport ExceptionrdZ_wait) rrnargsshellstdinstdoutstderrbufsizerikwargsrzZtransprrr_make_subprocess_transportms  z,ProactorEventLoop._make_subprocess_transport)N)N) r2r3r4r5rrpryrr6rr)rrr /s 0r c@seZdZdZd7ddZddZddZd d Zd8d d ZddZ d9ddZ d:ddZ d;ddZ ddZ ddZddZddZdd Zdr z#Proactor implementation using IOCP.cCsDd|_g|_ttjtd||_i|_t |_ g|_ t |_ dS)Nr) r*_resultsrBCreateIoCompletionPortINVALID_HANDLE_VALUEr]_iocp_cacherTrUr: _unregistered_stopped_serving)rZ concurrencyrrrrs zIocpProactor.__init__cCs|jdkrtddS)NzIocpProactor is closed)rrI)rrrr _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdkr0|dd|jjd|fS)Nzoverlapped#=%sz result#=%sr\z<%s %s> )lenrrrr?rr2join)rr"rrr__repr__s    zIocpProactor.__repr__cCs ||_dS)N)r*)rrrrrset_loopszIocpProactor.set_loopNcCs |js|||j}g|_|S)N)rr>)rtimeoutrZrrrselects  zIocpProactor.selectcCs|j}|||S)N)r*r{r0)rvaluer@rrr_results  zIocpProactor._resultrcCsz||tt}y4t|tjr6||||n|||Wnt k rb| dSXdd}| |||S)Nc SsPy|Stk rJ}z$|jtjtjfkr8t|jnWdd}~XYnXdS)N) getresultr)rCrBERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorr~)rokeyrr,rrr finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprB Overlappedr] isinstancesocketZWSARecvrtZReadFileBrokenPipeErrorr _register)rconnnbytesrarrrrrrecvs     zIocpProactor.recvcCsz||tt}y4t|tjr6||||n|||Wnt k rb| dSXdd}| |||S)Nrc SsPy|Stk rJ}z$|jtjtjfkr8t|jnWdd}~XYnXdS)N)rr)rCrBrrrr~)rorrr,rrrrs  z+IocpProactor.recv_into..finish_recv) rrBrr]rrZ WSARecvIntortZ ReadFileIntorrr)rrbufrarrrrr recv_intos     zIocpProactor.recv_intocCsZ||tt}t|tjr4||||n|||dd}| |||S)Nc SsPy|Stk rJ}z$|jtjtjfkr8t|jnWdd}~XYnXdS)N)rr)rCrBrrrr~)rorrr,rrr finish_sends  z&IocpProactor.send..finish_send) rrBrr]rrZWSASendrtZ WriteFiler)rrrrarrrrrsends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructZpackrt setsockoptr SOL_SOCKETrBZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rorrr)rlistenerrr finish_accepts  z*IocpProactor.accept..finish_acceptcs4y|IdHWn tjk r.|YnXdS)N)rrurd)r&rrrr accept_coros z(IocpProactor.accept..accept_coro)r) r_get_accept_socketfamilyrBrr]ZAcceptExrtrrZ ensure_futurer*)rrrrrr&coror)rrraccepts     zIocpProactor.acceptc s|ytjWnBtk rb}z$|jtjkr@ ddkrRWdd}~XYnXt t }| |fdd}| ||S)Nrrcs|tjtjdS)Nr)rrrrrBZSO_UPDATE_CONNECT_CONTEXT)rorr)rrrfinish_connects z,IocpProactor.connect..finish_connect)rrBZ BindLocalrtrr)rCerrnoZ WSAEINVALZ getsocknamerr]Z ConnectExr)rrr!errr)rrconnects    zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nl rc SsPy|Stk rJ}z$|jtjtjfkr8t|jnWdd}~XYnXdS)N)rr)rCrBrrrr~)rorrr,rrrfinish_sendfile%s  z.IocpProactor.sendfile..finish_sendfile) rrBrr]Z TransmitFilertmsvcrtZ get_osfhandler) rZsockfileoffsetcountrZ offset_lowZ offset_highrrrrsendfiles       zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |S)N)r)rorr)rcrrfinish_accept_pipe;sz4IocpProactor.accept_pipe..finish_accept_pipe)rrBrr]ZConnectNamedPipertrr)rrcrZ connectedrr)rcrrs0s    zIocpProactor.accept_pipec szt}xjyt|}PWn0tk rF}z|jtjkr6Wdd}~XYnXt|dt}tj ||j dIdHqWt |S)N)r) CONNECT_PIPE_INIT_DELAYrBZ ConnectPiper)rCZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYrZsleepr*r r^)rr!Zdelayr;r,rrrrjAs  zIocpProactor.connect_pipecCs|||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)rr;rrrrwait_for_handleTszIocpProactor.wait_for_handlecCs||dd}||_|S)NT)rrG)rrHZ done_callbackr@rrrrQ\szIocpProactor._wait_cancelcs||dkrtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)Ng@@)rrcsS)N)r>)rorr)rmrrfinish_wait_for_handleysz=IocpProactor._wait_for_handle..finish_wait_for_handler)rr=INFINITEmathceilrBrr]ZRegisterWaitWithQueuerr!rFr*rJrr)rr;rZ _is_cancelmsrr<rr)rmrrcs     zIocpProactor._wait_for_handlecCs0||jkr,|j|t||jdddS)Nr)r:r_rBrrtr)robjrrrrs  z IocpProactor._register_with_iocpc Cs|t||jd}|jr$|jd=|jsry|dd|}Wn,tk rf}z||Wdd}~XYn X||||||f|j|j <|S)N)rr) rrr*rrr)r/r0rr!)rrrcallbackrmrrrrrrs zIocpProactor._registercCs||j|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)rrr?)rrrrrrPszIocpProactor._unregistercCst|}|d|S)Nr)rr)rrsrrrrs  zIocpProactor._get_accept_socketc Cs|dkrt}n0|dkr tdnt|d}|tkr>tdxt|j|}|dkrZPd}|\}}}}y|j|\}} } } WnVt k r|j r|j dd||||fd|dtj fkrt|wBYnX| |jkr|qB|sBy| ||| } Wn:tk r@} z|| |j|Wdd} ~ XYqBX|| |j|qBWx |jD]} |j| jdqdW|jdS)Nrznegative timeoutg@@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r$status)r ValueErrorrrrBZGetQueuedCompletionStatusrrpopKeyErrorr*Z get_debugr+rr=rOrr(Zdoner)r/rr?r0rr!re)rrrrerrZ transferredrr!rmrrrrrrrrr>sJ         zIocpProactor._pollcCs|j|dS)N)rr_)rrrrr _stop_servingszIocpProactor._stop_servingc Cs |jdkrdSxt|jD]\}\}}}}|r8qt|trDqy |Wqtk r}z6|j dk rd||d}|j r|j |d<|j |Wdd}~XYqXqWd}t } | |} xD|jr| t krtd|t | t |} ||qWg|_t|jd|_dS)NzCancelling a future failed)r$r%r&r'g?z,%r is running after closing for %.1f seconds)rlistritemsZ cancelledrrFr(r)r*rr+timeZ monotonicr debugr>rr=rO) rr!r@rrrr,r-Z msg_updateZ start_timeZnext_msgrrrrds:      "    zIocpProactor.closecCs |dS)N)rd)rrrrrf*szIocpProactor.__del__)r)N)r)r)r)N)N)r2r3r4r5rrrrrrrrrrrrrsrjrrQrrrrPrr>rrdrfrrrrr s4      "    7/r c@seZdZddZdS)r|c  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dS)N)_procZpollZ_process_exited)rm returncode)rrrr5s z4_WindowsSubprocessTransport._start..callback) r Popenrr*rKrintr8rv) rr~rrrrrrrrmr)rr_start0s   z"_WindowsSubprocessTransport._startN)r2r3r4rrrrrr|.sr|c@seZdZeZdS)rN)r2r3r4r _loop_factoryrrrrr@src@seZdZeZdS)rN)r2r3r4r rrrrrrDsr).r5rBr=rrrrrrrTrrrrrrr logr __all__r]rZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrZFuturerr7rFrJobjectrRZBaseSelectorEventLooprgZBaseProactorEventLoopr r ZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrrrrrrrsP        0J4;P2