a
    'fF                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlZg Z	g Z
eaejZejZdd Zdd	 Zd
d ZddlZdejj	v reedreej_e	d	 e	d n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`.)
    )absolute_import)_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   [/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/gevent/signal.py	getsignal'   s
    

r   c                 C   sz   | t jkrt| |S |t jkr8|t jkr8t|s8tdt| }|a|t jt jfv rvd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   Z
gevent.hubr   loopZreset_sigchld)r
   handlerZold_handlerr   r   r   r   signal9   s    !


r   c                  C   s.   t tr*ddlm}  | ttjd }|  d S )Nr   )Greenlet)r   r   geventr   r   r   switch)r   Zgreenletr   r   r   _on_child_hookr   s    r   waitpidr   r   )Znames_to_ignoreZdunder_names_to_keep)__doc__
__future__r   Zgevent._utilr   r	   r   r   r   Z__implements__Z__extensions__r   r   r   r   r   Z	gevent.osr   oshasattrappendglobalsZ__imports____all__r   r   r   r   <module>   s0   9


