B
    2*\J                 @   s  d dl mZmZ d dlmZ d dlmZ d dlZd dlZd dl	Z	dZ
dZdd Zed	d
dddgZde_e	jdkrdej_dej_dej_dej_G dd deZG dd dedZG dd deZG dd deZG dd deZeedrG d d! d!eZeed"rG d#d$ d$eZeed%r6G d&d' d'eZeed(rRG d)d* d*eZd*e krdeZn:d$e krveZn(d'e kreZnd!e kreZneZdS )+    )ABCMetaabstractmethod)
namedtuple)MappingN      c          
   C   sf   t | tr| }n<yt|  }W n* tttfk
rJ   td| d Y nX |dk rbtd||S )NzInvalid file object: {!r}r   zInvalid file descriptor: {})
isinstanceintfilenoAttributeError	TypeError
ValueErrorformat)fileobjfd r   4C:\ALexclude\prg\programme\Python37\Lib\selectors.py_fileobj_to_fd   s    
r   SelectorKeyr   r   eventsdatazSelectorKey(fileobj, fd, events, data)

    Object used to associate a file object to its backing
    file descriptor, selected event mask, and attached data.
)      zFile object registered.zUnderlying file descriptor.z3Events that must be waited for on this file object.zzOptional opaque data associated to this file object.
    For example, this could be used to store a per-client session ID.c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_SelectorMappingc             C   s
   || _ d S )N)	_selector)selfZselectorr   r   r   __init__?   s    z_SelectorMapping.__init__c             C   s   t | jjS )N)lenr   
_fd_to_key)r   r   r   r   __len__B   s    z_SelectorMapping.__len__c             C   sB   y| j |}| j j| S  tk
r<   td|d Y nX d S )Nz{!r} is not registered)r   _fileobj_lookupr   KeyErrorr   )r   r   r   r   r   r   __getitem__E   s
    z_SelectorMapping.__getitem__c             C   s   t | jjS )N)iterr   r   )r   r   r   r   __iter__L   s    z_SelectorMapping.__iter__N)__name__
__module____qualname__r   r   r"   r$   r   r   r   r   r   <   s   r   c               @   sj   e Zd ZedddZedd ZdddZeddd	Zd
d Zdd Z	edd Z
dd Zdd ZdS )BaseSelectorNc             C   s   t d S )N)NotImplementedError)r   r   r   r   r   r   r   register_   s    zBaseSelector.registerc             C   s   t d S )N)r)   )r   r   r   r   r   
unregisterv   s    zBaseSelector.unregisterc             C   s   |  | | |||S )N)r+   r*   )r   r   r   r   r   r   r   modify   s    
zBaseSelector.modifyc             C   s   t d S )N)r)   )r   timeoutr   r   r   select   s    zBaseSelector.selectc             C   s   d S )Nr   )r   r   r   r   close   s    zBaseSelector.closec             C   sJ   |   }|d krtdy|| S  tk
rD   td|d Y nX d S )NzSelector is closedz{!r} is not registered)get_mapRuntimeErrorr!   r   )r   r   mappingr   r   r   get_key   s    zBaseSelector.get_keyc             C   s   t d S )N)r)   )r   r   r   r   r0      s    zBaseSelector.get_mapc             C   s   | S )Nr   )r   r   r   r   	__enter__   s    zBaseSelector.__enter__c             G   s   |    d S )N)r/   )r   argsr   r   r   __exit__   s    zBaseSelector.__exit__)N)N)N)r%   r&   r'   r   r*   r+   r,   r.   r/   r3   r0   r4   r6   r   r   r   r   r(   P   s   
r(   )	metaclassc               @   sP   e Zd Zdd Zdd ZdddZdd	 Zdd
dZdd Zdd Z	dd Z
dS )_BaseSelectorImplc             C   s   i | _ t| | _d S )N)r   r   _map)r   r   r   r   r      s    z_BaseSelectorImpl.__init__c             C   sH   yt |S  tk
rB   x"| j D ]}|j|kr$|jS q$W  Y nX d S )N)r   r   r   valuesr   r   )r   r   keyr   r   r   r       s    	

z!_BaseSelectorImpl._fileobj_lookupNc             C   sb   |r|t tB  @ r td|t|| |||}|j| jkrRtd||j|| j|j< |S )NzInvalid events: {!r}z"{!r} (FD {}) is already registered)	
EVENT_READEVENT_WRITEr   r   r   r    r   r   r!   )r   r   r   r   r;   r   r   r   r*      s    z_BaseSelectorImpl.registerc             C   s@   y| j | |}W n$ tk
r:   td|d Y nX |S )Nz{!r} is not registered)r   popr    r!   r   )r   r   r;   r   r   r   r+      s
    z_BaseSelectorImpl.unregisterc             C   s   y| j | | }W n$ tk
