U
    g                     @  s   d dl mZ d dlZd dlmZm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mZ ddlmZ er|d d	lmZ d
dddZd
dddZd
dddZd
dddZd
dddZd
dddZd
dddZd
dddZd
dddZdS )    )annotationsN)TYPE_CHECKINGNoReturn)RaisesGroup   )_core)_signal_handlerget_pending_signal_countopen_signal_receiver)signal_raise)	FrameTypeNonereturnc               	     s  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spt qxqV6 t|dksttt j |2 z3 d H W }|t jkst qq6 t|dkstW 5 Q R X t	
t | I d H  W 5 Q R X t t j| kstd S )Nr   )signal	getsignalSIGILLr
   r   r   Zwait_all_tasks_blockedAssertionErrorr	   pytestraisesRuntimeError	__anext__)origreceiversignum r   </tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_signals.pytest_open_signal_receiver   s&    



r   c               
     sV   t t j} tjtdd tt jd W 5 Q R X W 5 Q R X t t j| ksRtd S )Nz2(signal number out of range|invalid signal value)$matchi )r   r   r   r   r   
ValueErrorr
   r   r   r   r   r   >test_open_signal_receiver_restore_handler_after_one_bad_signal+   s    r"   c                
     s0   t jtdd t  W 5 Q R X W 5 Q R X d S )NzNo signals were providedr   )r   r   	TypeErrorr
   r   r   r   r   $test_open_signal_receiver_empty_fail7   s    r$   c               	     s>   t t j} tt jt j W 5 Q R X t t j| ks:td S N)r   r   r   r
   r   r!   r   r   r   @test_open_signal_receiver_restore_handler_after_duplicate_signal=   s    
r&   c               	     s>   dddd} t t tjtj| I d H  W 5 Q R X d S )Nr   r   c                	     s   t tj W 5 Q R X d S r%   )r
   r   SIGINTr   r   r   r   naughtyF   s    z0test_catch_signals_wrong_thread.<locals>.naughty)r   r   r   trioZ	to_threadZrun_syncrun)r(   r   r   r   test_catch_signals_wrong_threadE   s    r+   c                    sj   t tjV ttj@} t 4 I d H }|| j || j W 5 Q I d H R X W 5 Q R X W 5 Q R X d S r%   )	r   r)   ZBusyResourceErrorr
   r   r   Zopen_nurseryZ
start_soonr   )r   Znurseryr   r   r   "test_open_signal_receiver_conflictN   s
    r,   c                    s2   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_barrierX   s    r1   c               	     s   t tjtj} ztttj d }tdD ]n}ttj ttj t I d H  |d krj| 	 I d H }q.| 	 I d H }|tjtjfkst
||kst
|}q.t| dkr| 	 I d H  qW n$ tk
r   dd l}|  Y nX W 5 Q R X d S )N
   r   )r
   r   r   SIGFPEprintr   ranger   r1   r   r   r	   BaseException	traceback	print_exc)r   previous_gotr7   r   r   r   'test_open_signal_receiver_no_starvation_   s&    

r<   c                    s  t   dddd fdd} td ttjtjh| @ ttjtj}ttj ttj W 5 Q R X t I d H  W 5 Q R X  tjtjhkst	 
  td ttjtjh| P ttjtj6}ttj ttj t I d H  t|dkst	W 5 Q R X W 5 Q R X  tjtjhkst	 
  td	 ttjhtj2 ttj}ttj W 5 Q R X t I d H  W 5 Q R X td
 ttjhtjD ttj.}ttj t I d H  t|dkst	W 5 Q R X W 5 Q R X dddddd}ttjtjh| ttR}ttjtj8}ttj ttj t I d H  t|dksLt	W 5 Q R X W 5 Q R X |j}|jd h}t|jtst	||jjd  |tjtjhkst	W 5 Q R X d S )NintzFrameType | Noner   )signoframer   c                   s     |  d S r%   )add)r>   r?   Zdelivered_directlyr   r   direct_handler   s    zAtest_catch_signals_race_condition_on_exit.<locals>.direct_handler   r         r   )r   r?   r   c                 S  s   t | d S r%   )r   )r   r?   r   r   r   raise_handler   s    z@test_catch_signals_race_condition_on_exit.<locals>.raise_handlerr   )r.   r4   r   r   r   r3   r
   r   r1   r   clearr	   SIG_IGNr   r   r   valueargs
isinstance__context__r@   )rB   r   rF   excinfoexcZsignumsr   rA   r   )test_catch_signals_race_condition_on_exit~   sV    


$
&

&rO   )
__future__r   r   typingr   r   r   r)   Ztrio.testingr    r   Z_signalsr   r	   r
   Z_utilr   typesr   r   r"   r$   r&   r+   r,   r1   r<   rO   r   r   r   r   <module>   s&   	
