o
    NTh                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	Z	ddl
mZmZ erBd dlmZmZmZmZ d d	lmZ d d
lmZ edddZG dd dZdddZed ddZdS )!    )annotationsN)OrderedDict)contextmanager)TYPE_CHECKING   )ConflictDetectoris_main_thread)AsyncIteratorCallable	GeneratorIterable)	FrameType)SelfsignalsIterable[int]handlerHCallable[[int, FrameType | None], object] | int | signal.Handlers | NonereturnGenerator[None, None, None]c                 c  sp    i }z$t | D ]
}t||||< qd V  W | D ]
\}}t|| qd S | D ]
\}}t|| q,w N)setsignalitems)r   r   original_handlerssignumoriginal_handler r   N/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/trio/_signals.py_signal_handler6   s   r   c                   @  s>   e Zd ZdddZdddZdd	d
ZdddZdddZdS )SignalReceiverr   Nonec                 C  s(   t  | _tj | _td| _d| _d S )Nz8only one task can iterate on a signal receiver at a timeF)	r   _pendingtriolowlevel
ParkingLot_lotr   _conflict_detector_closedselfr   r   r   __init__F   s   
zSignalReceiver.__init__r   intc                 C  s,   | j r
t| d S d | j|< | j  d S r   )r'   r   raise_signalr!   r%   unpark)r)   r   r   r   r   _addO   s   
zSignalReceiver._addc                   s    d_ d fdd    d S )NTr   r    c                    s<   j rj jdd\} }zt|  W    d S    w d S )NFlast)r!   popitemr   r,   )r   _deliver_nextr)   r   r   r4   ^   s   z9SignalReceiver._redeliver_remaining.<locals>.deliver_nextr   r    )r'   r(   r   r3   r   _redeliver_remainingV   s   
z#SignalReceiver._redeliver_remainingr   c                 C  s   | S r   r   r(   r   r   r   	__aiter__h   s   zSignalReceiver.__aiter__c                   sx   | j rtd| j' | js| j I d H  ntj I d H  | jj	dd\}}|W  d    S 1 s5w   Y  d S )Nz)open_signal_receiver block already exitedFr/   )
r'   RuntimeErrorr&   r!   r%   parkr"   r#   
checkpointr1   )r)   r   r2   r   r   r   	__anext__k   s   $zSignalReceiver.__anext__Nr5   )r   r+   r   r    )r   r   )r   r+   )__name__
__module____qualname__r*   r.   r6   r7   r;   r   r   r   r   r   E   s    

	

r   recAsyncIterator[int]r+   c                 C  s   t | tsJ t| jS )z/Helper for tests, not public or otherwise used.)
isinstancer   lenr!   )r?   r   r   r   get_pending_signal_countz   s   
rC   signal.Signals | int)Generator[AsyncIterator[int], None, None]c                  '  s    | st dt stdtj t  d fd	d
}z&t| |  V  W d   n1 s2w   Y  W    dS W    dS    w )a  A context manager for catching signals.

    Entering this context manager starts listening for the given signals and
    returns an async iterator; exiting the context manager stops listening.

    The async iterator blocks until a signal arrives, and then yields it.

    Note that if you leave the ``with`` block while the iterator has
    unextracted signals still pending inside it, then they will be
    re-delivered using Python's regular signal handling logic. This avoids a
    race condition when signals arrives just before we exit the ``with``
    block.

    Args:
      signals: the signals to listen for.

    Raises:
      TypeError: if no signals were provided.

      RuntimeError: if you try to use this anywhere except Python's main
          thread. (This is a Python limitation.)

    Example:

      A common convention for Unix daemons is that they should reload their
      configuration when they receive a ``SIGHUP``. Here's a sketch of what
      that might look like using :func:`open_signal_receiver`::

         with trio.open_signal_receiver(signal.SIGHUP) as signal_aiter:
             async for signum in signal_aiter:
                 assert signum == signal.SIGHUP
                 reload_configuration()

    zNo signals were providedz]Sorry, open_signal_receiver is only possible when running in Python interpreter's main threadr   r+   frameFrameType | Noner   r    c                   s   j  j| dd d S )NT)
idempotent)run_sync_soonr.   )r   rF   queuetokenr   r   r      s   z%open_signal_receiver.<locals>.handlerN)r   r+   rF   rG   r   r    )		TypeErrorr   r8   r"   r#   current_trio_tokenr   r   r6   )r   r   r   rJ   r   open_signal_receiver   s"   &
rO   )r   r   r   r   r   r   )r?   r@   r   r+   )r   rD   r   rE   )
__future__r   r   collectionsr   
contextlibr   typingr   r"   _utilr   r   collections.abcr	   r
   r   r   typesr   typing_extensionsr   r   r   rC   rO   r   r   r   r   <module>   s"    &
5