B
    ê¹`¢  ã               @   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   úX/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/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 )NFr   )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 )N)Úclose)r
   r   r   r   Úhandle_closeO   s    z_triggerbase.handle_closec             C   s    | j sd| _ |  ¡  |  ¡  d S )NT)r   Zdel_channelÚ_close)r
   r   r   r   r   V   s    z_triggerbase.closec          	   C   s.   |r"| j  | j |¡ W d Q R X |  ¡  d S )N)r   r	   ÚappendÚ_physical_pull)r
   Úthunkr   r   r   Úpull_trigger\   s    z_triggerbase.pull_triggerc             C   sŒ   y|   d¡ W n tk
r"   d S X | jX xJ| jD ]@}y
|ƒ  W q4   t ¡ \}}}}|  d|||f ¡ Y q4X q4W g | _W d Q R X d S )Ni    z&exception in trigger thunk: (%s:%s %s))Ú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   x   s    
ztrigger.__init__c             C   s0   x| j D ]}t |¡ qW g | _ tj | ¡ d S )N)r(   r'   r   r   r)   )r
   Úfdr   r   r   r   }   s    ztrigger._closec             C   s   t  | jd¡ d S )Nó   x)r'   Úwriter$   )r
   r   r   r   r   ƒ   s    ztrigger._physical_pullN)r   r   r    r"   r   r   r   r   r   r   r   r$   u   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}xœ|d7 }t ¡ }| d¡ | ¡ }| d¡ y| 	|¡ P W q* t
k
rÀ } z<|d tjkrˆ‚ |dkr¨| ¡  | ¡  tdƒ‚| ¡  W d d }~X Y q*X q*W | ¡ \}}| ¡  || _tjj| ||d d S )Nr   r   )z	127.0.0.1r   é
   zCannot bind trigger!)r&   )r   r   ÚsocketÚ
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚbindÚgetsocknameÚlistenÚconnectr   ÚerrnoZWSAEADDRINUSEr   ÚRuntimeErrorÚacceptr$   r   Ú
dispatcher)	r
   r&   ÚwÚcountÚaZconnect_addressZdetailr*   Úaddrr   r   r   r   Ž   s2    



ztrigger.__init__c             C   s   | j  ¡  | j ¡  d S )N)r/   r   r$   )r
   r   r   r   r   Å   s    
ztrigger._closec             C   s   | j  d¡ d S )Nr,   )r$   Úsend)r
   r   r   r   r   Ê   s    ztrigger._physical_pullN)r   r   r    r"   r   r   r   r   r   r   r   r$   ‹   s   7)r7   r'   r/   r   Ú r   r   Únamer)   r$   r:   r   r   r   r   Ú<module>   s   !>
