
     f                        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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            Z G d d          ZddZedd            ZdS )    )annotationsN)OrderedDict)contextmanager)TYPE_CHECKING   )ConflictDetectoris_main_threadsignal_raise)AsyncIteratorCallable	GeneratorIterable)	FrameType)SelfsignalsIterable[int]handlerHCallable[[int, FrameType | None], object] | int | signal.Handlers | NonereturnGenerator[None, None, None]c              #  2  K   i }	 t          |           D ]}t          j        ||          ||<   d V  |                                D ]\  }}t          j        ||           d S # |                                D ]\  }}t          j        ||           w xY wN)setsignalitems)r   r   original_handlerssignumoriginal_handlers        P/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/trio/_signals.py_signal_handlerr    6   s      
 4'll 	G 	GF(.fg(F(Ff%%(9(?(?(A(A 	4 	4$F$M&"23333	4 	4(9(?(?(A(A 	4 	4$F$M&"23333	4s   .A% %1Bc                  6    e Zd ZddZddZddZdd	Zdd
ZdS )SignalReceiverr   Nonec                    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selfs    r   __init__zSignalReceiver.__init__F   sD    0;M,,..	"2F#
 #
     r   intc                |    | j         rt          |           d S d | j        |<   | j                                         d S r   )r+   r
   r%   r)   unpark)r-   r   s     r   _addzSignalReceiver._addO   sF    < 	     $(DM&!Ir/   c                :     d _         d fd              d S )NTr   r#   c                     j         rIj                             d          \  } }	 t          |                          d S #               w xY wd S )NFlast)r%   popitemr
   )r   _deliver_nextr-   s     r   r:   z9SignalReceiver._redeliver_remaining.<locals>.deliver_next^   se    } # M11u1==	# ((( LNNNNNLLNNNN# #s   A Ar   r#   )r+   )r-   r:   s   `@r   _redeliver_remainingz#SignalReceiver._redeliver_remainingV   sA     
	# 	# 	# 	# 	# 	# 	# 	r/   r   c                    | S r    r,   s    r   	__aiter__zSignalReceiver.__aiter__h   s    r/   c                J  K   | j         rt          d          | j        5  | j        s | j                                         d {V  n$t          j                                         d {V  | j        	                    d          \  }}|cd d d            S # 1 swxY w Y   d S )Nz)open_signal_receiver block already exitedFr6   )
r+   RuntimeErrorr*   r%   r)   parkr&   r'   
checkpointr8   )r-   r   r9   s      r   	__anext__zSignalReceiver.__anext__k   s     < 	LJKKK $ 	 	= 1inn&&&&&&&&&&m..000000000--5-99IFA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A+BBBNr;   )r   r0   r   r#   )r   r   )r   r0   )__name__
__module____qualname__r.   r3   r<   r?   rD   r>   r/   r   r"   r"   E   sx                 $        r/   r"   recAsyncIterator[int]r0   c                X    t          | t                    sJ t          | j                  S )z/Helper for tests, not public or otherwise used.)
isinstancer"   lenr%   )rH   s    r   get_pending_signal_countrM   z   s*     c>*****s|r/   signal.Signals | int)Generator[AsyncIterator[int], None, None]c               '    K   | st          d          t                      st          d          t          j                                        t                      dfd	}	 t          | |          5  V  d
d
d
           n# 1 swxY w Y                                    d
S #                                  w xY 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   r0   frameFrameType | Noner   r#   c                B                         j        | d           d S )NT)
idempotent)run_sync_soonr3   )r   rQ   queuetokens     r   r   z%open_signal_receiver.<locals>.handler   s&    EJ4@@@@@r/   N)r   r0   rQ   rR   r   r#   )		TypeErrorr	   rA   r&   r'   current_trio_tokenr"   r    r<   )r   r   rV   rW   s     @@r   open_signal_receiverrZ      s6     L  42333 
/
 
 	
 M,,..EEA A A A A A A%Wg.. 	 	KKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	""$$$$$""$$$$s0   'B) 7B<B) BB) BB) )B?)r   r   r   r   r   r   )rH   rI   r   r0   )r   rN   r   rO   )
__future__r   r   collectionsr   
contextlibr   typingr   r&   _utilr   r	   r
   collections.abcr   r   r   r   typesr   typing_extensionsr   r    r"   rM   rZ   r>   r/   r   <module>rc      sU   " " " " " "  # # # # # # % % % % % %              A A A A A A A A A A 'LLLLLLLLLLLL&&&&&&L 4 4 4 42 2 2 2 2 2 2 2j    7% 7% 7% 7% 7% 7%r/   