+e9l@sdZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddddgZdZdZdZdZdZdZGddde jZGddde jZGdddeZGdddeZGdd d e Z!Gd!d"d"e j"Z#Gd#dde j$Z%Gd$ddZ&Gd%d&d&e j'Z(e#Z)Gd'd(d(ej*Z+e+Z,dS))z.Selector and proactor event loops for Windows.N)events)base_subprocess)futures)proactor_events)selector_events)tasks) windows_utils) _overlapped) coroutine)loggerSelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyliigMbP?g?cseZdZdZddfddZfddZdd Zfd d Zfd d ZfddZ S)_OverlappedFuturezSubclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. loopNcs6tjd||jr)|jd=n||_dS)Nrr)super__init___source_traceback_ov)selfovr) __class__;/opt/alt/python34/lib64/python3.4/asyncio/windows_events.pyr-s  z_OverlappedFuture.__init__cs]tj}|jdk rY|jjr0dnd}|jdd||jjfn|S)NpendingZ completedrzoverlapped=<%s, %#x>)r _repr_inforrinsertaddress)rinfostate)rrrr3s #z_OverlappedFuture._repr_infocCs|jdkrdSy|jjWnitk r}zIidd6|d6|d6}|jrm|j|d)rrrr?s   z%_WaitHandleFuture._unregister_wait_cbcCs|js dSd|_|j}d|_ytj||jWntk r}z_|jtjkridd6|d6|d6}|jr|j|dtjk rT|rP|jnYnX|_|jdS) NrhrirzPipe accept failedr#r$razAccept pipe failed on pipe %rexc_infoTr)r0rTdiscardrZrbrkrYrI accept_piper(filenor*Z_debugr ZwarningrCancelledErrorrVadd_done_callback)rmrarnr+)r loop_accept_piperlrserverrrrwBs<           " z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)rPZ call_soon)rrlr r)r rwrlrrxrstart_serving_pipe>s !( z$ProactorEventLoop.start_serving_pipec kstjd|} t||||||||d| d|| } y | DdHWn+tk r|} z | } WYdd} ~ XnXd} | dk r| j| jDdH| n| S)Nrwaiterrh)rFuture_WindowsSubprocessTransport ExceptionrbZ_wait)rrnargsshellstdinstdoutstderrbufsizerhkwargsrzZtranspr+errrrr_make_subprocess_transportms      z,ProactorEventLoop._make_subprocess_transport) r1r2r3r4rrgr rpryrrr)rrr*s   /c@s6eZdZdZdddZddZddZd d d Zd d ZdddZ dddZ ddZ ddZ ddZ eddZd ddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd d)d*Zd+d,Zd-d.Zd/d0Zd S)1rz#Proactor implementation using IOCP.lcCsdd|_g|_tjtjtd||_i|_tj |_ g|_ tj |_ dS)Nr) r)_resultsr CreateIoCompletionPortINVALID_HANDLE_VALUEr[_iocp_cacherRrSr8 _unregistered_stopped_serving)rZ concurrencyrrrrs    zIocpProactor.__init__cCs)d|jjt|jt|jfS)Nz<%s overlapped#=%s result#=%s>)rr1lenrr)rrrr__repr__szIocpProactor.__repr__cCs ||_dS)N)r))rrrrrset_loopszIocpProactor.set_loopNcCs/|js|j|n|j}g|_|S)N)rr<)rtimeoutrXrrrselects    zIocpProactor.selectcCs&tjd|j}|j||S)Nr)rr{r)r/)rvaluer>rrr_results zIocpProactor._resultrc Cs|j|tjt}yHt|tjrM|j|j||n|j|j|Wnt k r|j dSYnXdd}|j |||S)NcSsay|jSWnLtk r\}z,|jtjkrGt|jnWYdd}~XnXdS)N) getresultr(r@r ERROR_NETNAME_DELETEDConnectionResetErrorr~)rokeyrr+rrr finish_recvs z&IocpProactor.recv..finish_recv) _register_with_iocpr Overlappedr[ isinstancesocketZWSARecvrtZReadFileBrokenPipeErrorr _register)rconnnbytesr_rrrrrrecvs   zIocpProactor.recvcCs|j|tjt}t|tjrJ|j|j||n|j|j|dd}|j |||S)NcSsay|jSWnLtk r\}z,|jtjkrGt|jnWYdd}~XnXdS)N)rr(r@r rrr~)rorrr+rrr finish_sends z&IocpProactor.send..finish_send) rr rr[rrZWSASendrtZ WriteFiler)rrbufr_rrrrrsends  zIocpProactor.sendcs|j|jjtjt}|jjjfdd}tdd}|j ||}||}t j |d|j |S)Ncs^|jtjdj}jtjtj|j j j fS)Nz@P) rstructZpackrt setsockoptr SOL_SOCKETr ZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rorrr)rlistenerrr finish_accepts    z*IocpProactor.accept..finish_acceptc ss6y |DdHWn"tjk r1|jYnXdS)N)rrurb)r%rrrr accept_coros   z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyr rr[ZAcceptExrtr rrZ ensure_futurer))rrrrrr%Zcoror)rrraccepts   zIocpProactor.acceptcs|jytjjjWnYtk r}z9|jtjkrWnj ddkrsnWYdd}~XnXtj t }|j j|fdd}|j ||S)Nrrcs'|jjtjtjdS)Nr)rrrrr ZSO_UPDATE_CONNECT_CONTEXT)rorr)rrrfinish_connects   z,IocpProactor.connect..finish_connect)rr Z BindLocalrtrr(r@errnoZ WSAEINVALZ getsocknamerr[Z ConnectExr)rrr errr)rrconnects zIocpProactor.connectcsi|jtjt}|jj}|rD|jSfdd}|j||S)Ncs|jS)N)r)rorr)rarrfinish_accept_pipes z4IocpProactor.accept_pipe..finish_accept_pipe)rr rr[ZConnectNamedPipertrr)rrarZ connectedrr)rarrss  zIocpProactor.accept_pipeccst}xytj|}PWn=tk r\}z|jtjkrJnWYdd}~XnXt|dt}tj |d|j DdHq Wt j |S)Nr) CONNECT_PIPE_INIT_DELAYr Z ConnectPiper(r@ZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYrZsleepr)r r\)rr Zdelayr9r+rrrrjszIocpProactor.connect_pipecCs|j||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)rr9rrrrwait_for_handle*szIocpProactor.wait_for_handlecCs"|j|dd}||_|S)NT)rrD)rrEZ done_callbackr>rrrrO2s zIocpProactor._wait_cancelcs|dkrtj}ntj|d}tjt}tj||j|j |}|r|t |||d|j nt ||||d|j j rj d=nfdd}|d|f|j|j <S)Ng@@rrcs jS)N)r<)rorr)rmrrfinish_wait_for_handleMsz=IocpProactor._wait_for_handle..finish_wait_for_handlerr)r;INFINITEmathceilr rr[ZRegisterWaitWithQueuerr rCr)rHrr)rr9rZ _is_cancelmsrr:rr)rmrr9s      zIocpProactor._wait_for_handlecCsE||jkrA|jj|tj|j|jddndS)Nr)r8r]r rrtr)robjrrrrYsz IocpProactor._register_with_iocpcCst|d|j}|jr+|jd=n|jsy|dd|}Wn2tk r~}z|j|WYdd}~XqX|j|n||||f|j|j<|S)Nrrr) rr)rrr(r.r/rr )rrrcallbackrmrrrrrrcs     zIocpProactor._registercCs|jj|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)rr=)rrrrrrNszIocpProactor._unregistercCs tj|}|jd|S)Nr)rr)rrsrrrrs zIocpProactor._get_accept_socketcCs|dkrt}nI|dkr0tdn.tj|d}|tkr^tdnxtj|j|}|dkrPnd}|\}}}}y"|jj|\}} } } Wnzt k r<|j j r|j j idd6d||||fd6n|dtj fkr5tj|nwaYnX| |jkrY|jqa|jsay| ||| } WnBtk r} z"|j| |jj|WYdd} ~ XqX|j| |jj|qaqaWx'|jD]} |jj| jdqW|jjdS) Nrznegative timeoutg@@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventr#z)err=%s transferred=%s key=%#x address=%#xstatus)r ValueErrorrrr ZGetQueuedCompletionStatusrrpopKeyErrorr)Z get_debugr*rr;rMrr'doner(r.rr=r/rr rc)rrrrrZ transferredrr rmrrrrrrrrr<sJ     "     # zIocpProactor._pollcCs|jj|dS)N)rr])rrrrr _stop_servingszIocpProactor._stop_servingcCsFxt|jjD]\}\}}}}|jr=qt|trOqy|jWqtk r}z[|jdk ridd6|d6|d6}|j r|j |drrrr+r,rrrrbs..   *  zIocpProactor.closecCs|jdS)N)rb)rrrrrdszIocpProactor.__del__)r1r2r3r4rrrrrrrrrrsr rjrrOrrrrNrr<rrbrdrrrrrs.          7  c@seZdZddZdS)r|c swtj|d|d|d|d|d||_fdd}jjjtjj} | j|dS)Nrrrrrcs jj}j|dS)N)_procZpollZ_process_exited)rm returncode)rrrrsz4_WindowsSubprocessTransport._start..callback) r Popenrr)rIrintr6rv) rr~rrrrrrrrmr)rr_starts !z"_WindowsSubprocessTransport._startN)r1r2r3rrrrrr|s r|c@seZdZeZdS)_WindowsDefaultEventLoopPolicyN)r1r2r3r Z _loop_factoryrrrrrs r)-r4r;rrrrrRrrrrrrr r Z coroutinesr logr __all__r[rZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrr{rr5rCrHobjectrPZBaseSelectorEventLoopreZBaseProactorEventLooprrZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrrrrrrsJ        0J4;]j