3
Z_ð]"  ã            
   @   sÜ   d Z ddlZddlmZ ddlmZ ddlmZ ddlZdddd	d
dddddg
Z	ej
rbe	dg7 Z	ne	ddg7 Z	ejjdƒZejƒ Zdaejjdeƒ ej
rœdndefdefƒ daG dd„ deƒZdadd„ Zdd„ ZeZdS )z=Implements the standard threading module, using greenthreads.é    N)Úthread)Útime)Ú	greenletsÚ_start_new_threadÚ_allocate_lockZ_sleepÚlocalÚ
stack_sizeÚLockÚcurrentThreadÚcurrent_threadÚ_after_forkÚ	_shutdownZ
_get_identÚ	get_identÚ_set_sentinelÚ	threadingr   Ú_threadr   é   c               @   s|   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZeZdd„ Z	e	Z
eee	ƒZedd„ ƒZdd„ ZeZedd„ ƒZdd„ ZeZdS )Ú_GreenThreadzQWrapper for GreenThread objects to provide Thread-like attributes
    and methodsc             C   s   || _ dt | _td7 ad S )NzGreenThread-%dr   )Ú_gÚ_countÚ_name)ÚselfÚg© r   ú</tmp/pip-build-yz_zf6az/eventlet/eventlet/green/threading.pyÚ__init__$   s    
z_GreenThread.__init__c             C   s   d| j | jf S )Nz<_GreenThread(%s, %r)>)r   r   )r   r   r   r   Ú__repr__*   s    z_GreenThread.__repr__Nc             C   s
   | j jƒ S )N)r   Úwait)r   Útimeoutr   r   r   Újoin-   s    z_GreenThread.joinc             C   s   | j S )N)r   )r   r   r   r   ÚgetName0   s    z_GreenThread.getNamec             C   s   t |ƒ| _d S )N)Ústrr   )r   Únamer   r   r   ÚsetName4   s    z_GreenThread.setNamec             C   s
   t | jƒS )N)Úidr   )r   r   r   r   Ú<lambda>:   s    z_GreenThread.<lambda>c             C   s   dS )NTr   )r   r   r   r   ÚisAlive<   s    z_GreenThread.isAlivec             C   s   dS )NTr   )r   r   r   r   r%   @   s    c             C   s   | j S )N)Údaemon)r   r   r   r   ÚisDaemonB   s    z_GreenThread.isDaemon)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    Úget_namer#   Úset_nameÚpropertyr"   Úidentr&   Úis_aliver'   r(   Z	is_daemonr   r   r   r   r       s   

r   c             C   s0   t stdƒa tt jdƒr,t| dƒ r,| j| _| S )Nr   r-   )Ú__threadingÚ
__import__ÚhasattrÚThreadr    r-   )Útr   r   r   Ú_fixup_threadJ   s    r7   c                 sì   t jƒ } | sttjƒ ƒS y
tj‰ W n tk
r@   i  ‰ t_Y nX t| ƒ‰ˆ j	ˆƒ}|d k	r`|S t
d krztjjtdƒjƒa
‡fdd„t
ƒ D ƒ}|rš|d S ‡ ‡fdd„}y| j|ƒ W n  tk
rÖ   ttjƒ ƒ}Y nX t| ƒ }ˆ ˆ< |S )Nr   c                s   g | ]}|j ˆ kr|‘qS r   )r0   )Ú.0Úth)Úg_idr   r   ú
<listcomp>s   s    z"current_thread.<locals>.<listcomp>r   c                s
   ˆ ˆ= d S )Nr   )r   )Úactiver:   r   r   Úcleanupx   s    zcurrent_thread.<locals>.cleanup)ÚgreenletZ
getcurrentr7   Ú__orig_threadingr   Ú__threadlocalr<   ÚAttributeErrorr$   ÚgetÚ__patched_enumerateÚeventletÚpatcherZpatch_functionr3   Ú	enumerateÚlinkr   )r   r6   Úfoundr=   r   )r<   r:   r   r   [   s.    

)r,   rD   Zeventlet.greenr   r   Zeventlet.supportr   r>   ÚsixZ__patched__ÚPY2rE   Úoriginalr?   r   r@   rC   ZinjectÚglobalsr   Úobjectr   r2   r7   r   r
   r   r   r   r   Ú<module>   s2   


'+