î j f9lã@sdZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddddgZdZdZdZdZdZdZGdd„de jƒZGdd„de jƒZGdd„deƒZGdd„deƒZGdd „d e ƒZ!Gd!d"„d"e j"ƒZ#Gd#d„de j$ƒZ%Gd$d„dƒZ&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)ÚloggerÚSelectorEventLoopÚProactorEventLoopÚ IocpProactorÚDefaultEventLoopPolicylÿÿiÉiÔgü©ñÒMbP?gš™™™™™¹?cs‚eZdZdZdd‡fdd†Z‡fdd†Zdd „Z‡fd d †Z‡fd d †Z‡fdd†Z ‡S)Ú_OverlappedFuturez†Subclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. ÚloopNcs6tƒjd|ƒ|jr)|jd=n||_dS)Nrréÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr)Ú __class__©ú;/opt/alt/python34/lib64/python3.4/asyncio/windows_events.pyr-s  z_OverlappedFuture.__init__cs]tƒjƒ}|jdk rY|jjr0dnd}|jdd||jjfƒn|S)NÚpendingZ completedrzoverlapped=<%s, %#x>)rÚ _repr_inforrÚinsertÚaddress)rÚinfoÚstate)rrrr3s #z_OverlappedFuture._repr_infocCs�|jdkrdSy|jjƒWnitk r�}zIidd6|d6|d6}|jrm|j|d)rrrr?¼s   z%_WaitHandleFuture._unregister_wait_cbcCsã|js dSd|_|j}d|_ytj||jƒWntk rÀ}z_|jtjkr®idd6|d6|d6}|jrš|j|dtjk rT|rP|jƒnYnX|ˆ_|jˆƒdS) NrhrirzPipe accept failedr#r$razAccept pipe failed on pipe %rÚexc_infoTr)r0rTÚdiscardrZrbrkrYrIÚ accept_piper(Úfilenor*Z_debugr ZwarningrÚCancelledErrorrVÚadd_done_callback)rmrarnr+)r Úloop_accept_piperlrÚserverrrrwBs<           " z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)rPZ call_soon)rrlr r)r rwrlrrxrÚstart_serving_pipe>s !( z$ProactorEventLoop.start_serving_pipec ksµtjd|ƒ} t||||||||d| d|| �} y | DdHWn+tk r|} z | } WYdd} ~ XnXd} | dk r±| jƒ| jƒDdH| ‚n| S)NrÚwaiterrh)rÚFutureÚ_WindowsSubprocessTransportÚ ExceptionrbZ_wait)rrnÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizerhÚkwargsrzZtranspr+ÚerrrrrÚ_make_subprocess_transportms      z,ProactorEventLoop._make_subprocess_transport) r1r2r3r4rrgr rpryr†rr)rrr*s   /c@s6eZdZdZddd„Zdd„Zdd„Zd d d „Zd d „Zddd„Z ddd„Z dd„Z dd„Z dd„Z edd„ƒZd dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd d)d*„Zd+d,„Zd-d.„Zd/d0„Zd S)1rz#Proactor implementation using IOCP.lÿÿcCsdd|_g|_tjtjtd|ƒ|_i|_tj ƒ|_ g|_ tj ƒ|_ dS)Nr) r)Ú_resultsr ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr[Ú_iocpÚ_cacherRrSr8Ú _unregisteredÚ_stopped_serving)rZ concurrencyrrrrŠs    zIocpProactor.__init__cCs)d|jjt|jƒt|jƒfS)Nz<%s overlapped#=%s result#=%s>)rr1Úlenr‹r‡)rrrrÚ__repr__”szIocpProactor.__repr__cCs ||_dS)N)r))rrrrrÚset_loop™szIocpProactor.set_loopNcCs/|js|j|ƒn|j}g|_|S)N)r‡r<)rÚtimeoutrXrrrÚselectœs    zIocpProactor.selectcCs&tjd|jƒ}|j|ƒ|S)Nr)rr{r)r/)rÚvaluer>rrrÚ_result£s zIocpProactor._resultrc Cs¥|j|ƒtjtƒ}yHt|tjƒrM|j|jƒ||ƒn|j|jƒ|ƒWnt k r…|j dƒSYnXdd„}|j |||ƒS)NócSsay|jƒSWnLtk r\}z,|jtjkrGt|jŒ‚n‚WYdd}~XnXdS)N)Ú getresultr(r@r ÚERROR_NETNAME_DELETEDÚConnectionResetErrorr~)roÚkeyrr+rrrÚ finish_recv³s z&IocpProactor.recv..finish_recv) Ú_register_with_iocpr Ú Overlappedr[Ú isinstanceÚsocketZWSARecvrtZReadFileÚBrokenPipeErrorr”Ú _register)rÚconnÚnbytesr_rršrrrÚrecv¨s   zIocpProactor.recvcCs|j|ƒtjtƒ}t|tjƒrJ|j|jƒ||ƒn|j|jƒ|ƒdd„}|j |||ƒS)NcSsay|jƒSWnLtk r\}z,|jtjkrGt|jŒ‚n‚WYdd}~XnXdS)N)r–r(r@r r—r˜r~)ror™rr+rrrÚ finish_sendÆs z&IocpProactor.send..finish_send) r›r rœr[r�ržZWSASendrtZ WriteFiler )rr¡Úbufr_rr¤rrrÚsend¾s  zIocpProactor.sendcs¯|jˆƒ|jˆjƒ‰tjtƒ}|jˆjƒˆjƒƒ‡‡fdd†}tdd„ƒ}|j |ˆ|ƒ}||ˆƒ}t j |d|j ƒ|S)Ncs^|jƒtjdˆjƒƒ}ˆjtjtj|ƒˆj ˆj ƒƒˆˆj ƒfS)Nz@P) r–ÚstructZpackrtÚ setsockoptržÚ SOL_SOCKETr ZSO_UPDATE_ACCEPT_CONTEXTÚ settimeoutZ gettimeoutZ getpeername)ror™rr¥)r¡ÚlistenerrrÚ finish_accept×s    z*IocpProactor.accept..finish_acceptc ss6y |DdHWn"tjk r1|jƒ‚YnXdS)N)rrurb)r%r¡rrrÚ accept_coroàs   z(IocpProactor.accept..accept_coror) r›Ú_get_accept_socketÚfamilyr rœr[ZAcceptExrtr r rZ ensure_futurer))rr«rr¬r­r%Zcoror)r¡r«rÚacceptÑs   zIocpProactor.acceptcsÐ|jˆƒytjˆjƒˆjƒWnYtk r…}z9|jtjkrW‚nˆj ƒddkrs‚nWYdd}~XnXtj t ƒ}|j ˆjƒ|ƒ‡fdd†}|j |ˆ|ƒS)Nrrcs'|jƒˆjtjtjdƒˆS)Nr)r–r¨ržr©r ZSO_UPDATE_CONNECT_CONTEXT)ror™r)r¡rrÚfinish_connectüs   z,IocpProactor.connect..finish_connect)r›r Z BindLocalrtr¯r(r@ÚerrnoZ WSAEINVALZ getsocknamerœr[Z ConnectExr )rr¡r Úerr±r)r¡rÚconnectîs zIocpProactor.connectcsi|jˆƒtjtƒ}|jˆjƒƒ}|rD|jˆƒS‡fdd†}|j|ˆ|ƒS)Ncs|jƒˆS)N)r–)ror™r)rarrÚfinish_accept_pipes z4IocpProactor.accept_pipe..finish_accept_pipe)r›r rœr[ZConnectNamedPipertr”r )rrarZ connectedrµr)rarrss  zIocpProactor.accept_pipeccsœt}x†ytj|ƒ}PWn=tk r\}z|jtjkrJ‚nWYdd}~XnXt|dtƒ}tj |d|j ƒDdHq Wt j |ƒS)Nér) ÚCONNECT_PIPE_INIT_DELAYr Z ConnectPiper(r@ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYrZsleepr)r r\)rr Zdelayr9r+rrrrjszIocpProactor.connect_pipecCs|j||dƒS)z°Wait 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)rr9r‘rrrÚwait_for_handle*szIocpProactor.wait_for_handlecCs"|j|ddƒ}||_|S)NT)rºrD)rrEZ done_callbackr>rrrrO2s zIocpProactor._wait_cancelcsâ|dkrtj}ntj|dƒ}tjtƒ}tj||j|j |ƒ}|r|t |||d|j ƒ‰nt ||||d|j ƒ‰ˆj r°ˆj d=n‡fdd†}ˆ|d|f|j|j <ˆS)Ng@�@rrcs ˆjƒS)N)r<)ror™r)rmrrÚfinish_wait_for_handleMsz=IocpProactor._wait_for_handle..finish_wait_for_handlerr)r;ÚINFINITEÚmathÚceilr rœr[ZRegisterWaitWithQueuerŠr rCr)rHrr‹)rr9r‘Z _is_cancelÚmsrr:r¼r)rmrrº9s      zIocpProactor._wait_for_handlecCsE||jkrA|jj|ƒtj|jƒ|jddƒndS)Nr)r8r]r rˆrtrŠ)rÚobjrrrr›Ysz IocpProactor._register_with_iocpcCs¯t|d|jƒ}|jr+|jd=n|js�y|dd|ƒ}Wn2tk r~}z|j|ƒWYdd}~Xq�X|j|ƒn||||f|j|j<|S)Nrrr) rr)rrr(r.r/r‹r )rrrÁÚcallbackrmr“r³rrrr cs     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)rŒr=)rrrrrrN�szIocpProactor._unregistercCs tj|ƒ}|jdƒ|S)Nr)ržrª)rr¯Úsrrrr®Šs zIocpProactor._get_accept_socketcCs|dkrt}nI|dkr0tdƒ‚n.tj|dƒ}|tkr^tdƒ‚nxƒtj|j|ƒ}|dkr†Pnd}|\}}}}y"|jj|ƒ\}} } } Wnzt k r<|j j ƒr|j j idd6d||||fd6ƒn|dtj fkr5tj|ƒnwaYnX| |jkrY|jƒqa|jƒsay| ||| ƒ} WnBtk r¿} z"|j| ƒ|jj|ƒWYdd} ~ XqàX|j| ƒ|jj|ƒqaqaWx'|jD]} |jj| jdƒqîW|jjƒdS) Nrznegative timeoutg@�@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventr#z)err=%s transferred=%s key=%#x address=%#xÚstatus)r½Ú ValueErrorr¾r¿r ZGetQueuedCompletionStatusrŠr‹ÚpopÚKeyErrorr)Z get_debugr*r‰r;rMr�r'Údoner(r.r‡r=r/rŒr rc)rr‘rÀrÄr…Z transferredr™r rmrrÁrÂr“r³rrrr<�sJ     "     # zIocpProactor._pollcCs|jj|ƒdS)N)r�r])rrÁrrrÚ _stop_servingÆszIocpProactor._stop_servingcCsFxÜt|jjƒƒD]Å\}\}}}}|jƒr=qt|tƒrOqy|jƒWqtk rÚ}z[|jdk rÈidd6|d6|d6}|j rµ|j |drrÁrÂr+r,rrrrbÌs..   *  zIocpProactor.closecCs|jƒdS)N)rb)rrrrrdìszIocpProactor.__del__)r1r2r3r4rr�r�r’r”r£r¦r°r´rsr rjr»rOrºr›r rNr®r<rÉrbrdrrrrr‡s.          7  c@seZdZdd„ZdS)r|c swtj|d|d|d|d|d||�ˆ_‡fdd†}ˆjjjtˆjjƒƒ} | j|ƒdS)Nrr€r�r‚rƒcs ˆjjƒ}ˆj|ƒdS)N)Ú_procZpollZ_process_exited)rmÚ returncode)rrrrÂ÷sz4_WindowsSubprocessTransport._start..callback) r ÚPopenrÍr)rIr»Úintr6rv) rr~rr€r�r‚rƒr„rÂrmr)rrÚ_startòs !z"_WindowsSubprocessTransport._startN)r1r2r3rÑrrrrr|ðs r|c@seZdZeZdS)Ú_WindowsDefaultEventLoopPolicyN)r1r2r3r Z _loop_factoryrrrrrÒs rÒ)-r4r;r²r¾ržr§rRÚrrrrrrr r Z coroutinesr Úlogr Ú__all__r[r½ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr·r¹r{rr5rCrHÚobjectrPZBaseSelectorEventLoopreZBaseProactorEventLooprrZBaseSubprocessTransportr|r ZBaseDefaultEventLoopPolicyrÒrrrrrÚsJ        0J4;]ÿj