o
    8ev                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlZd dlZddl	m
Z
 ddlmZmZmZ ddlmZ dddZdddZdddZdddZdddZdddZdddZdddZdddZdS )    )annotationsN)	FrameType)NoReturn   )_core)_signal_handlerget_pending_signal_countopen_signal_receiver)signal_raisereturnNonec                    s4  t t j} tt j^}tt j tt j t I d H  tt j t I d H  |2 z3 d H W }|t jks9J  n6 t|dksDJ tt j |2 z3 d H W }|t jksXJ  n6 t|dkscJ W d    n1 smw   Y  t	t
 | I d H  W d    n1 sw   Y  t t j| u sJ d S )Nr   )signal	getsignalSIGILLr	   r
   r   Zwait_all_tasks_blockedr   pytestraisesRuntimeError	__anext__)origreceiversignum r   <usr/lib/python3.10/site-packages/trio/_tests/test_signals.pytest_open_signal_receiver   s0   



r   c               	     s|   t t j} tt tt jd W d    n1 sw   Y  W d    n1 s-w   Y  t t j| u s<J d S )Ni )r   r   r   r   r   
ValueErrorr	   r   r   r   r   >test_open_signal_receiver_restore_handler_after_one_bad_signal(   s   r   c                	     sl   t jtdd$ t  W d    n1 sw   Y  W d    d S W d    d S 1 s/w   Y  d S )NzNo signals were provided)match)r   r   	TypeErrorr	   r   r   r   r   $test_open_signal_receiver_empty_fail1   s   "r   c                    sT   t t j} tt jt j W d    n1 sw   Y  t t j| u s(J d S N)r   r   r   r	   r   r   r   r   @test_open_signal_receiver_restore_handler_after_duplicate_signal7   s   r!   c                    sR   ddd} t t tjtj| I d H  W d    d S 1 s"w   Y  d S )Nr   r   c                     s2   t tj	 W d    d S 1 sw   Y  d S r    )r	   r   SIGINTr   r   r   r   naughty@   s   "z0test_catch_signals_wrong_thread.<locals>.naughtyr   r   )r   r   r   trioZ	to_threadZrun_syncrun)r#   r   r   r   test_catch_signals_wrong_thread?   s
   
"r'   c                    s   t tjP ttj2} t 4 I d H }|| j	 || j	 W d   I d H  n1 I d H s3w   Y  W d    n1 sBw   Y  W d    d S W d    d S 1 sZw   Y  d S r    )
r   r   r%   ZBusyResourceErrorr	   r   r   Zopen_nurseryZ
start_soonr   )r   Znurseryr   r   r   "test_open_signal_receiver_conflictH   s   ("r(   c                    s4   t  } t }|j| jdd |  I d H  d S )NT)Z
idempotent)r%   Eventr   Zcurrent_trio_tokenZrun_sync_soonsetwait)Zevtokenr   r   r   +wait_run_sync_soon_idempotent_queue_barrierR   s
   r-   c               	     s   t tjtj~} z[tttj d }tdD ]7}ttj ttj t I d H  |d u r6| 	 I d H }q| 	 I d H }|tjtjfv sGJ ||ksMJ |}qt
| dkrc| 	 I d H  t
| dksVW n tyu   dd l}|  Y n	w W d    d S W d    d S 1 sw   Y  d S )N
   r   )r	   r   r   SIGFPEprintr   ranger
   r-   r   r   BaseException	traceback	print_exc)r   previous_Zgotr3   r   r   r   'test_open_signal_receiver_no_starvationY   s6   

"r7   c               
     s  t   d fdd} td	 ttjtjh| / ttjtj}ttj ttj W d    n1 s5w   Y  t I d H  W d    n1 sJw   Y   tjtjhksYJ  	  td
 ttjtjh| 7 ttjtj }ttj ttj t I d H  t
|d
ksJ W d    n1 sw   Y  W d    n1 sw   Y   tjtjhksJ  	  td ttjhtj( ttj}ttj W d    n1 sw   Y  t I d H  W d    n1 sw   Y  td ttjhtj2 ttj}ttj t I d H  t
|d	ksJ W d    n	1 s%w   Y  W d    n	1 s5w   Y  ddd}ttjtjh|v tt9}ttjtj!}ttj ttj t I d H  t
|d
kspJ W d    n	1 s{w   Y  W d    n	1 sw   Y  |j}|jd h}t|jtsJ ||jjd  |tjtjhksJ W d    d S 1 sw   Y  d S )NsignointframeFrameType | Noner   r   c                   s     |  d S r    )add)r8   r:   Zdelivered_directlyr   r   direct_handler{   s   zAtest_catch_signals_race_condition_on_exit.<locals>.direct_handler   r         r   r   c                 S  s   t | r    )r   )r   r:   r   r   r   raise_handler   s   z@test_catch_signals_race_condition_on_exit.<locals>.raise_handlerr   )r8   r9   r:   r;   r   r   )r   r9   r:   r;   r   r   )r*   r0   r   r   r   r/   r	   r
   r-   clearr   SIG_IGNr   r   r   valueargs
isinstance__context__r<   )r>   r   rB   excinfoexcZsignumsr   r=   r   )test_catch_signals_race_condition_on_exitx   st   




	

$rK   r$   )
__future__r   r   typesr   typingr   r   r%    r   Z_signalsr   r   r	   Z_utilr
   r   r   r   r!   r'   r(   r-   r7   rK   r   r   r   r   <module>   s$    


	


	


