
    iK                     |   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   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j'                  Z'e(                    d            G d de'ej)                  Z)e(                    d           eZ*ej        dd         dk     re(                    d           ne(                    d           e+                    d           e(                    d           eZe+                    d            e,ed          rdZ-e(                    d            G d  d!          Z. e.            Z/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                 `    t           j                            t          |           d            d S N)__threading___activepopr
   )gs    ;/usr/local/lib/python3.11/dist-packages/gevent/threading.py_cleanupr    [   s'    jmmT22222    c                       fd}|S )Nc                 H    t           j                            d            d S 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                      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                                 dZd Z ed d d           Z e ej                    d	          reZd	Zn$ e ej                    d
          reZd
Zne rJ dZ[d Z!e!Z"d Z#e$d             Z%e&j'        dd         dk    re&j'        dd         dk    pe&j'        dd         dk    Z(e(red             Z)e)j*        d             Z)dS dS )r   FTr'   Nc                    t          j        d          x| _        | _        |                                  t          | j                  | _        	 t          j                    | _	        n# t          $ r Y nw xY wt                      }t          |          }| t           j        |<   t          |dd           }| |t                     d S | j        } ||t#          |                    }|| _        | j        |u sJ 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+   refs        r   __init__z_DummyThread.__init__   s   
 +8*@*L*LL
T' 	$ -T[99	+9;;DOO 	 	 	D	 LLmm%)c"!Y-- GH $C#a)#..//C DN>S((((((s   A( (
A54A5c                     | j         S r   )r1   r8   s    r   <lambda>z_DummyThread.<lambda>   s    T^ r!   c                 $    t          | d|          S Nr1   )setattr)r8   	new_values     r   r=   z_DummyThread.<lambda>   s    .Ey Q Q r!   c                 "    t          | d          S r?   )delattrr<   s    r   r=   z_DummyThread.<lambda>   s    WT#:;; r!   _handle_os_thread_handlec                     d S r   r'   r<   s    r   _Thread__stopz_DummyThread._Thread__stop       r!   c                     d S r   r'   )r8   argskwargss      r   _wait_for_tstate_lockz"_DummyThread._wait_for_tstate_lock   rH   r!   c                 *    t          d          j        S )Nweakref)
__import__r9   r<   s    r   __weakref_refz_DummyThread.__weakref_ref   s    )$$((r!   r   )r      r   )r   rQ      )r      r   c                      t          |           S r   )typer<   s    r   	__class__z_DummyThread.__class__1  s    ::r!   c                 h    |t           ur(t          j        d                             | |           d S d S )NrV   )_MainThread_object__dict____set__)r8   	new_classs     r   rV   z_DummyThread.__class__5  s:     ,,,44T9EEEE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_lockr:   property_DummyThread__ghandle_prophasattrmain_threadrD   _G_HANDLE_NAMErE   PY313rG   _stoprL   r   r6   sysversion_info_NEEDS_CLASS_FORK_FIXUPrV   setterr'   r!   r   r   r   f   s       F 1655{X*..<$((	ME $$Og $$Og!!MF"5-"5"7"77xL0) 0) 0)f X## 	RQ;; N w(}(**I66  "	**,,.A	B	B *,   E   ) ) [)B 
	"1"		(	OS-=bqb-AZ-O 	.BQB:- 
  F 
	 	 
	 
	
	F 
	F 
	
	F 
	F 
	FF Fr!   r   c                  (    t          j                    S r   )r   rv   r'   r!   r   main_native_threadr   G  s    $&&&r!   c                   $     e Zd Z fdZd Z xZS )Threadc                     t          t          |                                            t                      }|                    | j                   d S r   )superr   _set_tstate_lockr   r+   _Thread__greenlet_finished)r8   greenletrV   s     r   r   zThread._set_tstate_lockX  sE    fd,,...<<122222r!   c                 r    | j         r/| j                                          |                                  d S d S r   )rr   releasery   )r8   r&   s     r   __greenlet_finishedzThread.__greenlet_finished]  s=     	%%'''JJLLLLL	 	r!   )r]   r^   r_   r   r   __classcell__)rV   s   @r   r   r   U  sG        3 3 3 3 3
      r!   r   c                       e Zd ZdS )TimerN)r]   r^   r_   r'   r!   r   r   r   d  s        Dr!   r   _set_sentinelr
   r   r   _CRLockc                   ,    e Zd ZdZdZdZd Zd Zd ZdS )