r8   td|d Y nX ||jkr^| | | |||}n"||jkr|j|d}|| j |j	< |S )Nz{!r} is not registered)r   )
r   r    r!   r   r   r+   r*   r   _replacer   )r   r   r   r   r;   r   r   r   r,      s    


z_BaseSelectorImpl.modifyc             C   s   | j   d | _d S )N)r   clearr9   )r   r   r   r   r/     s    
z_BaseSelectorImpl.closec             C   s   | j S )N)r9   )r   r   r   r   r0     s    z_BaseSelectorImpl.get_mapc             C   s$   y
| j | S  tk
r   d S X d S )N)r   r!   )r   r   r   r   r   _key_from_fd  s    	
z_BaseSelectorImpl._key_from_fd)N)N)r%   r&   r'   r   r    r*   r+   r,   r/   r0   rA   r   r   r   r   r8      s   

r8   c                   s\   e Zd Z fddZd fdd	Z fddZejdkrDdd	d
Zne	j	ZdddZ	  Z
S )SelectSelectorc                s   t    t | _t | _d S )N)superr   set_readers_writers)r   )	__class__r   r   r   %  s    
zSelectSelector.__init__Nc                s@   t  |||}|t@ r&| j|j |t@ r<| j|j |S )N)rC   r*   r<   rE   addr   r=   rF   )r   r   r   r   r;   )rG   r   r   r*   *  s    zSelectSelector.registerc                s,   t  |}| j|j | j|j |S )N)rC   r+   rE   discardr   rF   )r   r   r;   )rG   r   r   r+   2  s    zSelectSelector.unregisterwin32c             C   s$   t  ||||\}}}||| g fS )N)r.   )r   rw_r-   xr   r   r   _select9  s    zSelectSelector._selectc       	      C   s   |d krd nt |d}g }y| | j| jg |\}}}W n tk
rL   |S X t|}t|}xV||B D ]J}d}||kr|tO }||kr|tO }| |}|rh|	|||j
@ f qhW |S )Nr   )maxrO   rE   rF   InterruptedErrorrD   r<   r=   rA   appendr   )	r   r-   readyrK   rL   rM   r   r   r;   r   r   r   r.   ?  s$    
zSelectSelector.select)N)N)N)r%   r&   r'   r   r*   r+   sysplatformrO   r.   __classcell__r   r   )rG   r   rB   "  s   
rB   c                   sZ   e Zd ZdZdZdZ fddZd fdd	Z fddZd fdd		Z	dd
dZ
  ZS )_PollLikeSelectorNc                s   t    |  | _d S )N)rC   r   _selector_clsr   )r   )rG   r   r   r   [  s    
z_PollLikeSelector.__init__c                sl   t  |||}d}|t@ r&|| jO }|t@ r8|| jO }y| j|j| W n   t  |  Y nX |S )Nr   )	rC   r*   r<   _EVENT_READr=   _EVENT_WRITEr   r   r+   )r   r   r   r   r;   Zpoller_events)rG   r   r   r*   _  s    

z_PollLikeSelector.registerc                s8   t  |}y| j|j W n tk
r2   Y nX |S )N)rC   r+   r   r   OSError)r   r   r;   )rG   r   r   r+   m  s    z_PollLikeSelector.unregisterc                s   y| j | | }W n$ tk
r8   t|dd Y nX d}||jkrd}|t@ r^|| jO }|t@ rp|| jO }y| j	|j
| W n   t |  Y nX d}||jkrd}|r|j||d}|| j |j
< |S )Nz is not registeredFr   T)r   r   )r   r    r!   r   r<   rY   r=   rZ   r   r,   r   rC   r+   r   r?   )r   r   r   r   r;   ZchangedZselector_events)rG   r   r   r,   w  s.    



