U
    uc                     @   sr   d dl Z d dlZd dlZd dlZddlmZ G dd dZejdkrZG dd deejZ	nG d	d deej
Z	dS )
    N   )	wasyncorec                   @   sV   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dddZdd ZdS )_triggerbasez9OS-independent base class for OS-dependent trigger class.Nc                 C   s   d| _ t | _g | _d S NF)_closed	threadingLocklockthunksself r   4/tmp/pip-unpacked-wheel-yalm6hg1/waitress/trigger.py__init__:   s    
z_triggerbase.__init__c                 C   s   dS NTr   r   r   r   r   readableF   s    z_triggerbase.readablec                 C   s   dS r   r   r   r   r   r   writableI   s    z_triggerbase.writablec                 C   s   d S Nr   r   r   r   r   handle_connectL   s    z_triggerbase.handle_connectc                 C   s   |    d S r   )closer   r   r   r   handle_closeO   s    z_triggerbase.handle_closec                 C   s    | j sd| _ |   |   d S r   )r   Zdel_channel_closer   r   r   r   r   V   s    z_triggerbase.closec              	   C   s.   |r"| j  | j| W 5 Q R X |   d S r   )r	   r
   append_physical_pull)r   thunkr   r   r   pull_trigger\   s    z_triggerbase.pull_triggerc                 C   s   z|  d W n tk
r$   Y d S X | j^ | jD ]J}z
|  W q4   t \}}}}| d| d| d| d Y q4X q4g | _W 5 Q R X d S )Ni    zexception in trigger thunk: (: ))recvOSErrorr	   r
   r   Zcompact_tracebackZlog_info)r   r   niltvZtbinfor   r   r   handle_readb   s    

&z_triggerbase.handle_read)N)__name__
__module____qualname____doc__kindr   r   r   r   r   r   r   r$   r   r   r   r   r   5   s   
r   posixc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	triggerpipec                 C   s4   t |  t  \}| _| _tjj| ||d d S )Nmap)r   r   osr,   r+   _fdsr   file_dispatcher)r   r.   rr   r   r   r   v   s    
trigger.__init__c                 C   s,   | j D ]}t| qg | _ tj|  d S r   )r0   r/   r   r   r1   )r   fdr   r   r   r   {   s    
trigger._closec                 C   s   t | jd d S N   x)r/   writer+   r   r   r   r   r      s    trigger._physical_pullNr%   r&   r'   r)   r   r   r   r   r   r   r   r+   s   s   r+   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r+   Zloopbackc           	   
   C   s   t |  t }|tjtjd d}|d7 }t }|d | }|d z|	| W qW q( t
k
r } z@t|dd tjkr |dkr|  |  td|  W 5 d }~X Y q(X q(| \}}|  || _tjj| ||d d S )Nr   r   )z	127.0.0.1r   winerror
   zCannot bind trigger!r-   )r   r   socket
setsockoptIPPROTO_TCPTCP_NODELAYbindgetsocknamelistenconnectr    getattrerrnoZWSAEADDRINUSEr   RuntimeErroracceptr+   r   
dispatcher)	r   r.   wcountaZconnect_addressZdetailr2   addrr   r   r   r      s0    



r3   c                 C   s   | j   | j  d S r   )r=   r   r+   r   r   r   r   r      s    
r5   c                 C   s   | j d d S r6   )r+   sendr   r   r   r   r      s    r9   Nr:   r   r   r   r   r+      s   7)rF   r/   r=   r    r   r   namer1   r+   rI   r   r   r   r   <module>   s   !<
