a d@sdZddlZejdkredddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddlmZdZdZdZdZdZdZdZGdddejZ GdddejZ!Gddde!Z"Gddde!Z#Gddde$Z%Gdd d ej&Z'Gd!d"d"ej(Z)Gd#d$d$Z*Gd%d&d&ej+Z,e'Z-Gd'd(d(ej.Z/Gd)d*d*ej.Z0e0Z1dS)+z.Selector and proactor event loops for Windows.Nwin32z win32 only)events)base_subprocess)futures) exceptions)proactor_events)selector_events)tasks) windows_utils)logger)SelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicyiigMbP?g?cs`eZdZdZddfdd ZfddZdd Zdfd 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/lib64/python3.9/asyncio/windows_events.pyr6sz_OverlappedFuture.__init__csHt}|jdurD|jjr dnd}|dd|d|jjdd|S)Npending completedrz overlapped=)r _repr_inforr#insertaddressrinfostaterr!r"r'<s    z_OverlappedFuture._repr_infoc Cst|jdurdSz|jWnLtyh}z4d||d}|jrH|j|d<|j|WYd}~n d}~00d|_dS)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextr!r!r"_cancel_overlappedCs  "z$_OverlappedFuture._cancel_overlappedcs|tj|dSN)msg)r8rr2rr:rr!r"r2Ssz_OverlappedFuture.cancelcst||dSN)r set_exceptionr8rr/rr!r"r=Ws z_OverlappedFuture.set_exceptioncst|d|_dSr<)r set_resultrrresultrr!r"r?[s z_OverlappedFuture.set_result)N) __name__ __module__ __qualname____doc__rr'r8r2r=r? __classcell__r!r!rr"r0s  rcspeZdZdZddfdd ZddZfdd Zd d Zd d Zdfdd Z 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"rcsz_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiWaitForSingleObjectrH WAIT_OBJECT_0rr!r!r"_pollqs z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdurB|r4dnd}|||jdur`|d|jd|S)Nzhandle=r%signaledwaitingz wait_handle=)rr'appendrHrRrIr*rr!r"r'vs    z _BaseWaitHandleFuture._repr_infocCs d|_dSr<)rrfutr!r!r"_unregister_wait_cbsz)_BaseWaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt|Wnfty}zN|jtjkr|d||d}|jrb|j|d<|j |WYd}~dSWYd}~n d}~00| ddSNFz$Failed to unregister the wait handler-r1) rJrI _overlappedUnregisterWaitr3winerrorERROR_IO_PENDINGrr4r5rXrrLr6r7r!r!r"_unregister_waits$   $z&_BaseWaitHandleFuture._unregister_waitcs|tj|dSr9)r_rr2r;rr!r"r2sz_BaseWaitHandleFuture.cancelcs|t|dSr<)r_rr=r>rr!r"r=sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr<)r_rr?r@rr!r"r?sz _BaseWaitHandleFuture.set_result)N) rBrCrDrErrRr'rXr_r2r=r?rFr!r!rr"rG`s  rGcsFeZdZdZddfdd 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)rreventrLrrr!r"rsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrQr!r!r"r2sz_WaitCancelFuture.cancelcs$t||jdur ||dSr<)rr?rar@rr!r"r?s  z_WaitCancelFuture.set_resultcs$t||jdur ||dSr<)rr=rar>rr!r"r=s  z_WaitCancelFuture.set_exception) rBrCrDrErr2r?r=rFr!r!rr"r`s  r`cs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactor_unregister_proactorrZ CreateEvent_event _event_fut)rrrKrLproactorrrr!r"rs z_WaitHandleFuture.__init__csF|jdur"t|jd|_d|_|j|jd|_t|dSr<) rhrN CloseHandlerire _unregisterrrrXrVrr!r"rXs   z%_WaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt||jWnfty}zN|jtjkrd||d}|jrf|j|d<|j |WYd}~dSWYd}~n d}~00|j |j|j |_dSrY)rJrIrZUnregisterWaitExrhr3r\r]rr4r5re _wait_cancelrXrir^r!r!r"r_s(   $ z"_WaitHandleFuture._unregister_wait)rBrCrDrrXr_rFr!r!rr"rds rdc@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)rurw)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||Sr<)closedrNPIPE_ACCESS_DUPLEXFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCECreateNamedPiperqPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITPIPE_UNLIMITED_INSTANCESr BUFSIZENMPWAIT_WAIT_FOREVERNULL PipeHandlertadd)rfirstflagshpiper!r!r"rw s"     zPipeServer._server_pipe_handlecCs |jduSr<)rqrQr!r!r"rzszPipeServer.closedcCsR|jdur|jd|_|jdurN|jD] }|q*d|_d|_|jdSr<)rvr2rqrtcloseruclear)rrr!r!r"r"s     zPipeServer.closeN) rBrCrDrErryrwrzr__del__r!r!r!r"ros  roc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rBrCrDrEr!r!r!r"r1srcsHeZdZdZd fdd ZfddZddZd d Zdd d ZZ S)rz2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr<)rrr)rrjrr!r"r8szProactorEventLoop.__init__c sz^|jdusJ||jtW|jdur|jj}|j|durX|j|d|_n8|jdur|jj}|j|dur|j|d|_0dSr<) _self_reading_future call_soon_loop_self_readingr run_foreverrr2rerlrrrr!r"r=s         zProactorEventLoop.run_forevercs8|j|}|IdH}|}|j||d|id}||fS)Naddrextra)re connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr)frprotocoltransr!r!r"create_pipe_connectionPs  z(ProactorEventLoop.create_pipe_connectioncs.tdfdd gS)Nc s d}zn|rN|}j|r4|WdS}j||did}|durdWdSj|}Wnt y}zN|r| dkr d||d|nj rt jd|ddWYd}~n8d}~0tjy|r|Yn0|_|dS) NrrrzPipe accept failed)r.r/rzAccept pipe failed on pipe %rT)exc_info)rArtdiscardrzrrryre accept_piper3filenor5_debugr warningrCancelledErrorrvadd_done_callback)rrrr6r)loop_accept_piperrserverr!r"r[sB   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)ror)rrr)r!rr"start_serving_pipeXs( z$ProactorEventLoop.start_serving_pipec s|} t||||||||f| |d| } z| IdHWn@ttfyRYn*tyz| | IdHYn0| S)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionr_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrtranspr!r!r"_make_subprocess_transports"  z,ProactorEventLoop._make_subprocess_transport)N)N) rBrCrDrErrrrrrFr!r!rr"r5s 0rc@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 |_ dSrM) r4_resultsrZCreateIoCompletionPortINVALID_HANDLE_VALUEr_iocp_cacherrrsrJ _unregistered_stopped_serving)r concurrencyr!r!r"rs  zIocpProactor.__init__cCs|jdurtddS)NzIocpProactor is closed)rrcrQr!r!r" _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdur0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srzz<%s %s> )lenrrrrUr rBjoin)rr+r!r!r"__repr__s     zIocpProactor.__repr__cCs ||_dSr<)r4)rrr!r!r"set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr<)rrR)rtimeoutrxr!r!r"selects  zIocpProactor.selectcCs|j}|||Sr<)r4rr?)rvaluerWr!r!r"_results  zIocpProactor._resultrcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr< getresultr3r\rZERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr6r!r!r" finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprZ Overlappedr isinstancesocketWSARecvrReadFileBrokenPipeErrorr _registerrconnnbytesrrrr!r!r"recvs     zIocpProactor.recvcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nrc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr<rrr!r!r"rs  z+IocpProactor.recv_into..finish_recv) rrZrrrr WSARecvIntor ReadFileIntorrr)rrbufrrrr!r!r" recv_intos     zIocpProactor.recv_intocCs^||tt}z||||WntyF|dYS0dd}||||S)N)rNc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr<rrr!r!r"rs  z*IocpProactor.recvfrom..finish_recv) rrZrr WSARecvFromrrrrrr!r!r"recvfroms    zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr<rrr!r!r" finish_send s  z(IocpProactor.sendto..finish_send)rrZrr WSASendTorr)rrrrrrrr!r!r"sendtos    zIocpProactor.sendtocCsZ||tt}t|tjr4||||n|||dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr<rrr!r!r"rs  z&IocpProactor.send..finish_send) rrZrrrrWSASendr WriteFiler)rrrrrrr!r!r"sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructpackr setsockoptr SOL_SOCKETrZSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrrrrlistenerr!r" finish_accept/sz*IocpProactor.accept..finish_acceptcs2z|IdHWntjy,|Yn0dSr<)rrr)r0rr!r!r" accept_coro8s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrZrrAcceptExrrr ensure_futurer4)rrrrrr0coror!rr"accept)s     zIocpProactor.acceptc sjtjkr4t||j}|d|S| zt j WnDt y}z,|j tjkrrddkrWYd}~n d}~00tt}||fdd}|||S)Nrrcs|tjtjdSrM)rrrrrZSO_UPDATE_CONNECT_CONTEXTrrrrr!r"finish_connect[s z,IocpProactor.connect..finish_connect)typer SOCK_DGRAMrZ WSAConnectrr4rr?r BindLocalrr3r\errno WSAEINVAL getsocknamerr ConnectExr)rrr)rWerrr!rr"connectEs"       zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr<rrr!r!r"finish_sendfilens  z.IocpProactor.sendfile..finish_sendfile) rrZrr TransmitFilermsvcrt get_osfhandler) rsockfileoffsetcountr offset_low offset_highrr!r!r"sendfileds      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr<)rrrr!r"finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrZrrConnectNamedPiperrr)rrr connectedrr!rr"rys    zIocpProactor.accept_pipec stt}zt|}WqjWn2tyH}z|jtjkr4WYd}~n d}~00t|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrZ ConnectPiper3r\ERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr r)rr)delayrKr6r!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)rrKrr!r!r"wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srp)r&ra)rrb done_callbackrWr!r!r"rnszIocpProactor._wait_cancelcs||durtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)N@@rrcsSr<)rRrrr!r"finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrNINFINITEmathceilrZrrRegisterWaitWithQueuerr)r`r4rdrr)rrKr _is_cancelmsrrLr+r!r*r"r&s$    zIocpProactor._wait_for_handlecCs0||jvr,|j|t||jdddSrM)rJrrZrrrrobjr!r!r"rs  z IocpProactor._register_with_iocpc Cs|t||jd}|jr$|jd=|jstz|dd|}Wn.tyh}z||WYd}~nd}~00||||||f|j|j <|Sr) rrr4rr#r3r=r?rr))rrr3callbackrrr r!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)rrrUrr!r!r"rlszIocpProactor._unregistercCst|}|d|SrM)rr)rrsr!r!r"rs  zIocpProactor._get_accept_socketc Cs|durt}n0|dkr tdnt|d}|tkr>tdt|j|}|durXqZd}|\}}}}z|j|\}} } } WnVt y|j r|j dd||||fd|dtj fvrt|Yq>Yn0| |jvr|q>|s>z| ||| } Wn<ty@} z"|| |j|WYd} ~ q>d} ~ 00|| |j|q>|jD]} |j| jdq`|jdS)Nrznegative timeoutr)ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r.status)r, ValueErrorr-r.rZGetQueuedCompletionStatusrrpopKeyErrorr4 get_debugr5rrNrkrr2doner3r=rrUr?rr)r)rrr1r6err transferredrr)rrr3r4rr r!r!r"rRsL           "  zIocpProactor._pollcCs|j|dSr<)rrr2r!r!r" _stop_serving>szIocpProactor._stop_servingc Cs|jdurdSt|jD]\}\}}}}|r6qt|trBqz |Wqty}z>|j durd||d}|j r|j |d<|j |WYd}~qd}~00qd}t } | |} |jr| t krtd|t | t |} ||qg|_t|jd|_dS)NzCancelling a future failedr-r1g?z,%r is running after closing for %.1f seconds)rlistritems cancelledrr`r2r3r4rr5time monotonicr debugrRrrNrk) rr)rWrr3r4r6r7 msg_update start_timenext_msgr!r!r"rDs>     $     zIocpProactor.closecCs |dSr<)rrQr!r!r"rsszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)rBrCrDrErrrrrrrrrrrrr rrrr'rnr&rrrlrrRr?rrr!r!r!r"rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr<)_procpoll_process_exited)r returncoderQr!r"r4~s z4_WindowsSubprocessTransport._start..callback) r PopenrIr4rer'intrHr) rrrrrrrrr4rr!rQr"_startys z"_WindowsSubprocessTransport._startN)rBrCrDrOr!r!r!r"rwsrc@seZdZeZdS)rN)rBrCrDr _loop_factoryr!r!r!r"rsrc@seZdZeZdS)rN)rBrCrDrrPr!r!r!r"rsr)2rEsysplatform ImportErrorrZrNrr-rrrrCrrrrrrrr r r logr __all__rr,ERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDrr#FuturerrGr`rdobjectroBaseSelectorEventLooprBaseProactorEventLooprrBaseSubprocessTransportrr BaseDefaultEventLoopPolicyrrrr!r!r!r"sX          0J4;e`