o
    i                     @   s   d Z ddlmZ ddlmZ ddlZg Zg Zea	da
daejZejZdd Zdd	 Zd
d ZddlZdd ZddddZdejjv r\eedr\eej_ed	 ed ed ned	 ed ed eee ee ddZee ZdS )aj  
Cooperative implementation of special cases of :func:`signal.signal`.

This module is designed to work with libev's child watchers, as used
by default in :func:`gevent.os.fork` Note that each ``SIGCHLD``
handler will be run in a new greenlet when the signal is delivered
(just like :class:`gevent.hub.signal`)

The implementations in this module are only monkey patched if
:func:`gevent.os.waitpid` is being used (the default) and if
:const:`signal.SIGCHLD` is available; see :func:`gevent.os.fork` for
information on configuring this not to be the case for advanced uses.

.. versionadded:: 1.1b4
.. versionchanged:: 1.5a4
   Previously there was a backwards compatibility alias
   ``gevent.signal``, introduced in 1.1b4, that partly shadowed this
   module, confusing humans and static analysis tools alike. That alias
   has been removed. (See `gevent.signal_handler`.)
    )_NONE)copy_globalsNc                 C   s(   | t jkr	t| S ttu rtt jatS )z
    Exactly the same as :func:`signal.getsignal` except where
    :const:`signal.SIGCHLD` is concerned.

    For :const:`signal.SIGCHLD`, this cooperates with :func:`signal`
    to provide consistent answers.
    )_signalSIGCHLD_signal_getsignal_child_handler_INITIAL)	signalnum r   U/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/signal.py	getsignal&   s
   

r   c                 C   sz   | t jkr
t| |S |t jkr|t jkrt|stdt| }|a|t jt jfv r;ddl	m
} t| | | j  |S )aq  
    Exactly the same as :func:`signal.signal` except where
    :const:`signal.SIGCHLD` is concerned.

    .. note::

       A :const:`signal.SIGCHLD` handler installed with this function
       will only be triggered for children that are forked using
       :func:`gevent.os.fork` (:func:`gevent.os.fork_and_watch`);
       children forked before monkey patching, or otherwise by the raw
       :func:`os.fork`, will not trigger the handler installed by this
       function. (It's unlikely that a SIGCHLD handler installed with
       the builtin :func:`signal.signal` would be triggered either;
       libev typically overwrites such a handler at the C level. At
       the very least, it's full of race conditions.)

    .. note::

        Use of ``SIG_IGN`` and ``SIG_DFL`` may also have race conditions
        with libev child watchers and the :mod:`gevent.subprocess` module.

    .. versionchanged:: 1.2a1
         If ``SIG_IGN`` or ``SIG_DFL`` are used to ignore ``SIGCHLD``, a
         future use of ``gevent.subprocess`` and libev child watchers
         will once again work. However, on Python 2, use of ``os.popen``
         will fail.

    .. versionchanged:: 1.1rc2
         Allow using ``SIG_IGN`` and ``SIG_DFL`` to reset and ignore ``SIGCHLD``.
         However, this allows the possibility of a race condition if ``gevent.subprocess``
         had already been used.
    zKsignal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable objectr   get_hub)r   r   _signal_signalSIG_IGNSIG_DFLcallable	TypeErrorr   r   
gevent.hubr   loopreset_sigchld)r
   handlerold_handlerr   r   r   r   signal8   s   
!

r   c                  C   sN   t tr%ddlm}  tdkr| ttt}|  | ttj	d }|  d S d S )Nr   )Greenlet)
r   r   geventr   _child_wakeup_fd_write_child_signal_fd$_child_wakeup_fd_warn_on_full_bufferswitchr   r   )r   greenletr   r   r   _on_child_hookq   s   r"   c              
   C   s   zt j| ttjf W d S  ty@ } z&|s|jt jjvr5ddl	m
} | dd d d  W Y d }~d S W Y d }~d S d }~ww )Nr   r   set_wakeup_fd)r   os_writebytesr   r   OSErrorerrnoignored_errorsr   r   handle_error)fdwarn_on_full_bufferer   r   r   r   r      s    r   Tr,   c               C   s   t j| |d}| a|a|S )a  
    Set the wakeup file descriptor to *fd*. When a signal is received, the signal number is
    written as a single byte into the *fd*. This can be used by a library to wakeup a poll
    or select call, allowing the signal to be fully processed.

    .. versionadded:: 25.8.1
    r.   )r   r#   r   r   )r+   r,   old_fdr   r   r   r#      s   r#   waitpidr   r   )names_to_ignoredunder_names_to_keep)__doc__gevent._utilr   r	   r   r   r   __implements____extensions__r   r   r   r   r   r   r"   	gevent.osr   r   r#   r$   hasattrappendglobals__imports____all__r   r   r   r   <module>   s<    9