z_PollLikeSelector.modifyc             C   s   |d krd }n|dkrd}nt |d }g }y| j|}W n tk
rR   |S X x^|D ]V\}}d}|| j @ rz|tO }|| j @ r|tO }| 	|}|rZ|
|||j@ f qZW |S )Nr   g     @@)mathceilr   pollrQ   rY   r=   rZ   r<   rA   rR   r   )r   r-   rS   fd_event_listr   eventr   r;   r   r   r   r.     s(    
z_PollLikeSelector.select)N)N)N)r%   r&   r'   rX   rY   rZ   r   r*   r+   r,   r.   rV   r   r   )rG   r   rW   U  s   
rW   r^   c               @   s   e Zd ZejZejZejZ	dS )PollSelectorN)
r%   r&   r'   r.   r^   rX   POLLINrY   POLLOUTrZ   r   r   r   r   ra     s   ra   epollc                   s@   e Zd ZejZejZejZ	dd Z
dddZ fddZ  ZS )	EpollSelectorc             C   s
   | j  S )N)r   r
   )r   r   r   r   r
     s    zEpollSelector.filenoNc       	      C   s   |d krd}n |dkrd}nt |d d }tt| jd}g }y| j||}W n tk
rh   |S X x^|D ]V\}}d}|tj	 @ r|t
O }|tj @ r|tO }| |}|rp||||j@ f qpW |S )Nr   g     @@gMbP?r   )r\   r]   rP   r   r   r   r^   rQ   r.   EPOLLINr=   EPOLLOUTr<   rA   rR   r   )	r   r-   max_evrS   r_   r   r`   r   r;   r   r   r   r.     s*    
zEpollSelector.selectc                s   | j   t   d S )N)r   r/   rC   )r   )rG   r   r   r/     s    
zEpollSelector.close)N)r%   r&   r'   r.   rd   rX   rg   rY   rh   rZ   r
   r/   rV   r   r   )rG   r   re     s   
 re   devpollc                   s6   e Zd ZejZejZejZ	dd Z
 fddZ  ZS )DevpollSelectorc             C   s
   | j  S )N)r   r
   )r   r   r   r   r
     s    zDevpollSelector.filenoc                s   | j   t   d S )N)r   r/   rC   )r   )rG   r   r   r/     s    
zDevpollSelector.close)r%   r&   r'   r.   rj   rX   rb   rY   rc   rZ   r
   r/   rV   r   r   )rG   r   rk     s
   rk   kqueuec                   sT   e Zd Z fddZdd Zd fdd	Z fdd	Zdd
dZ fddZ  Z	S )KqueueSelectorc                s   t    t | _d S )N)rC   r   r.   rl   r   )r   )rG   r   r   r     s    
zKqueueSelector.__init__c             C   s
   | j  S )N)r   r
   )r   r   r   r   r
     s    zKqueueSelector.filenoNc                s   t  |||}y`|t@ r@t|jtjtj}| j	|gdd |t
@ rnt|jtjtj}| j	|gdd W n   t  |  Y nX |S )Nr   )rC   r*   r<   r.   keventr   KQ_FILTER_READZ	KQ_EV_ADDr   controlr=   KQ_FILTER_WRITEr+   )r   r   r   r   r;   kev)rG   r   r   r*     s    zKqueueSelector.registerc                s   t  |}|jt@ rVt|jtjtj}y| j	
|gdd W n tk
rT   Y nX |jt@ rt|jtjtj}y| j	
|gdd W n tk
r   Y nX |S )Nr   )rC   r+   r   r<   r.   rn   r   ro   ZKQ_EV_DELETEr   rp   r[   r=   rq   )r   r   r;   rr   )rG   r   r   r+     s     

zKqueueSelector.unregisterc       
      C   s   |d krd nt |d}t| j}g }y| jd ||}W n tk
rL   |S X xb|D ]Z}|j}|j}d}|tj	krz|t
O }|tjkr|tO }| |}	|	rT||	||	j@ f qTW |S )Nr   )rP   r   r   r   rp   rQ   Zidentfilterr.   ro   r<   rq   r=   rA   rR   r   )
r   r-   ri   rS   Zkev_listrr   r   flagr   r;   r   r   r   r.   )  s&    




zKqueueSelector.selectc                s   | j   t   d S )N)r   r/   rC   )r   )rG   r   r   r/   ?  s    
zKqueueSelector.close)N)N)
r%   r&   r'   r   r
   r*   r+   r.   r/   rV   r   r   )rG   r   rm     s   
rm   ) abcr   r   collectionsr   Zcollections.abcr   r\   r.   rT   r<   r=   r   r   __doc__version_infor   r   r   r   r   r(   r8   rB   rW   hasattrra   re   rk   rm   globalsZDefaultSelectorr   r   r   r   <module>   sJ   
~T3Z
.M