
    iv                        d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ej        Zej        Zg Z G d de          Z eeeeg d          ZddlmZ eZddlmZ ej        Zej         Z!ej"        Z#d Z$d Z%d Z&e'                                  ee           G d de                      Z(dS )z
libuv loop implementation
    N)defaultdict)
namedtuple)implementer)
getcurrent)AbstractCallbacks)AbstractLoop)assign_standard_callbacks)ILoop)LoopExit)	_corecffic                   &    e Zd Zd Zd Zd Zd ZdS )
_Callbacksc                 t    t                               d|          j        }|r|                     |          nd S Nzuv_handle_t*)fficastdatafrom_handle)selfwatcher_ptrloop_handles      </usr/local/lib/python3.11/dist-packages/gevent/libuv/loop.py_find_loop_from_c_watcherz$_Callbacks._find_loop_from_c_watcher   s6    hh~{;;@0;Et,,,E    c                     |                      t                              d|          j                                                   d S r   )r   r   r   r   _sigchld_callback)r   r   _signums      r   python_sigchld_callbackz"_Callbacks.python_sigchld_callback!   s9    .+>>CDDVVXXXXXr   c                 ,    |                      |          S N)python_prepare_callback)r   r   s     r   python_timer0_callbackz!_Callbacks.python_timer0_callback$   s    ++K888r   c                 t    |j         }|                     |          }|j                            ||           d S r    )r   r   loop_queue_callback)r   r   reventswatcher_handlethe_watchers        r   python_queue_callbackz _Callbacks.python_queue_callback'   s<    $)&&~66((g>>>>>r   N)__name__
__module____qualname__r   r   r"   r)    r   r   r   r      sV        F F FY Y Y9 9 9? ? ? ? ?r   r   )r   r"   r)   )EVENTS)watcherc                      t                               t                                                    } t	          | t
                    s|                     d          }n| }d|z   S )Nasciizlibuv-)r   stringlibuvuv_version_string
isinstancestrdecode)uv_bytesuv_strs     r   get_versionr:   B   sT    zz%113344Hh$$ ))fr   c                  N    dt           j        t           j        t           j        fz  S )Nzlibuv-%d.%d.%d)r3   UV_VERSION_MAJORUV_VERSION_MINORUV_VERSION_PATCHr-   r   r   get_header_versionr?   L   s    u5u7MuOefffr   c                      dgS )Ndefaultr-   r-   r   r   supported_backendsrB   O   s
    ;r   c                   l    e Zd ZdZ eej        d          ZdZdZdZ	dZ
dZe	Zd.dZd	 Zd
 ZdZed             Zd Zd Z fdZd Zd Zd Zd Z fdZd Zd Zd Zd Z edg d          Z d Z!d Z"d Z#d/dZ$d Z%dZ&d  Z'd0d!Z(d" Z)d# Z*d$ Z+dZ,dZ-d% Z.d& Z/d' Z0d( Z1d) Z2d1d+Z3d, Z4d1d-Z5 xZ6S )2r$   gMbP?d   i,  Nzuv_check_t *zuv_prepare_t *zvoid(*)(void*)c                 H   t          j        | t          t          t          ||           t          t                    | _        i | _        t                      | _
        t          j                    | _        | j        t                                          k    | _        g | _        d S r    )r   __init__r   r3   	_watchersr   list_child_watchers_io_watchersset_fork_watchersosgetpid_pid_ptruv_default_loop_default_queued_callbacks)r   flagsrA   s      r   rF   zloop.__init__m   sv    dC	5'JJJ*400!eeIKK	e&;&;&=&==!#r   c                 >    | j                             ||f           d S r    )rS   append)r   r   r&   s      r   r%   zloop._queue_callbackw   s$    %%{G&<=====r   c                     |d}|rt                                           }nt                                           }|st          d          | j        |_        |S )NTzFailed to get loop)r3   rQ   uv_loop_newSystemError_handle_to_selfr   )r   rT   rA   ptrs       r   
_init_loopzloop._init_loopz   sf    ?G
  	& ''))CC##%%C  	42333 '
