o
    0׾g/7                     @   sv  d Z ddlmZ g dZddlZejZejZ	ddl
Z
ddl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dd Zdd ZdZ G dd deZdd 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$d e'd e$d eZe'd e(edrdZ)e$d dd  Z*d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.
    )absolute_import)local_start_new_thread_allocate_lockLock
_get_ident_sleep_DummyThreadN)r   )start_new_thread)allocate_lock)	get_ident)sleep
getcurrent)RLock)LazyOnClassc                 C   s   t jt| d  d S N)__threading___activepopr   )g r   Z/var/www/html/backend_erp/backend_erp_env/lib/python3.10/site-packages/gevent/threading.py_cleanupI   s   r   c                    s    fdd}|S )Nc                    s   t j d  d S r   )r   r   r   )_rgidr   r   _M   s   z_make_cleanup_id.<locals>._r   )r   r   r   r   r   _make_cleanup_idL   s   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dZdd Zdd ZeZd	d
 Zedd Zej dd dkrVej dd dkp^ej dd dkZ!e!rpe"dd Z#e#j$dd Z#dS dS )r	   FTr   Nc                 C   s~   t d | _| _|   t }t|}| t j|< t|dd }|d ur)|t	 d S | j
}||t|}|| _| j|u s=J d S )NzDummy-%drawlink)r   _newname_name_Thread__name
_set_identr   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   r&   r   r   r   _Thread__stop      z_DummyThread._Thread__stopc                 O   r)   r   r   )r&   argskwargsr   r   r   _wait_for_tstate_lock   r,   z"_DummyThread._wait_for_tstate_lockc                 C   s
   t djS )Nweakref)
__import__r'   r*   r   r   r   __weakref_ref   s   
z_DummyThread.__weakref_ref   )      r4   )r4   r5      )r4      r3   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 )Nr9   )_MainThread_object__dict____set__)r&   	new_classr   r   r   r9      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_ident_identr   Event_Thread__started_startedset_tstate_lock_handler(   r+   _stopr/   r   r$   sysversion_info_NEEDS_CLASS_FORK_FIXUPpropertyr9   setterr   r   r   r   r	   T   s6    #
$A
r	   c                  C   sH   t j} t| dksJ t  }|t jt  < |t _|jt  ks"J d S )N   )r   r   len_MainThreadr   _main_threadident)activemainr   r   r   _after_fork_in_child  s   rd   c                   C   s   t  S r   )r   main_threadr   r   r   r   main_native_thread  s   rf   c                       s$   e Zd Z fddZdd Z  ZS )Threadc                    s$   t t|   t }|| j d S r   )superrg   _set_tstate_lockr   r   _Thread__greenlet_finished)r&   greenletr9   r   r   ri      s   zThread._set_tstate_lockc                 C   s    | j r| j   |   d S d S r   )rU   releaserW   )r&   r   r   r   r   __greenlet_finished%  s   
zThread.__greenlet_finished)r?   r@   rA   ri   rj   __classcell__r   r   rl   r   rg     s    rg   c                   @   s   e Zd ZdS )TimerN)r?   r@   rA   r   r   r   r   rp   ,  s    rp   _set_sentinelr   r   r   _CRLockc                 C   sz   t  }t |kr|d d S t tjvr)|j}tj|= t  |_|_|tjt < tj	r9t
tdr;tjtd d S 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)after_in_child)rf   r   current_threadr   r   ra   rP   _Thread__identr	   rZ   hasattrosrs   rd   )native_moduleitemswarnre   main_idr   r   r   _gevent_will_monkey_patchH  s   r}   )+__doc__
__future__r   __implements__	threadingr   r	   _DummyThread_r_   r:   rx   rX   gevent.localr   gevent.threadr
   r   r   r   r   r   
gevent.hubr   r   r   gevent.lockr   gevent._utilr   r   r   r   _weakrefrd   rf   rg   appendrp   rq   removerw   rr   r}   r   r   r   r   <module>   sX     .