_ForkHooksNc                     t          t          j                  | _        t          j                    | _        t                      | _        d S r   )dictr   r   _before_fork_activecurrent_thread_before_fork_current_threadr   _before_fork_identr<   s    r   before_fork_in_parentz _ForkHooks.before_fork_in_parent  s8    #'(=#>#> +8+G+I+I("+++r!   c           	         t           j        sd S t                      }| j                                        D ]\  }}||k    r	 t          |dt          |t           j                            }|                    d           M# t          $ r3 t          j	        d d         dk     sJ |
                                rJ Y w xY wd S )Nr1   F)	enter_hubr   r   )r   rw   r   r   itemsr5   	_set_doner4   rz   r{   is_alive)r8   current_identgreen_identthreadhandles        r    _stop_running_greenlets_in_childz+_ForkHooks._stop_running_greenlets_in_child  s     * 	F!#'#;#A#A#C#C 	2 	2Km++2 !3FL$?@@    5 1111 " - - - '+g5555!??,,,,,,,	-	2 	2s   )B:C ?C c                    t           j        }t          |          dk    sJ t          j                    | j        u sJ t                      | j        k    sJ |                                  t          j                    }t                      |_	        |t           j        t          j                    <   |t           _
        t          j                    }|j        t          j                    k    sJ d S )N   )r   r   lenr   r   r   r   r   _MainThreadr0   _main_threadrv   ident)r8   activemains      r   after_fork_in_childz_ForkHooks.after_fork_in_child  s     &6{{a+--1QQQQQ{{d55555--///(**kk;?m5778%)"(**z]466666666r!   )	r]   r^   r_   r   r   r   r   r   r   r'   r!   r   r   r     sT        "&. . .
$2 $2 $2N7 7 7 7 7r!   r   c                    t                      }t          j                    |k    r |d           d S t                      t          j        vrI|j        }t          j        |= t                      x|_        |_        |t          j        t                      <   t          t          dd           }|r# |t          j        t          j                   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)r   r   r   r
   r   r   r0   _Thread__identr5   os_fork_hooksr   r   )native_moduler   warnrv   main_idr   s         r   _gevent_will_monkey_patchr     s     %&&K#%%44 S 	T 	T 	T||=000#!'*:D,,F[7.9jll+r#5t<< <4&:	< 	< 	< 	< 	< 	<< <r!   )1__doc__r   rz   r{   rx   __implements____extensions__	threadingr   r   _DummyThread_r   rX   gevent.localr   gevent.threadr   r   r   r   r   r   r   r   r
   
gevent.hubr   r   r   gevent.lockr   gevent._utilr   r   r	   r    r(   _weakrefr   r   appendr   r   removeru   r   r   r   r   r'   r!   r   <module>r      s   4 
			 



!'   
   * " ! ! !*(       ? ? ? ? ? ? / / / / / / ' ' ' ' ' ' - - - - - - 9 9 9 9 9 9 1 1 1 1 1 1 2 2 2 2 2 2 2 2       % $ $ $ $ $ 	$ . ) 
	
3 3 3  
 ZF ZF ZF ZF ZF= ZF ZF ZFB' ' '    ]!      h   	 	 	 	 	FM' 	 	 	   g   BQB'!!/****/***   l # # #   k " " "	   h   
7=)$$ % G)$$$C7 C7 C7 C7 C7 C7 C7 C7J jll< < < < <r!   