U e5dÛ¿ã@sÖdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddl mZddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddlmZdZe jdkrþedƒ‚dd„ZGdd„dejƒZGdd„dej ƒZ!Gdd„dej"ej#ƒZ$Gdd„dej%ƒZ&Gdd„dƒZ'dd„Z(Gd d!„d!e'ƒZ)Gd"d#„d#e)ƒZ*Gd$d%„d%e)ƒZ+Gd&d'„d'e'ƒZ,Gd(d)„d)e'ƒZ-Gd*d+„d+ej.ƒZ/eZ0e/Z1dS),z2Selector event loop for Unix with signal handling.éNé)Ú base_events)Úbase_subprocess)Ú constants)Ú coroutines)Úevents)Ú exceptions)Úfutures)Úselector_events)Útasks)Ú transports)Úlogger)ÚSelectorEventLoopÚAbstractChildWatcherÚSafeChildWatcherÚFastChildWatcherÚMultiLoopChildWatcherÚThreadedChildWatcherÚDefaultEventLoopPolicyZwin32z+Signals are not really supported on WindowscCsdS)zDummy signal handler.N©)ÚsignumÚframerrú+/usr/lib64/python3.8/asyncio/unix_events.pyÚ_sighandler_noop*srcsÊeZdZdZd)‡fdd„ Z‡fdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z d*dd„Z d+dd„Z d,dd„Z dd„Zd-dddddœdd„Zd.ddddddœdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Z‡ZS)/Ú_UnixSelectorEventLoopzdUnix event loop. Adds signal handling and UNIX Domain Socket support to SelectorEventLoop. Ncstƒ |¡i|_dS©N)ÚsuperÚ__init__Ú_signal_handlers)ÚselfÚselector©Ú __class__rrr5s z_UnixSelectorEventLoop.__init__csZtƒ ¡t ¡s.t|jƒD]}| |¡qn(|jrVtjd|›d�t |d�|j  ¡dS)NzClosing the loop z@ on interpreter shutdown stage, skipping signal handlers removal©Úsource) rÚcloseÚsysÚ is_finalizingÚlistrÚremove_signal_handlerÚwarningsÚwarnÚResourceWarningÚclear©rÚsigr!rrr%9s üz_UnixSelectorEventLoop.closecCs|D]}|sq| |¡qdSr)Ú_handle_signal)rÚdatarrrrÚ_process_self_dataGsz)_UnixSelectorEventLoop._process_self_datac GsLt |¡st |¡rtdƒ‚| |¡| ¡zt |j  ¡¡Wn2t t fk rt}zt t |ƒƒ‚W5d}~XYnXt |||d¡}||j|<zt |t¡t |d¡Wnšt k �rF}zz|j|=|j�szt d¡Wn4t t fk �r}zt d|¡W5d}~XYnX|jtjk�r4t d|›d�ƒ‚n‚W5d}~XYnXdS)zÃAdd a handler for a signal. UNIX only. Raise ValueError if the signal number is invalid or uncatchable. Raise RuntimeError if there is a problem setting up the handler. z3coroutines cannot be used with add_signal_handler()NFéÿÿÿÿúset_wakeup_fd(-1) failed: %súsig ú cannot be caught)rZ iscoroutineZiscoroutinefunctionÚ TypeErrorÚ _check_signalZ _check_closedÚsignalÚ set_wakeup_fdZ_csockÚfilenoÚ ValueErrorÚOSErrorÚ RuntimeErrorÚstrrZHandlerrÚ siginterruptr ÚinfoÚerrnoÚEINVAL)rr/ÚcallbackÚargsÚexcÚhandleZnexcrrrÚadd_signal_handlerNs2 ÿ   z)_UnixSelectorEventLoop.add_signal_handlercCs8|j |¡}|dkrdS|jr*| |¡n | |¡dS)z2Internal helper that is the actual signal handler.N)rÚgetZ _cancelledr)Z_add_callback_signalsafe)rr/rGrrrr0{s   z%_UnixSelectorEventLoop._handle_signalc Csæ| |¡z |j|=Wntk r,YdSX|tjkr@tj}ntj}zt ||¡WnBtk r˜}z$|jtj kr†t d|›d�ƒ‚n‚W5d}~XYnX|jsâzt  d¡Wn2t tfk rà}zt  d|¡W5d}~XYnXdS)zwRemove a handler for a signal. UNIX only. Return True if a signal handler was removed, False if not. Fr5r6Nr3r4T)r8rÚKeyErrorr9ÚSIGINTÚdefault_int_handlerÚSIG_DFLr=rBrCr>r:r<r rA)rr/ÚhandlerrFrrrr)…s(    z,_UnixSelectorEventLoop.remove_signal_handlercCs6t|tƒstd|›�ƒ‚|t ¡kr2td|›�ƒ‚dS)zÁInternal helper to validate a signal. Raise ValueError if the signal number is invalid or uncatchable. Raise RuntimeError if there is a problem setting up the handler. zsig must be an int, not zinvalid signal number N)Ú isinstanceÚintr7r9Ú valid_signalsr<r.rrrr8¥s  z$_UnixSelectorEventLoop._check_signalcCst|||||ƒSr)Ú_UnixReadPipeTransport©rÚpipeÚprotocolÚwaiterÚextrarrrÚ_make_read_pipe_transport±sz0_UnixSelectorEventLoop._make_read_pipe_transportcCst|||||ƒSr)Ú_UnixWritePipeTransportrSrrrÚ_make_write_pipe_transportµsz1_UnixSelectorEventLoop._make_write_pipe_transportc Ës¼t ¡�ª} |  ¡stdƒ‚| ¡} t||||||||f| |dœ| —Ž} |  |  ¡|j| ¡z| IdHWnDt t fk r‚‚Yn,t k r¬|   ¡|   ¡IdH‚YnXW5QRX| S)NzRasyncio.get_child_watcher() is not activated, subprocess support is not installed.)rVrW)rÚget_child_watcherÚ is_activer>Ú create_futureÚ_UnixSubprocessTransportÚadd_child_handlerZget_pidÚ_child_watcher_callbackÚ SystemExitÚKeyboardInterruptÚ BaseExceptionr%Z_wait) rrUrEÚshellÚstdinÚstdoutÚstderrÚbufsizerWÚkwargsÚwatcherrVÚtransprrrÚ_make_subprocess_transport¹s8  ÿþý ÿz1_UnixSelectorEventLoop._make_subprocess_transportcCs| |j|¡dSr)Úcall_soon_threadsafeZ_process_exited)rÚpidÚ returncoderkrrrr`×sz._UnixSelectorEventLoop._child_watcher_callback)ÚsslÚsockÚserver_hostnameÚssl_handshake_timeoutc Ãs |r|dkr6tdƒ‚n |dk r&tdƒ‚|dk r6tdƒ‚|dk r¤|dk rNtdƒ‚t |¡}t tjtjd¡}z | d¡| ||¡IdHWqä| ¡‚YqäXn@|dkr´tdƒ‚|j tjksÌ|j tjkrÚtd|›�ƒ‚| d¡|j |||||d �IdH\}}||fS) Nz/you have to pass server_hostname when using sslz+server_hostname is only meaningful with sslú1ssl_handshake_timeout is only meaningful with sslú3path and sock can not be specified at the same timerFzno path and sock were specifiedú.A UNIX Domain Stream Socket was expected, got )rs) r<ÚosÚfspathÚsocketÚAF_UNIXÚ SOCK_STREAMÚ setblockingZ sock_connectr%ÚfamilyÚtypeZ_create_connection_transport) rÚprotocol_factoryÚpathrprqrrrsÚ transportrUrrrÚcreate_unix_connectionÚsRÿÿÿ     ÿÿ þz-_UnixSelectorEventLoop.create_unix_connectionédT)rqÚbacklogrprsÚ start_servingc ÃsÊt|tƒrtdƒ‚|dk r&|s&tdƒ‚|dk �rH|dk r@tdƒ‚t |¡}t tjtj¡}|ddkrÊz t   t  |¡j ¡r„t  |¡WnBt k ršYn0tk rÈ}zt d||¡W5d}~XYnXz| |¡Wnltk �r0} z8| ¡| jtjk�rd|›d�} ttj| ƒd‚n‚W5d} ~ XYn| ¡‚YnXn<|dk�rZtd ƒ‚|jtjk�sv|jtjk�r„td |›�ƒ‚| d ¡t ||g||||¡} |�rÆ|  ¡tjd|d �IdH| S) Nz*ssl argument must be an SSLContext or Nonertrur)rúz2Unable to check or remove stale UNIX socket %r: %rzAddress z is already in usez-path was not specified, and no sock specifiedrvF)Úloop)rOÚboolr7r<rwrxryrzr{ÚstatÚS_ISSOCKÚst_modeÚremoveÚFileNotFoundErrorr=r ÚerrorZbindr%rBZ EADDRINUSEr}r~r|rZServerZ_start_servingr Úsleep) rrr€rqr„rprsr…ÚerrrFÚmsgZserverrrrÚcreate_unix_serversn  ÿ ÿ  ÿ   ÿ ÿÿ  ÿz)_UnixSelectorEventLoop.create_unix_serverc Ãsôz tjWn,tk r6}zt d¡‚W5d}~XYnXz | ¡}Wn2ttjfk rv}zt d¡‚W5d}~XYnXzt |¡j }Wn,t k r´}zt d¡‚W5d}~XYnX|r¾|n|} | sÊdS|  ¡} |  | d||||| d¡| IdHS)Nzos.sendfile() is not availableznot a regular filer) rwÚsendfileÚAttributeErrorrÚSendfileNotAvailableErrorr;ÚioÚUnsupportedOperationÚfstatÚst_sizer=r]Ú_sock_sendfile_native_impl) rrqÚfileÚoffsetÚcountrFr;r�ZfsizeÚ blocksizeÚfutrrrÚ_sock_sendfile_nativeJs2 ÿ   ÿz,_UnixSelectorEventLoop._sock_sendfile_nativec Cs,| ¡} |dk r| |¡| ¡r4| |||¡dS|rd||}|dkrd| |||¡| |¡dSzt | |||¡} W�nDttfk rÆ|dkr¢|  ||¡|  | |j || ||||||¡ Y�nbt k �rj} z†|dk �r| j t jk�rt| ƒtk �rtdt jƒ} | | _| } |dk�rBt d¡} | |||¡| | ¡n| |||¡| | ¡W5d} ~ XYn¾ttfk �r„‚Yn¤tk �r¾} z| |||¡| | ¡W5d} ~ XYnjX| dk�rä| |||¡| |¡nD|| 7}|| 7}|dk�r |  ||¡|  | |j || ||||||¡ dS)Nrzsocket is not connectedzos.sendfile call failed)r;Ú remove_writerÚ cancelledÚ_sock_sendfile_update_fileposZ set_resultrwr“ÚBlockingIOErrorÚInterruptedErrorÚ_sock_add_cancellation_callbackZ add_writerršr=rBZENOTCONNr~ÚConnectionErrorÚ __cause__rr•Z set_exceptionrarbrc)rrŸZ registered_fdrqr;rœr�ržÚ total_sentÚfdZsentrFÚnew_excr�rrrršas†    þ   ÿ þÿ ÿ      þz1_UnixSelectorEventLoop._sock_sendfile_native_implcCs|dkrt ||tj¡dS©Nr)rwÚlseekÚSEEK_SET)rr;rœr©rrrr£§sz4_UnixSelectorEventLoop._sock_sendfile_update_fileposcs‡‡fdd„}| |¡dS)Ncs&| ¡r"ˆ ¡}|dkr"ˆ |¡dS)Nr3)r¢r;r¡)rŸrª©rrqrrÚcb¬szB_UnixSelectorEventLoop._sock_add_cancellation_callback..cb)Zadd_done_callback)rrŸrqr°rr¯rr¦«sz6_UnixSelectorEventLoop._sock_add_cancellation_callback)N)NN)NN)N)N)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr%r2rHr0r)r8rXrZrlr`r‚r’r ršr£r¦Ú __classcell__rrr!rr/sH -   ÿ ÿ þ ÿü .ÿü CFrcsŠeZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z e jfdd„Zddd„Zdd„Zdd„Z‡ZS) rRiNcsÚtƒ |¡||jd<||_||_| ¡|_||_d|_d|_ t   |j¡j }t  |¡s„t  |¡s„t  |¡s„d|_d|_d|_tdƒ‚t  |jd¡|j |jj|¡|j |jj|j|j¡|dk rÖ|j tj|d¡dS)NrTFz)Pipe transport is for pipes/sockets only.)rrÚ_extraÚ_loopÚ_piper;Ú_filenoÚ _protocolÚ_closingÚ_pausedrwr˜r‹r‰ÚS_ISFIFOrŠÚS_ISCHRr<Ú set_blockingÚ call_soonÚconnection_madeÚ _add_readerÚ _read_readyr Ú_set_result_unless_cancelled)rr‡rTrUrVrWÚmoder!rrr¸s:    ÿþ ÿ ÿz_UnixReadPipeTransport.__init__cCsÀ|jjg}|jdkr | d¡n|jr0| d¡| d|j›�¡t|jddƒ}|jdk r�|dk r�t  ||jt j ¡}|r„| d¡q°| d¡n |jdk r¦| d¡n | d¡d  d   |¡¡S) NÚclosedÚclosingúfd=Ú _selectorÚpollingÚidleÚopenú<{}>ú )r"r±r¸Úappendr»r¹Úgetattrr·r Ú_test_selector_eventÚ selectorsZ EVENT_READÚformatÚjoin)rrAr rÊrrrÚ__repr__Ös(    ÿ     z_UnixReadPipeTransport.__repr__c Csºzt |j|j¡}WnDttfk r,YnŠtk rX}z| |d¡W5d}~XYn^X|rl|j  |¡nJ|j   ¡r‚t   d|¡d|_|j  |j¡|j  |jj¡|j  |jd¡dS)Nz"Fatal read error on pipe transportú%r was closed by peerT)rwÚreadr¹Úmax_sizer¤r¥r=Ú _fatal_errorrºZ data_receivedr·Ú get_debugr rAr»Ú_remove_readerrÀZ eof_receivedÚ_call_connection_lost)rr1rFrrrrÃës  z"_UnixReadPipeTransport._read_readycCs>|js |jrdSd|_|j |j¡|j ¡r:t d|¡dS)NTz%r pauses reading)r»r¼r·rÛr¹rÚr Údebug©rrrrÚ pause_readingýs   z$_UnixReadPipeTransport.pause_readingcCsB|js |jsdSd|_|j |j|j¡|j ¡r>t d|¡dS)NFz%r resumes reading) r»r¼r·rÂr¹rÃrÚr rÝrÞrrrÚresume_readings   z%_UnixReadPipeTransport.resume_readingcCs ||_dSr©rº©rrUrrrÚ set_protocol sz#_UnixReadPipeTransport.set_protocolcCs|jSrrárÞrrrÚ get_protocolsz#_UnixReadPipeTransport.get_protocolcCs|jSr©r»rÞrrrÚ is_closingsz!_UnixReadPipeTransport.is_closingcCs|js| d¡dSr)r»Ú_closerÞrrrr%sz_UnixReadPipeTransport.closecCs,|jdk r(|d|›�t|d�|j ¡dS©Nzunclosed transport r#©r¸r,r%©rÚ_warnrrrÚ__del__s z_UnixReadPipeTransport.__del__úFatal error on pipe transportcCsZt|tƒr4|jtjkr4|j ¡rLtjd||dd�n|j ||||j dœ¡|  |¡dS©Nz%r: %sT©Úexc_info)ÚmessageÚ exceptionr�rU) rOr=rBZEIOr·rÚr rÝÚcall_exception_handlerrºrç©rrFrñrrrrÙs üz#_UnixReadPipeTransport._fatal_errorcCs(d|_|j |j¡|j |j|¡dS©NT)r»r·rÛr¹rÀrÜ©rrFrrrrç-sz_UnixReadPipeTransport._closecCs4z|j |¡W5|j ¡d|_d|_d|_XdSr©r¸r%rºr·Zconnection_loströrrrrÜ2s  z,_UnixReadPipeTransport._call_connection_lost)NN)rí)r±r²r³rØrrÕrÃrßràrãrärær%r*r+rìrÙrçrÜrµrrr!rrR´s rRcs¨eZdZd%‡fdd„ Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zejfdd„Zdd„Zd&dd „Zd'd!d"„Zd#d$„Z‡ZS)(rYNc sþtƒ ||¡||jd<||_| ¡|_||_tƒ|_d|_ d|_ t   |j¡j }t |¡}t |¡}t |¡} |s”|s”| s”d|_d|_d|_tdƒ‚t  |jd¡|j |jj|¡| sÈ|ràtj d¡sà|j |jj|j|j¡|dk rú|j tj|d¡dS)NrTrFz?Pipe transport is only for pipes, sockets and character devicesZaix)rrr¶r¸r;r¹rºÚ bytearrayÚ_bufferÚ _conn_lostr»rwr˜r‹r‰r¾r½rŠr<r¿r·rÀrÁr&ÚplatformÚ startswithrÂrÃr rÄ) rr‡rTrUrVrWrÅZis_charZis_fifoZ is_socketr!rrr?s:       ÿ ÿz _UnixWritePipeTransport.__init__cCsØ|jjg}|jdkr | d¡n|jr0| d¡| d|j›�¡t|jddƒ}|jdk r¨|dk r¨t  ||jt j ¡}|r„| d¡n | d¡|  ¡}| d|›�¡n |jdk r¾| d¡n | d¡d   d  |¡¡S) NrÆrÇrÈrÉrÊrËzbufsize=rÌrÍrÎ)r"r±r¸rÏr»r¹rÐr·r rÑrÒZ EVENT_WRITEÚget_write_buffer_sizerÓrÔ)rrAr rÊrhrrrrÕds,    ÿ     z _UnixWritePipeTransport.__repr__cCs t|jƒSr)ÚlenrùrÞrrrrý|sz-_UnixWritePipeTransport.get_write_buffer_sizecCs6|j ¡rt d|¡|jr*| tƒ¡n| ¡dS)NrÖ)r·rÚr rArùrçÚBrokenPipeErrorrÞrrrrÃs   z#_UnixWritePipeTransport._read_readyc Cs4t|tƒrt|ƒ}|sdS|js&|jrN|jtjkr|}d}t d|¡Yn.X|dkrLdSt|ƒ}|j ¡rlt  d||¡z|j   |¡\}}Wn.t k r®|j ¡rªtjd|dd�YnX|||f|žŽdS)Néÿú8Unknown child process pid %d, will report returncode 255rú$process %s exited with returncode %sú'Child watcher got an unexpected pid: %rTrï) rwÚwaitpidÚWNOHANGÚChildProcessErrorr rr$r·rÚrÝr&ÚpoprJ)rr'rnr#rorDrErrrr(Ûs4þ  ÿ ÿ zSafeChildWatcher._do_waitpid) r±r²r³r´r%rrr_rr)r(rµrrr!rr´s rcsTeZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡Z S)raW'Fast' child watcher implementation. This implementation reaps every terminated processes by calling os.waitpid(-1) directly, possibly breaking other code spawning processes and waiting for their termination. There is no noticeable overhead when handling a big number of children (O(1) each time a child terminates). cs$tƒ ¡t ¡|_i|_d|_dSr¬)rrÚ threadingZLockÚ_lockÚ_zombiesÚ_forksrÞr!rrrs  zFastChildWatcher.__init__cs"|j ¡|j ¡tƒ ¡dSr)r&r-r;rr%rÞr!rrr%s  zFastChildWatcher.closec Cs0|j� |jd7_|W5QR£SQRXdS)Nr)r:r<rÞrrrrszFastChildWatcher.__enter__c Cs^|j�B|jd8_|js"|js0W5QR£dSt|jƒ}|j ¡W5QRXt d|¡dS)Nrz5Caught subprocesses termination from unknown pids: %s)r:r<r;r?r-r r)rrrrZcollateral_victimsrrrrs  þzFastChildWatcher.__exit__c Gsf|j�Fz|j |¡}Wn.tk rF||f|j|<YW5QR£dSXW5QRX|||f|žŽdSr)r:r;r8rJr&)rrnrDrErorrrr_'sz"FastChildWatcher.add_child_handlercCs*z|j|=WdStk r$YdSXdSr.r/rrrrr5s z%FastChildWatcher.remove_child_handlerc Csþzt dtj¡\}}Wntk r,YdSX|dkr:dSt|ƒ}|j�‚z|j |¡\}}WnNtk r¬|j r¤||j |<|j   ¡r–t  d||¡YW5QR£qd}YnX|j   ¡rÆt  d||¡W5QRX|dkrèt  d||¡q|||f|žŽqdS)Nr3rz,unknown process %s exited with returncode %sr3z8Caught subprocess termination from unknown pid: %d -> %d)rwr5r6r7r$r:r&r8rJr<r;r·rÚr rÝr)rrnr#rorDrErrrr)<s@  þ  ÿþz FastChildWatcher._do_waitpid_all) r±r²r³r´rr%rrr_rr)rµrrr!rrþs  rc@sheZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„ZdS)ra~A watcher that doesn't require running loop in the main thread. This implementation registers a SIGCHLD signal handler on instantiation (which may conflict with other code that install own handler for this signal). The solution is safe but it has a significant overhead when handling a big number of processes (*O(n)* each time a SIGCHLD is received). cCsi|_d|_dSr)r&Ú_saved_sighandlerrÞrrrrzszMultiLoopChildWatcher.__init__cCs |jdk Sr)r=rÞrrrr\~szMultiLoopChildWatcher.is_activecCsT|j ¡|jdkrdSt tj¡}||jkr:t d¡nt tj|j¡d|_dS)Nz+SIGCHLD handler was changed by outside code) r&r-r=r9Ú getsignalr+r,r r)rrNrrrr%�s     zMultiLoopChildWatcher.closecCs|SrrrÞrrrr�szMultiLoopChildWatcher.__enter__cCsdSrr©rÚexc_typeZexc_valZexc_tbrrrr�szMultiLoopChildWatcher.__exit__cGs&t ¡}|||f|j|<| |¡dSr)rÚget_running_loopr&r()rrnrDrEr‡rrrr_“sz'MultiLoopChildWatcher.add_child_handlercCs*z|j|=WdStk r$YdSXdSr.r/rrrrršs z*MultiLoopChildWatcher.remove_child_handlercCsN|jdk rdSt tj|j¡|_|jdkrýsÿz6ThreadedChildWatcher._join_threads..N)r(rFÚvaluesrÔ)rÚthreadsrLrrrrGûsz"ThreadedChildWatcher._join_threadscCs|SrrrÞrrrrszThreadedChildWatcher.__enter__cCsdSrrr?rrrrszThreadedChildWatcher.__exit__cCs6dd„t|j ¡ƒDƒ}|r2||j›d�t|d�dS)NcSsg|]}| ¡r|‘qSr)rHrJrrrrM sÿz0ThreadedChildWatcher.__del__..z0 has registered but not finished child processesr#)r(rFrNr"r,)rrërOrrrrìs  þzThreadedChildWatcher.__del__cGsFt ¡}tj|jdt|jƒ›�||||fdd�}||j|<| ¡dS)Nzwaitpid-T)ÚtargetÚnamerErI) rrAr9ZThreadr(ÚnextrErFÚstart)rrnrDrEr‡rLrrrr_s ý z&ThreadedChildWatcher.add_child_handlercCsdSrõrrrrrrsz)ThreadedChildWatcher.remove_child_handlercCsdSrrrrrrrsz ThreadedChildWatcher.attach_loopcCs˜zt |d¡\}}Wn(tk r<|}d}t d|¡Yn Xt|ƒ}| ¡r\t d||¡| ¡rtt d||¡n|j |||f|žŽ|j   |¡dS)Nrr1r2r3rB) rwr5r7r rr$rÚrÝrCrmrFr8)rr‡r'rDrErnr#rorrrr("s&þ ÿz ThreadedChildWatcher._do_waitpidN)r±r²r³r´rr\r%rGrrr*r+rìr_rrr(rrrrräs  rcsHeZdZdZeZ‡fdd„Zdd„Z‡fdd„Zdd „Z d d „Z ‡Z S) Ú_UnixDefaultEventLoopPolicyz:UNIX event loop policy with a watcher for child processes.cstƒ ¡d|_dSr)rrÚ_watcherrÞr!rrrAs z$_UnixDefaultEventLoopPolicy.__init__c CsHtj�8|jdkr:tƒ|_tt ¡tjƒr:|j |j j ¡W5QRXdSr) rr:rUrrOr9Úcurrent_threadÚ _MainThreadrÚ_localr·rÞrrrÚ _init_watcherEs ÿz)_UnixDefaultEventLoopPolicy._init_watchercs6tƒ |¡|jdk r2tt ¡tjƒr2|j |¡dS)zÑSet the event loop. As a side effect, if a child watcher was set before, then calling .set_event_loop() from the main thread will call .attach_loop(loop) on the child watcher. N)rÚset_event_looprUrOr9rVrWrrr!rrrZMs   ÿz*_UnixDefaultEventLoopPolicy.set_event_loopcCs|jdkr| ¡|jS)z~Get the watcher for child processes. If not yet set, a ThreadedChildWatcher object is automatically created. N)rUrYrÞrrrr[[s z-_UnixDefaultEventLoopPolicy.get_child_watchercCs|jdk r|j ¡||_dS)z$Set the watcher for child processes.N)rUr%)rrjrrrÚset_child_watcheres  z-_UnixDefaultEventLoopPolicy.set_child_watcher) r±r²r³r´rZ _loop_factoryrrYrZr[r[rµrrr!rrT=s   rT)2r´rBr–rDrwrÒr9ryr‰r r&r9r*Úrrrrrrr r r r Úlogr Ú__all__rûÚ ImportErrorrZBaseSelectorEventLooprZ ReadTransportrRZ_FlowControlMixinZWriteTransportrYZBaseSubprocessTransportr^rr$r%rrrrZBaseDefaultEventLoopPolicyrTrrrrrrÚs`             ÿNO5Ji}Y3