a
     h                     @  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rd dlmZmZmZmZ d d	lmZ d d
lmZ eddddddZG dd dZdddddZedddddZdS )    )annotationsN)OrderedDict)contextmanager)TYPE_CHECKING   )ConflictDetectoris_main_thread)AsyncIteratorCallable	GeneratorIterable)	FrameType)SelfzIterable[int]zHCallable[[int, FrameType | None], object] | int | signal.Handlers | NonezGenerator[None, None, None])signalshandlerreturnc                 c  sp   i }zFt | D ]}t||||< qd V  W | D ]\}}t|| q4n | D ]\}}t|| qT0 d S N)setsignalitems)r   r   Zoriginal_handlerssignumoriginal_handler r   R/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/trio/_signals.py_signal_handler6   s    r   c                   @  sT   e Zd ZddddZdddddZddd	d
ZddddZddddZdS )SignalReceiverNoner   c                 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lowlevelZ
ParkingLot_lotr   _conflict_detector_closedselfr   r   r   __init__F   s    zSignalReceiver.__init__int)r   r   c                 C  s*   | j rt| nd | j|< | j  d S r   )r#   r   raise_signalr   r!   Zunpark)r%   r   r   r   r   _addO   s    
zSignalReceiver._addc                   s$   d_ dd fdd    d S )NTr   r   c                    s:   j r6j jdd\} }zt|  W    n   0 d S )NFlast)r   popitemr   r(   )r   _deliver_nextr%   r   r   r/   ^   s
    z9SignalReceiver._redeliver_remaining.<locals>.deliver_next)r#   r$   r   r.   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                   sv   | j rtd| jN | js.| j I d H  ntj I d H  | jj	dd\}}|W  d    S 1 sh0    Y  d S )Nz)open_signal_receiver block already exitedFr*   )
r#   RuntimeErrorr"   r   r!   Zparkr   r    
checkpointr,   )r%   r   r-   r   r   r   	__anext__k   s    zSignalReceiver.__anext__N)__name__
__module____qualname__r&   r)   r0   r1   r4   r   r   r   r   r   E   s
   	r   zAsyncIterator[int]r'   )recr   c                 C  s   t | tsJ t| jS )z/Helper for tests, not public or otherwise used.)
isinstancer   lenr   )r8   r   r   r   get_pending_signal_countz   s    r;   zsignal.Signals | intz)Generator[AsyncIterator[int], None, None])r   r   c                  '  s   | st dt stdtj t  dddd fdd}z<t| |  V  W d	   n1 sj0    Y  W    n
   0 d	S )
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'   zFrameType | Noner   )r   framer   c                   s   j  j| dd d S )NT)Z
idempotent)Zrun_sync_soonr)   )r   r<   queuetokenr   r   r      s    z%open_signal_receiver.<locals>.handlerN)		TypeErrorr   r2   r   r    Zcurrent_trio_tokenr   r   r0   )r   r   r   r=   r   open_signal_receiver   s    &
&rA   )
__future__r   r   collectionsr   
contextlibr   typingr   r   Z_utilr   r   collections.abcr	   r
   r   r   typesr   Ztyping_extensionsr   r   r   r;   rA   r   r   r   r   <module>   s    &5