o
    US`c@                     @   s   d dl Z d dlZd dlZddlmZ ddlmZ ddlmZm	Z	 dd Z
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N   )_core)signal_raise)open_signal_receiver_signal_handlerc                     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 | dksDJ tt j |2 z3 d H W }|t jksXJ  n6 | 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_blocked_pending_signal_countpytestraisesRuntimeError	__anext__)origreceiversignum r   B/usr/local/lib/python3.10/dist-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_fail,   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_signal2   s   r   c                     sP   dd } t t tjtj| I d H  W d    d S 1 s!w   Y  d S )Nc                      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   trio	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_conflictC   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_barrierM   s
   r(   c                     s  t tjtjy} 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| 
 dkrc| 	 I d H  | 
 dksVW n   dd l}|  Y W d    d S W d    d S 1 sw   Y  d S )N
   r   )r   r   r	   SIGFPEprintr   ranger   r(   r   r
   	traceback	print_exc)r   previous_gotr-   r   r   r   'test_open_signal_receiver_no_starvationT   s2   

" r2   c               
      s  t    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 s4w   Y  t I d H  W d    n1 sIw   Y   tjtjhksXJ  	  td ttjtjh| 7 ttjtj }ttj ttj t I d H  |
 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  |
 dksJ W d    n	1 s$w   Y  W d    n	1 s4w   Y  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  |
 dksnJ W d    n	1 syw   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 )
Nc                    s     |  d S r   )add)ZsignoframeZdelivered_directlyr   r   direct_handlerv   s   zAtest_catch_signals_race_condition_on_exit.<locals>.direct_handler   r         c                 S   s   t | r   )r   )r   r0   r   r   r   raise_handler   s   z@test_catch_signals_race_condition_on_exit.<locals>.raise_handlerr   )r%   r+   r   r   r	   r*   r   r   r(   clearr
   SIG_IGNr   r   r   valueargs
isinstance__context__r3   )r6   r   r:   excinfoexcZsignumsr   r5   r   )test_catch_signals_race_condition_on_exits   st   



	

$rC   )r   r   r    r   Z_utilr   Z_signalsr   r   r   r   r   r   r"   r#   r(   r2   rC   r   r   r   r   <module>   s    		
