U if@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__;/opt/alt/python38/lib64/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#ZsignaledZwaitingz 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_PENDINGrr2r3rOrrHr4r5r r r!_unregister_waits$   z&_BaseWaitHandleFuture._unregister_waitcs|tSr7)rUrr0r8rr r!r0sz_BaseWaitHandleFuture.cancelcs|t|dSr7)rUrr9r:rr r!r9sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr7)rUrr;r<rr r!r;sz _BaseWaitHandleFuture.set_result) r>r?r@rArrKr%rOrUr0r9r;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;rWr<rr r!r;s  z_WaitCancelFuture.set_resultcs$t||jdk r ||dSr7)rr9rWr:rr r!r9s  z_WaitCancelFuture.set_exception) r>r?r@rArr0r;r9rBr r rr!rVs  rVcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrQZ CreateEvent_event _event_fut)rrrGrHproactorrrr r!rs z_WaitHandleFuture.__init__csF|jdk r"t|jd|_d|_|j|jd|_t|dSr7) r\rJ CloseHandler]r[ _unregisterrrrOrMrr r!rOs   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 |_dSrP)rFrErQZUnregisterWaitExr\r1rRrSrr2r3r[ _wait_cancelrOr]rTr r r!rUs(    z"_WaitHandleFuture._unregister_wait)r>r?r@rrOrUrBr r rr!rZs rZc@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)rhrj)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_INSTANCEZCreateNamedPiperdZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlergadd)rfirstflagshpiper r r!rjs(     zPipeServer._server_pipe_handlecCs |jdkSr7)rdr8r r r!rmszPipeServer.closedcCsR|jdk r|jd|_|jdk rN|jD] }|q*d|_d|_|jdSr7)rir0rdrgcloserhclear)rrtr r r!rus     zPipeServer.closeN) r>r?r@rArrlrjrmru__del__r r r r!rbs  rbc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r>r?r@rAr r r r!rx,srxcsHeZdZdZd 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 slz(|jdkst||jt W5|jdk rf|jj}|j|dk r`|js`|j|d|_XdSr7) Z_self_reading_futurerr0r"r[r`AssertionError 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'frtprotocoltransr 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) Nr}r~rzPipe accept failed)r,r-rtzAccept pipe failed on pipe %rT)exc_info)r=rgdiscardrmrurrlr[ accept_piper1filenor3Z_debugr ZwarningrCancelledErrorriadd_done_callback)rrtrr4r'loop_accept_piperrZserverr r!rVsH  z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rbrz)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 BaseExceptionruZ_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_resultsrQCreateIoCompletionPortINVALID_HANDLE_VALUErn_iocp_cachererfrF _unregistered_stopped_serving)rZ concurrencyr r r!rs zIocpProactor.__init__cCs|jdkrtddS)NzIocpProactor is closed)rrYr8r r r! _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdkr0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srmz<%s %s> )lenrrrrLrr>join)rr)r r r!__repr__s     zIocpProactor.__repr__cCs ||_dSr7)r2)rrr r r!set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr7)rrK)rtimeoutrkr r r!selects  zIocpProactor.selectcCs|j}|||Sr7)r2rr;)rvaluerNr r r!_results  zIocpProactor._resultrcCs~||tt}z4t|tjr6||||n|||Wnt k rf| dYSXdd}| |||S)Nc SsRz |WStk rL}z$|jtjtjfkr:t|jnW5d}~XYnXdSr7 getresultr1rRrQZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr4r r r! finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprQ Overlappedrn isinstancesocketZWSARecvrZReadFileBrokenPipeErrorr _registerrconnnbytesrrrrr 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) rrQrrnrrZ WSARecvIntorZ ReadFileIntorrr)rrbufrrrrr 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) rrQrrnZ 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)rrQrrnZ WSASendTorr)rrrrrr}rrr 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) rrQrrnrrZWSASendrZ WriteFiler)rrrrrrrr r r!sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructZpackr setsockoptr SOL_SOCKETrQZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rrrrrlistenerr r! finish_accept*sz*IocpProactor.accept..finish_acceptcs4z|IdHWn tjk r.|YnXdSr7)rrru)r.rr r r! accept_coro3s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrQrrnZAcceptExrrr 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)rrrrrQZSO_UPDATE_CONNECT_CONTEXTrrrrr r!finish_connectVs z,IocpProactor.connect..finish_connect)typerZ SOCK_DGRAMrQZ WSAConnectrr2rr;rZ BindLocalrr1rRerrnoZ WSAEINVALZ getsocknamerrnZ ConnectExr)rrr'rNerrr 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) rrQrrnZ TransmitFilermsvcrtZ get_osfhandler) rZsockfileoffsetcountrZ offset_lowZ offset_highrr r r!sendfile_s      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr7)rrrtr r!finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrQrrnZConnectNamedPiperrr)rrtrZ connectedrr rr!rts    zIocpProactor.accept_pipec srt}zt|}WqhWn0tk rF}z|jtjkr6W5d}~XYnXt|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrQZ ConnectPiper1rRZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr ro)rr'ZdelayrGr4r 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}||_|Src)rrW)rrXZ done_callbackrNr r r!raszIocpProactor._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)rrJINFINITEmathceilrQrrnZRegisterWaitWithQueuerr'rVr2rZrr)rrGrZ _is_cancelmsrrHrr rr!rs*   zIocpProactor._wait_for_handlecCs0||jkr,|j|t||jdddSrI)rFrprQrrrrobjr 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)rrrLr|r r r!r`szIocpProactor._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 ValueErrorrrrQZGetQueuedCompletionStatusrrpopKeyErrorr2Z get_debugr3rrJr_rr0Zdoner1r9rrLr;rr'rv)rrrrerrZ transferredrr'rrrrrrr r r!rKsL            zIocpProactor._pollcCs|j|dSr7)rrprr 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)rlistritemsZ cancelledrrVr0r1r2rr3time monotonicr debugrKrrJr_) rr'rNrrrr4r5Z msg_updateZ start_timeZnext_msgr r r!ru?s@           zIocpProactor.closecCs |dSr7)rur8r r r!rwnszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)r>r?r@rArrrrrrrrrrrrrrrrrrarrrr`rrKrrurwr r r r!rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr7)_procZpollZ_process_exited)r returncoder8r r!rys z4_WindowsSubprocessTransport._start..callback) r Popenrr2r[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)/rArQrJrrrrrrrerrrrrrr r logr __all__rnrZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrZFuturerrCrVrZobjectrbZBaseSelectorEventLooprxZBaseProactorEventLoopr rZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr r r r!sR         0J4;e`