o
    ,wÖip  ã                   @   s,   d Z ddlZddlmZ G dd„ deƒZdS )z[
The implementation of thread patching for Python versions
after 3.13.

Internal use only.
é    Né   )ÚBasePatcherc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚPatcherc                 C   s²   ddl m} | jj ¡ D ]J}||ƒ krMddlm} ddlm} d	dd„|_	|ƒ }| 
|ƒ ¡ d}t|dƒr7d}t|||ƒ |j|_|jt||ƒjksLJ ‚q|  |d | j¡|_qd S )
Nr   )Úmain_native_thread)Ú
getcurrent)Ú_ThreadHandlec                 S   s   | S ©N© )Ú	new_identr	   r	   ú_/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/gevent/monkey/_patch_thread_gte313.pyÚ<lambda>   s    z.Patcher.patch_active_threads.<locals>.<lambda>Ú_handleÚ_os_thread_handler   )Úgevent.threadingr   Úthreading_modÚ_activeÚvaluesÚgreenletr   Úgevent.threadr   Ú_after_forkÚ_set_greenletÚhasattrÚsetattrÚidentÚ_identÚgetattrÚ(_make_existing_non_main_thread_join_funcÚjoin)Úselfr   Úthreadr   r   ÚhandleÚhandle_attrr	   r	   r   Úpatch_active_threads   s(   

þòzPatcher.patch_active_threadsc                    sp   dd l }ddlm‰ ˆj‰ˆj‰ˆj‰| ¡  ‰ ˆ_d‰tˆdƒr#d‰‡ ‡‡‡‡‡‡fdd„}ˆˆjd|ƒ d S )	Nr   r   )Ú
patch_itemr   r   c               	      sø   t ˆˆƒ ¡  ddlm}  z| ƒ  W n   ddlm} |ƒ jˆ gt ¡ ¢R Ž  Y G dd„ dƒ}tˆˆ|ƒ ƒ ˆ 	¡ s=J ‚t
ˆ ¡ ƒD ],}|jsL|ˆu rMqC| 	¡ rot |ˆƒ}z| d¡ W n tyj   | ¡  Y nw | 	¡ sQqCˆƒ  ˆˆdˆjƒ d S )Nr   )Úsleep)Úget_hubc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zjPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdown.<locals>.FakeHandlec                 S   s   dS )NFr	   ©r   r	   r	   r   Úis_doneC   ó   zrPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdown.<locals>.FakeHandle.is_donec                 S   ó   d S r   r	   r&   r	   r	   r   Ú	_set_doneE   r(   ztPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdown.<locals>.FakeHandle._set_donec                 S   r)   r   r	   r&   r	   r	   r   r   G   r(   zoPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdown.<locals>.FakeHandle.joinN)Ú__name__Ú
__module__Ú__qualname__r'   r*   r   r	   r	   r	   r   Ú
FakeHandleB   s    r.   gü©ñÒMbP?Ú	_shutdown)r   r*   Úgeventr$   r%   Úprint_exceptionÚsysÚexc_infor   Úis_aliveÚlistÚ	enumerateÚdaemonr   ÚRuntimeErrorÚorig_shutdown)r$   r%   r.   Útr    ©Ú	_greenletr!   Úmain_threadr9   r#   r   r   r	   r   r/   0   s2   
	
ýû€
zVPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdownr/   )	r   Úapir#   r=   r   r9   r   r<   r   )r   r   r/   r	   r;   r   Ú;patch_threading_shutdown_on_main_thread_not_already_patched%   s   
3zCPatcher.patch_threading_shutdown_on_main_thread_not_already_patchedN)r+   r,   r-   r"   r?   r	   r	   r	   r   r      s    r   )Ú__doc__r2   Ú_patch_thread_commonr   r   r	   r	   r	   r   Ú<module>   s   