o
    iK                     @   s  d Z ddlZddlZejdd dkZg desdgng d Zg ZddlZej	Z
ejZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlm Z  eZeZeZ!eZeZeZeZeZeZeZ"eZdd Z#dd Z$dZ%G dd de
Z	dd Z&G dd dej'Z'e(d G dd de'ej)Z)e(d eZ*ejdd dk re(d ne(d e+d e(d  eZe+d! e,ed"rdZ-e(d" G d#d$ d$Z.e. Z/d%d& Z0dS )'a  
Implementation of the standard :mod:`threading` using greenlets.

.. note::

    This module is a helper for :mod:`gevent.monkey` and is not
    intended to be used directly. For spawning greenlets in your
    applications, prefer higher level constructs like
    :class:`gevent.Greenlet` class or :func:`gevent.spawn`. Attributes
    in this module like ``__threading__`` are implementation artifacts subject
    to change at any time.

.. versionchanged:: 1.2.3

   Defer adjusting the stdlib's list of active threads until we are
   monkey patched. Previously this was done at import time. We are
   documented to only be used as a helper for monkey patching, so this should
   functionally be the same, but some applications ignore the documentation and
   directly import this module anyway.

   A positive consequence is that ``import gevent.threading,
   threading; threading.current_thread()`` will no longer return a DummyThread
   before monkey-patching.
    N         )local_allocate_lockLock
_get_ident_sleep_DummyThread_start_new_thread)_start_joinable_thread_ThreadHandle_make_thread_handle)r   )start_new_thread)start_joinable_thread)r   )r   )allocate_lock)	get_ident)sleep
getcurrent)RLock)LazyOnClassc                 C   s   t jt| d  d S N)__threading___activepopr	   )g r   X/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/threading.py_cleanup[   s   r   c                    s    fdd}|S )Nc                    s   t j d  d S r   )r   r   r   )_rgidr   r   __   s   z_make_cleanup_id.<locals>._r   )r"   r#   r   r!   r   _make_cleanup_id^   s   r$   c                   @   s6  e Zd Zd Z ZZd ZZd ZZ	d Z
Zd ZZd ZZd ZZe  ZZe  dZdd Zedd d	d d
d Zee drJeZdZnee drVeZdZne rZJ dZ[dd Z!e!Z"dd Z#e$dd Z%e&j'dd dkre&j'dd dkpe&j'dd dkZ(e(redd Z)e)j*dd Z)dS dS )r   FTr   Nc                 C   s   t d | _| _|   t| j| _zt  | _	W n	 t
y#   Y nw t }t|}| t j|< t|dd }|d ur@|t d S | j}||t|}|| _| j|u sTJ d S )NzDummy-%drawlink)r   _newname_name_Thread__name
_set_identr   _ident_DummyThread__ghandleget_native_id
_native_idAttributeErrorr   r	   r   getattrr   _DummyThread__weakref_refr$   _DummyThread__raw_ref)selfr   r"   r%   refr   r   r   __init__   s$   
z_DummyThread.__init__c                 C   s   | j S r   )r+   r2   r   r   r   <lambda>   s    z_DummyThread.<lambda>c                 C   s   t | d|S Nr+   )setattr)r2   	new_valuer   r   r   r6      s    c                 C   s
   t | dS r7   )delattrr5   r   r   r   r6      s   
 _handle_os_thread_handlec                 C      d S r   r   r5   r   r   r   _Thread__stop      z_DummyThread._Thread__stopc                 O   r=   r   r   )r2   argskwargsr   r   r   _wait_for_tstate_lock   r?   z"_DummyThread._wait_for_tstate_lockc                 C   s
   t djS )Nweakref)
__import__r3   r5   r   r   r   __weakref_ref   s   
z_DummyThread.__weakref_refr   )r      r   )r   rF      )r      r   c                 C   s   t | S r   )typer5   r   r   r   	__class__1  s   z_DummyThread.__class__c                 C   s"   |t urtjd | | d S d S )NrJ   )_MainThread_object__dict____set__)r2   	new_classr   r   r   rJ   5  s   
)+__name__
__module____qualname___Thread__stopped_is_stopped_stopped_Thread__initialized_initialized_Thread__daemonic	_daemonic_Thread__args_args_Thread__kwargs_kwargs_Thread__target_target_Thread_identr*   r   Event_Thread__started_startedset_tstate_lockr4   property_DummyThread__ghandle_prophasattrmain_threadr;   _G_HANDLE_NAMEr<   PY313r>   _stoprB   r   r0   sysversion_info_NEEDS_CLASS_FORK_FIXUPrJ   setterr   r   r   r   r   f   sP    #3
$A
r   c                   C   s   t  S r   )r   ri   r   r   r   r   main_native_threadG  s   rq   c                       s$   e Zd Z fddZdd Z  ZS )Threadc                    s$   t t|   t }|| j d S r   )superrr   _set_tstate_lockr   r%   _Thread__greenlet_finished)r2   greenletrJ   r   r   rt   X  s   zThread._set_tstate_lockc                 C   s    | j r| j   |   d S d S r   )re   releaserl   )r2   r#   r   r   r   __greenlet_finished]  s   
zThread.__greenlet_finished)rP   rQ   rR   rt   ru   __classcell__r   r   rw   r   rr   U  s    rr   c                   @   s   e Zd ZdS )TimerN)rP   rQ   rR   r   r   r   r   r{   d  s    r{   _set_sentinelr	   r   r
   _CRLockc                   @   s0   e Zd ZdZdZdZdd Zdd Zdd ZdS )
_ForkHooksNc                 C   s"   t tj| _t | _t | _d S r   )dictr   r   _before_fork_activecurrent_thread_before_fork_current_threadr   _before_fork_identr5   r   r   r   before_fork_in_parent  s   
z _ForkHooks.before_fork_in_parentc              	   C   s   t jsd S t }| j D ]6\}}||krqzt|dt|t j}W n ty<   tjd d dk s4J |	 r:J Y qw |j
dd qd S )Nr+   r   r   F)	enter_hub)r   rj   r   r   itemsr/   r.   rm   rn   is_alive	_set_done)r2   current_identgreen_identthreadhandler   r   r    _stop_running_greenlets_in_child  s"   
	z+_ForkHooks._stop_running_greenlets_in_childc                 C   s   t j}t|dksJ t  | ju sJ t | jksJ |   t  }t |_	|t jt  < |t _
t  }|jt  ks?J d S )N   )r   r   lenr   r   r   r   r   _MainThreadr*   _main_threadri   ident)r2   activemainr   r   r   after_fork_in_child  s   z_ForkHooks.after_fork_in_child)	rP   rQ   rR   r   r   r   r   r   r   r   r   r   r   r~     s    'r~   c                 C   sz   t  }t |kr|d d S t tjvr)|j}tj|= t  |_|_|tjt < tt	dd }|r;|t
jt
jd d S d S )Nz}Monkey-patching outside the main native thread. Some APIs will not be available. Expect a KeyError to be printed at shutdown.register_at_fork)beforeafter_in_child)rq   r   r   r	   r   r   r*   _Thread__identr/   os_fork_hooksr   r   )native_moduler   warnri   main_idr   r   r   r   _gevent_will_monkey_patch  s    
r   )1__doc__r   rm   rn   rk   __implements____extensions__	threadingr   r   _DummyThread_r   rK   gevent.localr   gevent.threadr   r   r   r   r   r   r   r   r	   
gevent.hubr   r
   r   gevent.lockr   gevent._utilr   r   r   r   r$   _weakrefrq   rr   appendr{   r|   removerh   r}   r~   r   r   r   r   r   r   <module>   sx     b








E