U :ei@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd lmZd ZdZdZdZdZdZdZGddde jZGddde jZGdddeZGdddeZ Gddde!Z"Gdddej#Z$Gdd d ej%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) exceptions)proactor_events)selector_events)tasks) windows_utils)logger)SelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicyiigMbP?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. Nloopcs&tj|d|jr|jd=||_dSNr)super__init___source_traceback_ov)selfovr __class__;/usr/local/python38/lib/python3.8/asyncio/windows_events.pyr1sz_OverlappedFuture.__init__csHt}|jdk rD|jjr dnd}|dd|d|jjdd|S)NpendingZ completedrz overlapped=)r _repr_inforr"insertaddressrinfostaterr r!r%7s    z_OverlappedFuture._repr_infoc Csr|jdkrdSz|jWnJtk rf}z,d||d}|jrJ|j|d<|j|W5d}~XYnXd|_dS)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextr r r!_cancel_overlapped>s  z$_OverlappedFuture._cancel_overlappedcs|tSN)r6rr0rrr r!r0Nsz_OverlappedFuture.cancelcst||dSr7)r set_exceptionr6rr-rr r!r9Rs z_OverlappedFuture.set_exceptioncst|d|_dSr7)r set_resultrrresultrr r!r;Vs z_OverlappedFuture.set_result) __name__ __module__ __qualname____doc__rr%r6r0r9r; __classcell__r r rr!r+s   rcsneZdZdZddfdd ZddZfdd Zd d Zd d ZfddZ fddZ fddZ Z S)_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.Nrcs8tj|d|jr|jd=||_||_||_d|_dS)NrrT)rrrr_handle _wait_handle _registered)rrhandle wait_handlerrr r!r^sz_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiZWaitForSingleObjectrDZ WAIT_OBJECT_0r8r r r!_pollls z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdk rB|r4dnd}|||jdk r`|d|jd|S)Nzhandle=r#signaledZwaitingz wait_handle=)rr%appendrDrKrEr(rr r!r%qs    z _BaseWaitHandleFuture._repr_infocCs d|_dSr7)rrfutr r r!_unregister_wait_cb{sz)_BaseWaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt|Wn`tk r}zB|jtjkrzd||d}|jrd|j|d<|j |WYdSW5d}~XYnX| ddSNFz$Failed to unregister the wait handler+r/) rFrE _overlappedZUnregisterWaitr1winerrorERROR_IO_PENDINGrr2r3rPrrHr4r5r r r!_unregister_waits$   z&_BaseWaitHandleFuture._unregister_waitcs|tSr7)rVrr0r8rr r!r0sz_BaseWaitHandleFuture.cancelcs|t|dSr7)rVrr9r:rr r!r9sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr7)rVrr;r<rr r!r;sz _BaseWaitHandleFuture.set_result) r>r?r@rArrKr%rPrVr0r9r;rBr r rr!rC[s   rCcsFeZdZdZddfdd ZddZfdd Zfd d ZZS) _WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. Nrcstj||||dd|_dS)Nr)rr_done_callback)rreventrHrrr r!rsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorr8r r r!r0sz_WaitCancelFuture.cancelcs$t||jdk r ||dSr7)rr;rXr<rr r!r;s  z_WaitCancelFuture.set_resultcs$t||jdk r ||dSr7)rr9rXr:rr r!r9s  z_WaitCancelFuture.set_exception) r>r?r@rArr0r;r9rBr r rr!rWs  rWcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrRZ CreateEvent_event _event_fut)rrrGrHproactorrrr r!rs z_WaitHandleFuture.__init__csF|jdk r"t|jd|_d|_|j|jd|_t|dSr7) r]rJ CloseHandler^r\ _unregisterrrrPrNrr r!rPs   z%_WaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt||jWn`tk r}zB|jtjkr~d||d}|jrh|j|d<|j |WYdSW5d}~XYnX|j |j|j |_dSrQ)rFrErRZUnregisterWaitExr]r1rSrTrr2r3r\ _wait_cancelrPr^rUr r r!rVs(    z"_WaitHandleFuture._unregister_wait)r>r?r@rrPrVrBr r rr!r[s r[c@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|_dSNT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)rr'r r r!rs  zPipeServer.__init__cCs|j|d}|_|S)NF)rirk)rtmpr r r!_get_unconnected_pipesz PipeServer._get_unconnected_pipec Csr|r dStjtjB}|r&|tjO}t|j|tjtjBtj Btj t j t j tj tj}t |}|j||Sr7)closedrJZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPipereZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr BUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerhadd)rfirstflagshpiper r r!rks(     zPipeServer._server_pipe_handlecCs |jdkSr7)rer8r r r!rnszPipeServer.closedcCsR|jdk r|jd|_|jdk rN|jD] }|q*d|_d|_|jdSr7)rjr0rerhclosericlear)rrvr r r!rws     zPipeServer.closeN) r>r?r@rArrmrkrnrw__del__r r r r!rcs  rcc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r>r?r@rAr r r r!rz,srzcsHeZdZdZd fdd ZfddZddZd d Zdd d ZZ S)r z2Windows version of proactor event loop using IOCP.Ncs|dkrt}t|dSr7)rrr)rr_rr r!r3szProactorEventLoop.__init__c sfz(|jdkst||jt W5|jdk r`|jj}|j|dk rZ|j|d|_XdSr7) Z_self_reading_futurerr0r\raAssertionError call_soonZ_loop_self_readingr run_foreverrrrr r!r}8s    zProactorEventLoop.run_forevercs8|j|}|IdH}|}|j||d|id}||fS)Naddrextra)r\ connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr'frvprotocoltransr r r!create_pipe_connectionKs  z(ProactorEventLoop.create_pipe_connectioncs.tdfdd gS)Nc s d}zn|rN|}j|r4|WdS}j||did}|dkrdWdSj|}Wnt k r}zF|r| dkr d||d|nj rt jd|ddW5d}~XYn2tjk r|r|YnX|_|dS) NrrrzPipe accept failed)r,r-rvzAccept pipe failed on pipe %rT)exc_info)r=rhdiscardrnrwrrmr\ accept_piper1filenor3Z_debugr warningrCancelledErrorrjadd_done_callback)rrvrr4r'loop_accept_piperrZserverr r!rVsH  z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rcr|)rrr'r rr!start_serving_pipeSs( z$ProactorEventLoop.start_serving_pipec s|} t||||||||f| |d| } z| IdHWnDttfk rTYn,tk r~| | IdHYnX| S)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionrw_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrZtranspr r r!_make_subprocess_transports* z,ProactorEventLoop._make_subprocess_transport)N)N) r>r?r@rArr}rrrrBr r rr!r 0s 0r c@seZdZdZd;ddZddZddZd d ZdddZ d?ddZ d@ddZ dAddZddZddZdd Zd!d"Zd#d$ZdBd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2ZdCd3d4Zd5d6Zd7d8Zd9d:Zd S)Drz#Proactor implementation using IOCP.rcCsDd|_g|_ttjtd||_i|_t |_ g|_ t |_ dSrI) r2_resultsrRCreateIoCompletionPortINVALID_HANDLE_VALUErp_iocp_cacherfrgrF _unregistered_stopped_serving)rZ concurrencyr r r!rs zIocpProactor.__init__cCs|jdkrtddS)NzIocpProactor is closed)rrZr8r r r! _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdkr0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srnz<%s %s> )lenrrrrMrr>join)rr)r r r!__repr__s     zIocpProactor.__repr__cCs ||_dSr7)r2)rrr r r!set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr7)rrK)rtimeoutrlr r r!selects  zIocpProactor.selectcCs|j}|||Sr7)r2rr;)rvaluerOr r r!_results  zIocpProactor._resultrcCs~||tt}z4t|tjr6||||n|||Wnt k rf| dYSXdd}| |||S)Nc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7 getresultr1rSrRZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr4r r r! finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprR Overlappedrp isinstancesocketZWSARecvrZReadFileBrokenPipeErrorr _registerrconnnbytesrtrrr r r!recvs    zIocpProactor.recvcCs~||tt}z4t|tjr6||||n|||Wnt k rf| dYSXdd}| |||S)Nrc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7rrr r r!rs  z+IocpProactor.recv_into..finish_recv) rrRrrprrZ WSARecvIntorZ ReadFileIntorrr)rrbufrtrrr r r! recv_intos    zIocpProactor.recv_intocCs`||tt}z||||Wntk rH|dYSXdd}||||S)N)rNc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7rrr r r!rs  z*IocpProactor.recvfrom..finish_recv) rrRrrpZ WSARecvFromrrrrrr r r!recvfroms   zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7rrr r r! finish_sends  z(IocpProactor.sendto..finish_send)rrRrrpZ WSASendTorr)rrrrtrrrr r r!sendtos    zIocpProactor.sendtocCsZ||tt}t|tjr4||||n|||dd}| |||S)Nc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7rrr r r!rs  z&IocpProactor.send..finish_send) rrRrrprrZWSASendrZ WriteFiler)rrrrtrrr r r!sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructpackr setsockoptr SOL_SOCKETrRZSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrrrrlistenerr r! finish_accept*sz*IocpProactor.accept..finish_acceptcs4z|IdHWn tjk r.|YnXdSr7)rrrw)r.rr r r! accept_coro3s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrRrrpZAcceptExrrr Z ensure_futurer2)rrrrrr.coror rr!accept$s     zIocpProactor.acceptc sjtjkr4t||j}|d|S| zt j WnBt k r}z$|j tjkrtddkrW5d}~XYnXtt}||fdd}|||S)Nrrcs|tjtjdSrI)rrrrrRZSO_UPDATE_CONNECT_CONTEXTrrrrr r!finish_connectVs z,IocpProactor.connect..finish_connect)typer SOCK_DGRAMrRZ WSAConnectrr2rr;rZ BindLocalrr1rSerrnoZ WSAEINVAL getsocknamerrpZ ConnectExr)rrr'rOerrr rr!connect@s"       zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7rrr r r!finish_sendfileis  z.IocpProactor.sendfile..finish_sendfile) rrRrrpZ TransmitFilermsvcrtZ get_osfhandler) rsockfileoffsetcountrZ offset_lowZ offset_highrr r r!sendfile_s      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr7)rrrvr r!finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrRrrpZConnectNamedPiperrr)rrvrZ connectedrr rr!rts    zIocpProactor.accept_pipec srt}zt|}WqhWn0tk rF}z|jtjkr6W5d}~XYnXt|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrRZ ConnectPiper1rSZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr rq)rr'delayrGr4r r r!rs  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)rrGrr r r!wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srd)rrX)rrYZ done_callbackrOr r r!rbszIocpProactor._wait_cancelcs||dkrtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)N@@rrcsSr7)rKrrr r!finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrJINFINITEmathceilrRrrpZRegisterWaitWithQueuerr'rWr2r[rr)rrGrZ _is_cancelmsrrHrr rr!rs*   zIocpProactor._wait_for_handlecCs0||jkr,|j|t||jdddSrI)rFrrrRrrrrobjr r r!rs  z IocpProactor._register_with_iocpc Cs|t||jd}|jr$|jd=|jsrz|dd|}Wn,tk rf}z||W5d}~XYn X||||||f|j|j <|Sr) rrr2rr"r1r9r;rr')rrrcallbackrrrr r r!rs 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)rrrMr~r r r!raszIocpProactor._unregistercCst|}|d|SrI)rr)rrsr r r!rs  zIocpProactor._get_accept_socketc Cs|dkrt}n0|dkr tdnt|d}|tkr>tdt|j|}|dkrXqZd}|\}}}}z|j|\}} } } WnXt k r|j r|j dd||||fd|dtj fkrt|Yq>YnX| |jkr|q>|s>z| ||| } Wn:tk r@} z|| |j|W5d} ~ XYq>X|| |j|q>|jD]} |j| jdq`|jdS)Nrznegative timeoutrztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r,status)r ValueErrorrrrRZGetQueuedCompletionStatusrrpopKeyErrorr2Z get_debugr3rrJr`rr0doner1r9rrMr;rr'rx)rrrrerrZ transferredrr'rrrrrrr r r!rKsL            zIocpProactor._pollcCs|j|dSr7)rrrrr r r! _stop_serving9szIocpProactor._stop_servingc Cs|jdkrdSt|jD]\}\}}}}|r6qt|trBqz |Wqtk r}z6|j dk rd||d}|j r|j |d<|j |W5d}~XYqXqd}t } | |} |jr| t krtd|t | t |} ||qg|_t|jd|_dS)NzCancelling a future failedr+r/g?z,%r is running after closing for %.1f seconds)rlistritems cancelledrrWr0r1r2rr3time monotonicr debugrKrrJr`) rr'rOrrrr4r5Z msg_updateZ start_timeZnext_msgr r r!rw?s@           zIocpProactor.closecCs |dSr7)rwr8r r r!rynszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)r>r?r@rArrrrrrrrrrrrrrrrrrbrrrrarrKrrwryr r r r!rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr7)_procpollZ_process_exited)r returncoder8r r!rys z4_WindowsSubprocessTransport._start..callback) r Popenr r2r\rintrDr) rrrrrrrrrrr r8r!_startts z"_WindowsSubprocessTransport._startN)r>r?r@rr r r r!rrsrc@seZdZeZdS)rN)r>r?r@r _loop_factoryr r r r!rsrc@seZdZeZdS)rN)r>r?r@r rr r r r!rsr)/rArRrJrrrrrr rfrrrrrrr r logr __all__rprZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrFuturerrCrWr[objectrcZBaseSelectorEventLooprzZBaseProactorEventLoopr rZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr r r r!sR         0J4;e`