o
    ,wiD                     @   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%ejdd dk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/ Z0d'd( Z1d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   M/home/ubuntu/sommelier/.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$   r   )r   r      c                   @   s   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er3dZnejdd dkr>dZdd Zd	d
 ZeZdd Z e!dd Z"ejdd dkrdejdd dkplejdd dkZ#e#r~e$dd Z%e%j&dd Z%dS dS )r   FTr   Nr   r   c                 C   s   t d | _| _|   trt| j| _nt	rt| j| _
zt  | _W n	 ty.   Y nw t }t|}| t j|< t|dd }|d urK|t d S | j}||t|}|| _| j|u s_J d S )NzDummy-%drawlink)r   _newname_name_Thread__name
_set_ident_needs_os_thread_handler   _ident_os_thread_handlePY313_handle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      d S r   r   r6   r   r   r   _Thread__stop      z_DummyThread._Thread__stopc                 O   r9   r   r   )r6   argskwargsr   r   r   _wait_for_tstate_lock   r<   z"_DummyThread._wait_for_tstate_lockc                 C   s
   t djS )Nweakref)
__import__r7   r:   r   r   r   __weakref_ref   s   
z_DummyThread.__weakref_ref)r      r   )r   rC      )r      r   c                 C   s   t | S r   )typer:   r   r   r   	__class__  s   z_DummyThread.__class__c                 C   s"   |t urtjd | | d S d S )NrG   )_MainThread_object__dict____set__)r6   	new_classr   r   r   rG     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_lockr+   r-   sysversion_infor/   r8   r;   _stopr?   r   r4   _NEEDS_CLASS_FORK_FIXUPpropertyrG   setterr   r   r   r   r   k   s<    #&
$A
r   c                   C   s   t  S r   )r   main_threadr   r   r   r   main_native_thread*  s   rj   c                       s$   e Zd Z fddZdd Z  ZS )Threadc                    s$   t t|   t }|| j d S r   )superrk   _set_tstate_lockr   r&   _Thread__greenlet_finished)r6   greenletrG   r   r   rm   ;  s   zThread._set_tstate_lockc                 C   s    | j r| j   |   d S d S r   )rb   releasere   )r6   r#   r   r   r   __greenlet_finished@  s   
zThread.__greenlet_finished)rM   rN   rO   rm   rn   __classcell__r   r   rp   r   rk   8  s    rk   c                   @   s   e Zd ZdS )TimerN)rM   rN   rO   r   r   r   r   rt   G  s    rt   _set_sentinelr	   r   r
   _CRLockc                   @   s$   e Zd ZdZdZdd Zdd ZdS )
_ForkHooksNc                 C   s   t tj| _t | _d S r   )dictr   r   _before_fork_activecurrent_thread_before_fork_current_threadr:   r   r   r   before_fork_in_parentm  s   z _ForkHooks.before_fork_in_parentc              	   C   s   t j}t|dksJ t }| j D ]6\}}||krIztr dnd}t||}W n tyB   t	j
d d dk s:J | r@J Y qw |jdd qt  }t |_|t jt  < |t _t  }|jt  ksiJ d S )N   r-   r/   r   r   F)	enter_hub)r   r   lenr   ry   itemsr+   r3   r2   rc   rd   is_alive	_set_done_MainThreadr,   _main_threadri   ident)r6   activecurrent_identgreen_identthreadhhandlemainr   r   r   after_fork_in_childq  s(   z_ForkHooks.after_fork_in_child)rM   rN   rO   r{   ry   r|   r   r   r   r   r   rw   g  s
    rw   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)rj   r   rz   r	   r   r   r,   _Thread__identr3   os_fork_hooksr|   r   )native_moduler   warnri   main_idr   r   r   r   _gevent_will_monkey_patch  s    
r   )2__doc__r   rc   rd   r.   __implements____extensions__	threadingr   r   _DummyThread_r   rH   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+   rj   rk   appendrt   ru   removehasattrrv   rw   r   r   r   r   r   r   <module>   sz     @








9