a  ze@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 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__J/opt/bitninja-python-dojo/embedded/lib/python3.9/asyncio/windows_events.pyr1sz_OverlappedFuture.__init__csHt}|jdurD|jjr dnd}|dd|d|jjdd|S)NpendingZ completedrz overlapped=)r _repr_inforr"insertaddressrinfostaterr r!r%7s    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_overlapped>s  "z$_OverlappedFuture._cancel_overlappedcs|tj|dSN)msg)r6rr0rr8rr r!r0Nsz_OverlappedFuture.cancelcst||dSN)r set_exceptionr6rr-rr r!r;Rs z_OverlappedFuture.set_exceptioncst|d|_dSr:)r set_resultrrresultrr r!r=Vs z_OverlappedFuture.set_result)N) __name__ __module__ __qualname____doc__rr%r6r0r;r= __classcell__r r rr!r+s  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!r^sz_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiZWaitForSingleObjectrFZ WAIT_OBJECT_0rr r r!_pollls z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdurB|r4dnd}|||jdur`|d|jd|S)Nzhandle=r#signaledZwaitingz wait_handle=)rr%appendrFrNrGr(rr r!r%qs    z _BaseWaitHandleFuture._repr_infocCs d|_dSr:)rrfutr r r!_unregister_wait_cb{sz)_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+r/) rHrG _overlappedZUnregisterWaitr1winerrorERROR_IO_PENDINGrr2r3rSrrJr4r5r r r!_unregister_waits$   $z&_BaseWaitHandleFuture._unregister_waitcs|tj|dSr7)rYrr0r9rr r!r0sz_BaseWaitHandleFuture.cancelcs|t|dSr:)rYrr;r<rr r!r;sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr:)rYrr=r>rr r!r=sz _BaseWaitHandleFuture.set_result)N) r@rArBrCrrNr%rSrYr0r;r=rDr r rr!rE[s  rEcsFeZdZdZddfdd 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)rreventrJrrr r!rsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrMr r r!r0sz_WaitCancelFuture.cancelcs$t||jdur ||dSr:)rr=r[r>rr r!r=s  z_WaitCancelFuture.set_resultcs$t||jdur ||dSr:)rr;r[r<rr r!r;s  z_WaitCancelFuture.set_exception) r@rArBrCrr0r=r;rDr r rr!rZs  rZcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrUZ CreateEvent_event _event_fut)rrrIrJproactorrrr r!rs z_WaitHandleFuture.__init__csF|jdur"t|jd|_d|_|j|jd|_t|dSr:) r`rL CloseHandlerar_ _unregisterrrrSrQrr r!rSs   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 |_dSrT)rHrGrUZUnregisterWaitExr`r1rVrWrr2r3r_ _wait_cancelrSrarXr r r!rYs(   $ z"_WaitHandleFuture._unregister_wait)r@rArBrrSrYrDr 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)rlrn)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:)closedrLZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperhZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr BUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerkadd)rfirstflagshpiper r r!rns"     zPipeServer._server_pipe_handlecCs |jduSr:)rhrMr r r!rqszPipeServer.closedcCsR|jdur|jd|_|jdurN|jD] }|q*d|_d|_|jdSr:)rmr0rhrkcloserlclear)rryr r r!rzs     zPipeServer.closeN) r@rArBrCrrprnrqrz__del__r r r r!rfs  rfc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r@rArBrCr r r r!r},sr}csHeZdZdZd fdd ZfddZddZd d Zdd d ZZ S)r z2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr:)rrr)rrbrr r!r3szProactorEventLoop.__init__c sz^|jdusJ||jtW|jdur|jj}|j|durX|j|d|_n8|jdur|jj}|j|dur|j|d|_0dSr:) Z_self_reading_future call_soonZ_loop_self_readingr run_foreverrr0r_rdrrrr r!r8s         zProactorEventLoop.run_forevercs8|j|}|IdH}|}|j||d|id}||fS)Naddrextra)r_ connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr'fryprotocoltransr r r!create_pipe_connectionKs  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-ryzAccept pipe failed on pipe %rT)exc_info)r?rkdiscardrqrzrrpr_ accept_piper1filenor3Z_debugr warningrCancelledErrorrmadd_done_callback)rryrr4r'loop_accept_piperrZserverr r!rVsB   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rfr~)rrr'r rr!start_serving_pipeSs( z$ProactorEventLoop.start_serving_pipec s|} t||||||||f| |d| } z| IdHWn@ttfyRYn*tyz| | IdHYn0| S)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionrz_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrZtranspr r r!_make_subprocess_transports"  z,ProactorEventLoop._make_subprocess_transport)N)N) r@rArBrCrrrrrrDr 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 |_ dSrK) r2_resultsrUCreateIoCompletionPortINVALID_HANDLE_VALUErs_iocp_cacherirjrH _unregistered_stopped_serving)rZ concurrencyr r r!rs  zIocpProactor.__init__cCs|jdurtddS)NzIocpProactor is closed)rr]rMr r r! _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdur0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srqz<%s %s> )lenrrrrPrr@join)rr)r r r!__repr__s     zIocpProactor.__repr__cCs ||_dSr:)r2)rrr r r!set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr:)rrN)rtimeoutror r r!selects  zIocpProactor.selectcCs|j}|||Sr:)r2rr=)rvaluerRr r r!_results  zIocpProactor._resultrcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr: getresultr1rVrUZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr4r r r! finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprU Overlappedrs isinstancesocketZWSARecvrZReadFileBrokenPipeErrorr _registerrconnnbytesrwrrr 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) rrUrrsrrZ WSARecvIntorZ ReadFileIntorrr)rrbufrwrrr 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) rrUrrsZ WSARecvFromrrrrrr r r!recvfroms    zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr:rrr r r! finish_sends  z(IocpProactor.sendto..finish_send)rrUrrsZ WSASendTorr)rrrrwrrrr 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) rrUrrsrrZWSASendrZ WriteFiler)rrrrwrrr r r!sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructpackr setsockoptr SOL_SOCKETrUZSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrrrrlistenerr r! finish_accept*sz*IocpProactor.accept..finish_acceptcs2z|IdHWntjy,|Yn0dSr:)rrrz)r.rr r r! accept_coro3s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrUrrsZAcceptExrrr Z ensure_futurer2)rrrrrr.coror rr!accept$s     zIocpProactor.acceptc sjtjkr4t||j}|d|S| zt j WnDt y}z,|j tjkrrddkrWYd}~n d}~00tt}||fdd}|||S)Nrrcs|tjtjdSrK)rrrrrUZSO_UPDATE_CONNECT_CONTEXTrrrrr r!finish_connectVs z,IocpProactor.connect..finish_connect)typer SOCK_DGRAMrUZ WSAConnectrr2rr=rZ BindLocalrr1rVerrnoZ WSAEINVAL getsocknamerrsZ ConnectExr)rrr'rRerrr rr!connect@s"       zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr:rrr r r!finish_sendfileis  z.IocpProactor.sendfile..finish_sendfile) rrUrrsZ TransmitFilermsvcrtZ get_osfhandler) rsockfileoffsetcountrZ offset_lowZ offset_highrr r r!sendfile_s      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr:)rrryr r!finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrUrrsZConnectNamedPiperrr)rryrZ connectedrr rr!rts    zIocpProactor.accept_pipec stt}zt|}WqjWn2tyH}z|jtjkr4WYd}~n d}~00t|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrUZ ConnectPiper1rVZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr rt)rr'delayrIr4r 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)rrIrr r r!wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srg)rr[)rr\Z done_callbackrRr r r!reszIocpProactor._wait_cancelcs||durtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)N@@rrcsSr:)rNrrr r!finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrLINFINITEmathceilrUrrsZRegisterWaitWithQueuerr'rZr2r^rr)rrIrZ _is_cancelmsrrJrr rr!rs$    zIocpProactor._wait_for_handlecCs0||jvr,|j|t||jdddSrK)rHrurUrrrrobjr 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) rrr2rr"r1r;r=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)rrrPrr r r!rdszIocpProactor._unregistercCst|}|d|SrK)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 timeoutrztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r,status)r ValueErrorrrrUZGetQueuedCompletionStatusrrpopKeyErrorr2Z get_debugr3rrLrcrr0doner1r;rrPr=rr'r{)rrrrerrZ transferredrr'rrrrrrr r r!rNsL           "  zIocpProactor._pollcCs|j|dSr:)rrurr r r! _stop_serving9szIocpProactor._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+r/g?z,%r is running after closing for %.1f seconds)rlistritems cancelledrrZr0r1r2rr3time monotonicr debugrNrrLrc) rr'rRrrrr4r5Z msg_updateZ start_timeZnext_msgr r r!rz?s>     $     zIocpProactor.closecCs |dSr:)rzrMr r r!r|nszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)r@rArBrCrrrrrrrrrrrrrrrrrrerrrrdrrNrrzr|r r r r!rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr:)_procpollZ_process_exited)r returncoderMr r!rys z4_WindowsSubprocessTransport._start..callback) r Popenrr2r_rintrFr) rrrrrrrrrrr rMr!_startts z"_WindowsSubprocessTransport._startN)r@rArBrr r r r!rrsrc@seZdZeZdS)rN)r@rArBr _loop_factoryr r r r!rsrc@seZdZeZdS)rN)r@rArBr rr r r r!rsr)/rCrUrLrrrrrr rirrrrrrr r logr __all__rsrZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrFuturerrErZr^objectrfZBaseSelectorEventLoopr}ZBaseProactorEventLoopr rZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr r r r!sR         0J4;e`