r   c                 V    | j         sd S | j         r| j         j        sd | _         | j         S r    )rP   r   r   s    r   r[   zloop.ptr   s7    y 	49 	TY^ 	 DIyr   c                 l   t                               | j        | j                   t                               | j        t           j                   t                               | j                   t                              d          | _	        t           
                    | j        | j	                   | j        | j	        _        t                              dt           j                  }t                               | j	        || j        | j                   t                               | j	                   d S )Nzuv_timer_t*zvoid(*)(uv_timer_t*))r3   uv_check_initr[   _checkuv_check_startpython_check_callbackuv_unrefr   new_signal_idleuv_timer_initrZ   r   r   uv_timer_startSIGNAL_CHECK_INTERVAL_MS)r   sig_cbs     r   _init_and_start_checkzloop._init_and_start_check   s    DHdk222T[%*EFFFt{###  GGM22DHd&7888!%!50%2MNNT.#!:!:	< 	< 	< 	t()))))r   c                 ~    | j         s5t                      j                            t	          d                     d S d S )NzDestroyed during run)r[   r   parentthrowr   r^   s    r   __check_and_diezloop.__check_and_die   sE    x 	H LL%%h/E&F&FGGGGG	H 	Hr   c                 6   |                                   t          j                    }|| j        k    r%|| _        | j        D ]}|                                 |                                 | _        t          t          |           
                                 d S r    )_loop__check_and_dierM   rN   rO   rL   _on_fork_loop__run_queued_callbacks_prepare_ran_callbackssuperr$   _run_callbacks)r   curpidr/   	__class__s      r   rv   zloop._run_callbacks   s    TYDI. # #  """". '+&A&A&C&C#dD((*****r   c                     t                               | j        | j                   t                               | j        t           j                   t                               | j                   d S r    )r3   uv_prepare_initr[   _prepareuv_prepare_startr!   rd   r^   s    r   _init_and_start_preparezloop._init_and_start_prepare   sQ    dh666t}e.KLLLt}%%%%%r   c                 P    t                               | j        | j                   d S r    )r3   r`   r[   _timer0r^   s    r   _init_callback_timerzloop._init_callback_timer   s"    DHdl33333r   c                 D    t                               | j                   d S r    )r3   uv_check_stopr   r^   s    r   _stop_callback_timerzloop._stop_callback_timer   s    DL)))))r   c                 Z    t                               | j        t           j                   d S r    )r3   rb   r   r"   r^   s    r   _start_callback_timerzloop._start_callback_timer   s&    l 	T\5+GHHHHHr   c                 >   t          t          |                                            | j        sJ | j        sJ | j        sJ t                              | j                   t                              | j                   t          	                    | j                   t                              | j                   t          
                    | j                   t                              | j                   t          	                    | j                   d S r    )ru   r$   _stop_aux_watchersr{   ra   rf   r3   uv_prepare_stopuv_refr   uv_timer_stopr   )r   rx   s    r   r   zloop._stop_aux_watchersH  s    dD,,...}{    dm,,,T]###DK(((T[!!!D-...T&'''DL)))))r   c                 l    |                                   t                              | j                   d S r    )r   r3   r   r   r^   s    r   _setup_for_run_callbackzloop._setup_for_run_callbackX  s.    ""$$$T\"""""r   c                     |S r    r-   )r   r[   s     r   _can_destroy_loopzloop._can_destroy_loop\  s    
