o
    oi                     @   s8   d Z ddlZddlm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)LoopExit   )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)_ThreadHandle)
getcurrentc                 S   s   | S N )	new_identr
   r
   a/var/www/html/pca-backend/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gevent.threadr   greenletr   _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 |	 sQqCz  W n	 ty~   Y nw 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_doneF      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_doneH   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   J   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   
FakeHandleE   s    r/   gMbP?	_shutdown)r   r+   geventr%   r&   print_exceptionsysexc_infor   is_alivelist	enumeratedaemonr   RuntimeErrorr   orig_shutdown)r%   r&   r/   tr!   	_greenletr"   main_threadr:   r$   r   r   r
   r   r0   3   s:   
	


zVPatcher.patch_threading_shutdown_on_main_thread_not_already_patched.<locals>._shutdownr0   )	r   apir$   r>   r   r:   r   r=   r   )r   r   r0   r
   r<   r   ;patch_threading_shutdown_on_main_thread_not_already_patched'   s   
6zCPatcher.patch_threading_shutdown_on_main_thread_not_already_patchedN)r,   r-   r.   r#   r@   r
   r
   r
   r   r      s    r   )__doc__r3   gevent.exceptionsr   _patch_thread_commonr   r   r
   r
   r
   r   <module>   s
   