a
    (ñ»j  ã                   @  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r„d 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ÚsignumZoriginal_handler© r   ú3E:\soccer\ml_env\Lib\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(   r/   r0   r3   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   )r7   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   r1   r   r   Zcurrent_trio_tokenr   r   r/   )r   r   r   r<   r   Úopen_signal_receiver�   s    &ÿ
&r@   )Ú
__future__r   r   Úcollectionsr   Ú
contextlibr   Útypingr   r   Z_utilr   r   Úcollections.abcr	   r
   r   r   Útypesr   Ztyping_extensionsr   r   r   r:   r@   r   r   r   r   Ú<module>   s    &5