r   c                 *   d}|rt                               |          }|sd S |t           j        k    rt          d|          t                               |t           j                  }|r%t                               |t           j                   |d S d S )N   zUnknown close failure reason)r3   uv_loop_closeUV_EBUSYrY   uv_runUV_RUN_ONCEUV_RUN_NOWAIT)r   r[   closed_failedran_has_more_callbackss       r   __close_loopzloop.__close_loop_  s     	7!//44M  ..!"@-PPP &+\\#u7H%I%I"% 7S%"5666  	7 	7 	7 	7 	7r   c                    |j         }t          j        |_         	 |r4t                              |           t                              |           t          j        |_         n# t          j        |_         w xY w	 |r|                     |           |rt                              | j                   t                              | j	                   t          
                    | j                   t                              | j                   t                              |           | `| `| `| `	| `| `| `d S # |rt                              | j                   t                              | j	                   t          
                    | j                   t                              | j                   t                              |           | `| `| `| `	| `| `| `w xY wr    )r   r   NULLr3   uv_stopgevent_close_all_handles_loop__close_loopgevent_zero_checkra   r   gevent_zero_preparer{   gevent_zero_timerrf   gevent_zero_looprJ   rL   rI   )r   r[   r   s      r   _destroy_loopzloop._destroy_loopp  s   
 x8	  4c"""..s333xCHHsxCH	% '!!#&&&  ,''444''555))$-888''(9:::&&s+++! !#$$$  ,''444''555))$-888''(9:::&&s+++! !#$$$$$s   6A" "A59D8 8B(G HandleState)handletyper/   refactiveclosingc                     | j         sdgS | j        g fd}t                              | j         t                              d|          t          j                   S )zL
        Return all the handles that are open and their ref status.
        zLoop has been destroyedc                    | j         }|rt                              |          }nd }                     | t                              t
                              | j                            |t
                              |           t
          	                    |           t
          
                    |                                d S r    )r   r   r   rV   r2   r3   uv_handle_type_namer   
uv_has_refuv_is_activeuv_is_closing)r   _argr   r/   handle_statehandless       r   walkzloop.debug.<locals>.walk  s    ;D //$//NN<<(+

53L3LV[3Y3Y(Z(Z(/(-(8(8(@(@(-(:(:6(B(B(-(;(;F(C(CE E F F F F Fr   zvoid(*)(uv_handle_t*,void*))r[   _HandleStater3   uv_walkr   callbackr   )r   r   r   r   s     @@r   debugz
loop.debug  s     x 	/-..(	F 	F 	F 	F 	F 	F 	dhll#@#') )h	  	  	  r   c                     d S r    r-   r^   s    r   r   zloop.ref  s    r   c                     d S r    r-   r^   s    r   unrefz
loop.unref  s    r   c                 V    | j         r!t                              | j                    d S d S r    )r[   r3   r   )r   hows     r   break_zloop.break_  s0    8 	$MM$(#####	$ 	$r   c                 D    t                               | j                   d S r    )r3   uv_loop_forkr[   r^   s    r   reinitzloop.reinit  s     , 	48$$$$$r   Fc                    | j         sdS | j         d d          }| j         d d = |D ]\  }}|j        }|st                              |          rJ +t                              ||          }|dk    rt                              ||           h|dk    rlt                              |          sR|j        }	 |r ||k    rt                              |           t          j	        |_        # t          j	        |_        w xY wdS )NFr   T)
rS   r   r3   r   
_callbackspython_callbackpython_handle_errorpython_stopr   r   )r   cbsr   argr   valhandle_after_callbacks          r   __run_queued_callbackszloop.__run_queued_callbacks  s+   % 	5$QQQ'"111% # 	4 	4K %F  --k:::::,,VS99Cbyy..vs;;;;))+66 4 -8,<)40 J5Jf5T5T&223HIII+.8((38(3333ts   5"C))C<c                 2   t           j        }|rt           j        }|rt           j        }|t           j        k    r| j        r| j        j        r|                                  d| _        | j        s| j	        st           j        nt           j        }t           
                    | j        |          }|                                 }|s|s	| j        s|S | j        r| j        j        dS t           
                    | j        |          }|                                  |S )NFr   )r3   UV_RUN_DEFAULTr   r   rP   r   rv   rt   r   rS   r   rs   )r   nowaitoncemoderun_mode
ran_statusran_callbacksresults           r   runzloop.run  s,    # 	%$D 	'&D5''') )&	 )& ##%%%.3+  ?-373I-E%%,  #\\$)X>>

 !% ; ; = =! &- &@[ & &%S ) )&	 )&T 1di..##%%%r   c                 r    |                                   t                              | j                  }|dz  S )Ng     @@)rq   r3   uv_nowr[   )r   nows     r   r   zloop.now=  s3     ll48$$V|r   c                 l    |                                   t                              | j                   d S r    )rq   r3   uv_update_timer[   r^   s    r   
update_nowzloop.update_nowE  s0    TX&&&&&r   c                 f    | j         r't                              | j                  }|dk    r|S d S d S )Nr   )r[   r3   uv_backend_fdrP   )r   fds     r   filenozloop.filenoI  s>    8 	$$TY//BQww		 	wr   c                 |   | j         sd S | j        rd S t                              d          | _        t                              | j        | j                   | j        | j        _        t          	                    | j                   t          
                    | j        t          j        t          j                   d S )Nzuv_signal_t*)rA   _sigchld_watcherr   re   r3   uv_signal_initr[   rZ   r   rd   uv_signal_startr   signalSIGCHLDr^   s    r   install_sigchldzloop.install_sigchldR  s    | 	F  	F # 7 7TXt'<===%)%9"t,---d3#;$n	. 	. 	. 	. 	.r   c                     | j         r| j        sd S t                              | j                   t          j                            | j                   | `d S r    )rA   r   r3   uv_signal_stoprG   r/   _watcher_ffi_closer^   s    r   reset_sigchldzloop.reset_sigchldc  sZ    | 	4#8 	FT2333 	,,T-BCCC!!!r   c                 D   	 	 t          j        t           j                  \  }}}n# t          $ r Y d S w xY w|dk    rd S | j                            |g           | j                            dg           z   }|D ]}|                     |j        ||           g | j        d<   )NTr   )rM   wait3WNOHANGOSErrorrI   getrun_callback_set_waitpid_status)r   pidstatus_usagechildren_watchersr/   s         r   r   zloop._sigchld_callbacko  s    	)&(hrz&:&:#VVV    axx $ 4 8 8b A ADDXD\D\]^`bDcDc c, L L!!'"=sFKKKK ')D #	)s   "& 
44c                 P    | j         |j                                     |           d S r    )rI   rO   rV   )r   r/   s     r   _register_child_watcherzloop._register_child_watcher  s&    W\*11':::::r   c                     	 | j         |j                                     |           n# t          $ r Y nw xY wt	          | j                   D ]}| j         |         s| j         |= d S r    )rI   rO   remove
ValueErrorrH   )r   r/   r   s      r   _unregister_child_watcherzloop._unregister_child_watcher  s    	 .55g>>>> 	 	 	D	
 ,-- 	. 	.C', .(-	. 	.s   %( 
55Tc                    | j         	          }|j        sJ d|z              nL# t          $ r? | j                            | d          }|<   t          |          fd|_        Y nw xY w|                    |          S )Nz)IO Watcher %s unclosed but should be deadr   c                  ~    t                                                   k    r                               nd S r    )idr   pop)r   io_watchers
watcher_ids   r   <lambda>zloop.io.<locals>.<lambda>  s@     koob))**j88 ### r   )rJ   _multiplex_watchersKeyErrorrG   ior   _no_more_watchers	multiplex)r   r   eventsr   priority
io_watcherr   r   s    `    @@r   r  zloop.io  s    
 '	$RJ1mm4_bl4lmmmm 	 	 	 **4Q77J(KOJJ, , , , , ,J(((	 ##F+++s   ) AA21A2c                      	  j                  }n# t          $ r Y dS w xY w|j        }|r= fd}                                                     ||           fd}||_        |S )NFc                    	 |                      d           |                                  |                                  dt          |           v r| `dt          |           v r| `j                                      | usJ 	                                                                   d S #                                                                   w xY w)Nl    _check_fd_validr  )	_io_callbackstop	close_allvarsr  r  rJ   r   close)r/   checkr   r   s    r   do_itzloop.closing_fd.<locals>.do_it  s    "((444LLNNN%%''' )DMM99#3*d7mm;;#5,0044GCCCCCJJLLLKKMMMMM JJLLLKKMMMMs   BB/ /*Cc                  @    t          t          j        d d          )NzThe file descriptor z# is in the process of being closed.)r   errnoEBADF)r   s   r   	not_validz"loop.closing_fd.<locals>.not_valid  s+    KKSUSUSUWY Y Yr   )rJ   r  r   r  startr  )r   r   r/   
must_deferr  r  r  s   ``    @r   
closing_fdzloop.closing_fd  s    	'+GG 	 	 	55	 ^
  	0" " " " " " "  JJLLEKKw'''Y Y Y Y Y '0G#s    
!!c                      t          d          )Nzhprepare watchers are not currently supported in libuv. If you need them, please contact the maintainers.)	TypeError)r   r   r  s      r   preparezloop.prepare  s      L M M 	Mr   )NNr    )FF)TN)7r*   r+   r,   approx_timer_resolutionmaxr   CALLBACK_CHECK_COUNTri   error_handler_CHECK_POINTER_PREPARE_POINTER_PREPARE_CALLBACK_SIG_TIMER_POINTERrF   r%   r\   rf   propertyr[   rk   rq   rv   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   rs   r   r   r   r   r   _sigchld_callback_ffir   r   r   r   r   r  r  r  __classcell__)rx   s   @r   r$   r$   T   s        $ 3|@#FF  #M#N',#N$ $ $ $> > >  . L  X* * *8H H H +  +  +  +  +D& & &
4 4 4* * *VI VI VIr* * * * * # # #  7 7 7"%% %% %%N :m* * *+ +L  <    $ $ $ $% % %0 #  D8 8 8 8t  ' ' '    . . ."	" 	" 	") ) )(; ; ;. . ., , , ,42 2 2jM M M M M M M Mr   r$   ))__doc__r  rM   r   collectionsr   r   zope.interfacer   geventr   gevent._ffi.loopr   r   r	   gevent._interfacesr
   gevent.exceptionsr   gevent.libuvr   r   libr3   __all__r   r   r.   GEVENT_CORE_EVENTSr/   rG   _events_to_strUV_READABLEREADUV_WRITABLEWRITEr:   r?   rB   gevent_set_uv_allocr$   r-   r   r   <module>r:     s/     				  # # # # # # " " " " " " & & & & & &       . . . . . . ) ) ) ) ) ) 6 6 6 6 6 6 $ $ $ $ $ $ & & & & & & " " " " " "m? ? ? ? ?" ? ? ?& '&
   
 $ # # # # #  - - - - - -)  g g g        UU
M U
M U
M U
M U
M< U
M U
M U
M U
M U
Mr   