
    <|hA                     6   d Z ddlZddlZg dej                  dd dk  rdgng dz   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 Z"d Z#dZ$ G d de	      Zd Z% G d dejL                        Z&ejO                  d        G d de&ejP                        Z(ejO                  d       eZ)ej                  dd dk  rejO                  d       nejO                  d       ejU                  d       ejO                  d       eZejU                  d        e+ed      rdZ,ejO                  d        G d  d!      Z- e-       Z.d" Z/y)#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                 V    t         j                  j                  t        |       d        y N)__threading___activepopr   )gs    O/var/www/html/test/engine/venv/lib/python3.12/site-packages/gevent/threading.py_cleanupr    Y   s    jmT2    c                       fd}|S )Nc                 F    t         j                  j                  d        y r   )r   r   r   )_rgids    r   _z_make_cleanup_id.<locals>._]   s    !!#t,r!    )r%   r&   s   ` r   _make_cleanup_idr(   \   s    -Hr!   c                   j   e Zd ZdxZxZZdxZZdxZZ	dxZ
ZdxZZdxZZdxZZ ej&                         xZZej-                          dZdZd Zd ZeZd Zed        Zej@                  dd	 d
k(  xr ej@                  dd dk\  xs ej@                  dd dk\  Z!e!re"d        Z#e#jH                  d        Z#yy)r   FTr'   Nc                    t        j                  d      x| _        | _        | j	                          t        | j                        | _        t        j                         | _	        t               }t        |      }| t         j                  |<   t        |dd       }| |t               y | j                  } ||t!        |            }|| _        | j"                  |u sJ y )NzDummy-%drawlink)r   _newname_name_Thread__name
_set_identr   _ident_handleget_native_id
_native_idr   r   r   getattrr    _DummyThread__weakref_refr(   _DummyThread__raw_ref)selfr   r%   r+   refs        r   __init__z_DummyThread.__init__   s    
 +8*@*@*LL
T' 	 +4;;7'557Lm%)c"!Y- H $$Ca)#./C DN>>S(((r!   c                      y r   r'   r7   s    r   _Thread__stopz_DummyThread._Thread__stop       r!   c                      y r   r'   )r7   argskwargss      r   _wait_for_tstate_lockz"_DummyThread._wait_for_tstate_lock   r=   r!   c                 ,    t        d      j                  S )Nweakref)
__import__r8   r;   s    r   __weakref_refz_DummyThread.__weakref_ref   s    )$(((r!   r	   )r      r   )r   rF      )r      r	   c                     t        |       S r   )typer;   s    r   	__class__z_DummyThread.__class__  s    :r!   c                 \    |t         ur$t        j                  d   j                  | |       y y )NrK   )_MainThread_object__dict____set__)r7   	new_classs     r   rK   z_DummyThread.__class__  s*     ,,44T9E -r!   )%__name__
__module____qualname___Thread__stopped_is_stopped_stopped_Thread__initialized_initialized_Thread__daemonic	_daemonic_Thread__args_args_Thread__kwargs_kwargs_Thread__target_target_Thread_identr0   r   Event_Thread__started_startedset_tstate_lockr1   r9   r<   _stoprA   r   r5   sysversion_info_NEEDS_CLASS_FORK_FIXUPpropertyrK   setterr'   r!   r   r   r   d   s1   F 1655{X*..<$((	ME $$Og $$Og!!MF"5-"5"5"77xLG)> E ) )B 
		"1		(	OS-=-=bq-AZ-O 	.BQ:- 
  
	 
	 
		
	F 

	F r!   r   c                  *    t        j                         S r   )r   main_threadr'   r!   r   main_native_threadrp     s    $$&&r!   c                   $     e Zd Z fdZd Z xZS )Threadc                 t    t         t        |           t               }|j	                  | j
                         y r   )superrr   _set_tstate_lockr   r+   _Thread__greenlet_finished)r7   greenletrK   s     r   ru   zThread._set_tstate_lock*  s+    fd,.<112r!   c                 r    | j                   r+| j                   j                          | j                          y y r   )rg   releaserh   )r7   r&   s     r   __greenlet_finishedzThread.__greenlet_finished/  s+    %%'JJL r!   )rR   rS   rT   ru   rv   __classcell__)rK   s   @r   rr   rr   '  s    3
r!   rr   c                       e Zd Zy)TimerN)rR   rS   rT   r'   r!   r   r}   r}   6  s    r!   r}   _set_sentinelr   r   r   _CRLockc                        e Zd ZdZdZd Zd Zy)
_ForkHooksNc                 r    t        t        j                        | _        t        j                         | _        y r   )dictr   r   _before_fork_activecurrent_thread_before_fork_current_threadr;   s    r   before_fork_in_parentz _ForkHooks.before_fork_in_parent\  s&    #'(=(=#> +8+G+G+I(r!   c                 l   t         j                  }t        |      dk(  sJ t               }| j                  j                         D ]*  \  }}||k7  s	 |j                  }|j                  d       , t        j                         }t               |_        |t         j                  t        j                         <   |t         _        t        j                         }|j                   t        j                         k(  sJ y # t        $ r- t        j                  d d dk  sJ |j                         rJ Y w xY w)N   F)	enter_hubr	   r
   )r   r   lenr   r   itemsr1   	_set_doneAttributeErrorri   rj   is_alive_MainThreadr0   _main_threadro   ident)r7   activecurrent_identgreen_identthreadhandlemains          r   after_fork_in_childz_ForkHooks.after_fork_in_child`  s    &&6{a "#'#;#;#A#A#C 	6Km+	6#^^F $$u$5	6 ((*k;?m5578%)"((*zz]446666# & 1++BQ/'999%00001s   C==3D32D3)rR   rS   rT   r   r   r   r   r'   r!   r   r   r   V  s    "&J+7r!   r   c                    t               }t        j                         |k7  r	 |d       y t               t        j                  vrN|j
                  }t        j                  |= t               x|_        |_        |t        j                  t               <   t        t        dd       }|r' |t        j                  t        j                         y y )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)rp   r   r   r   r   r   r0   _Thread__identr4   os_fork_hooksr   r   )native_moduler   warnro   main_idr   s         r   _gevent_will_monkey_patchr     s     %&K##%4 S 	T|=000##!!'*:D,F[7.9jl+r#5t<44&::	< r!   )0__doc__r   ri   rj   __implements____extensions__	threadingr   r   _DummyThread_r   rM   gevent.localr   gevent.threadr   r   r   r   r   r   r   r   r   
gevent.hubr   r   r   gevent.lockr   gevent._utilr   r   r   r    r(   _weakrefrp   rr   appendr}   r~   removehasattrr   r   r   r   r'   r!   r   <module>r      s  4 
 
 	bqG# ** "**((  ? / ' - 9 1 2  % 	$ . ) 
	
3
 nF= nFj']!!    h 	FM'' 	   g BQ'!/*/*   l #   k "	   h 
=)$ G)$57 57p l<r!   