
    i3                     n    d 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	 d	 Z
 G d
 d          ZdS )z^
The implementation of thread patching for Python versions
prior to 3.13.

Internal use only.
    N)LoopExit   )is_object_patched)_notify_patch)_patch_module)_queue_warningc                    t          t          |                                                     dk    rd S |                                 | _        	 |                                 }n$# t          $ r |                                 }Y nw xY wt          | 	                                          }	 dd l
}|j        j        }n## t          $ r  G d dt                    }Y nw xY wt          d          }|                                D ]}t#          ||          rVdD ]5}t%          ||          r#t'          ||          t)          |||            n6t+          dt-          |                    ht#          ||          r|j        ||_        d S )Nr   r   c                       e Zd ZdS )*_patch_existing_locks.<locals>._ModuleLockN)__name__
__module____qualname__     M/usr/local/lib/python3.11/dist-packages/gevent/monkey/_patch_thread_common.py_ModuleLockr   '   s        Dr   r   gc)_owner_RLock__ownerzEUnsupported Python implementation; Found unknown lock implementation.)lenlist	enumerate_allocate_lock_active_limbo_lock	get_identAttributeError
_get_identtypeRLockimportlib._bootstrap
_bootstrapr   ImportErrorobject
__import__get_objects
isinstancehasattrgetattrsetattrAssertionErrorvarsowner)	threadingtid
rlock_type	importlibr   r   o
owner_names           r   _patch_existing_locksr3      s   
4	##%%&&''1,, $-#;#;#=#=I %!!## % % %""$$%ioo''((J7####
  *6	    	 	 	 	 	& 	 	 	 	 	$ 
D		B^^  a$$ 	  
 1j)) q*--9:s333E
 %9GG    ;'' 	w"% s$   A$ $BB*B; ;CCc                       e Zd ZdZdZdZdZdZdZdZ		 	 	 ddZ
d Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zed             ZdS )BasePatcherNTc                 Z    || _         || _        || _        || _        || _        || _        d S N)r-   threading_localEventloggingexisting_lockswarnings)selfr-   _threading_localr9   r:   r;   	_warningss          r   __init__zBasePatcher.__init__m   s4     #/
,!r   c                 F   t          d          | _        | j                                        | _        | j                                        | _        | j        j        | _        t          d| j        d          \  }}| j	        r| 
                                 | j        r|                                  | j	        r|                                  t          dd          }| j        | j                                        k    r+|s)|                                  |                                  n|s|                                  ddlm} t)          |                    d||                     | j        0t)          |                    d| j        | j                             d S d S )Nr-   threadFr?   _notify_did_subscribers	_shutdownr   )events)r$   threading_modcurrent_threadorig_current_threadmain_threadrE   orig_shutdownr   r<   r-   ,patch_threading_event_logging_existing_locksr8   patch__threading_localpatch_active_threadsr   ;patch_threading_shutdown_on_main_thread_not_already_patchedpatch_main_thread_cleanup!patch_shutdown_not_on_main_threadgeventrF   r   GeventDidPatchModuleEventgevent_threading_mod)r=   gevent_thread_mod
thread_modalready_patchedrF   s        r   __call__zBasePatcher.__call__y   s    (44 $(#5#D#D#F#F -99;;!/9(5h@DNS)U )U )U%:
 > 	@==??? 	*'')))> 	(%%''' ,KEE#t'9'E'E'G'GGGP_GLLNNN**,,,,  	522444!!!!!!f66x7H7AC C 	D 	D 	D $0&::;;?;T;?;MO O P P P P P 10r   c                     t          d| j        d          \  | _        }|| j        u sJ | j        r|                                  | j        rt          | j                   | j        r$dt          j
        v r|                                  d S d S d S )Nr-   FrC   r:   )r   r<   rT   rG   r9   patch_eventr;   r3   r:   sysmodulespatch_logging)r=   patched_mods     r   rL   z8BasePatcher.patch_threading_event_logging_existing_locks   s    1>m$)2+ 2+ 2+.!;
 d00000: 	 	6!$"4555< 	!I44     	! 	!44r   c                     ddl m} ddlm}  || j        d|           t          | j        d          r || j        d|           d S d S )Nr   )r9   r   
patch_itemr9   _Event)gevent.eventr9   apira   rG   r'   )r=   r9   ra   s      r   rZ   zBasePatcher.patch_event   s{    &&&&&&######
4%w666 4%x00 	<Jt)8U;;;;;	< 	<r   c                 H   ddl m} t          d          } ||d| j                                                   |j        D ]`}t          |          r
 |            n|}| t          |d          st          d|z            | j                                        |_	        ad S )Nr   r`   r:   _locklockzUnknown/unsupported handler %r)
rd   ra   r$   rG   r   _handlerListcallabler'   	TypeErrorrg   )r=   ra   r:   wrhandlers        r   r]   zBasePatcher.patch_logging   s    ######Y''
7GT%7%=%=%?%?@@@& 	6 	6B&rll2bbdddG7F++ L @7 JKKK-3355GLL	6 	6r   c                 V    t          d          }ddlm} ddlm}  ||d|           d S )Nr>   r   )localr   r`   rn   )r$   gevent.localrn   rd   ra   )r=   r>   rn   ra   s       r   rM   z"BasePatcher.patch__threading_local   sP    %&899&&&&&&######
#We44444r   c                     t           r7   NotImplementedErrorr=   s    r   rN   z BasePatcher.patch_active_threads       !!r   c                     t           r7   rq   rs   s    r   rO   zGBasePatcher.patch_threading_shutdown_on_main_thread_not_already_patched   rt   r   c                 4   | j         }| j        j                            |           |j        }| j                                        |_        || j        j        v r$| j        j        |         | j        j        |j        <   ||j        k    r| j        j        |= d S d S r7   )rJ   rG   	_danglingremoveidentr   _ident_active)r=   rJ   oldids      r   rP   z%BasePatcher.patch_main_thread_cleanup   s    
 &$++K888
 !!/99;;D&...<@<N<VW\<]D&{'89K%%%"*5111 &%r   c                     t          d| j                   ddlm | j        | j        | j        j        | j        fd} d|           d S )Nz`Monkey-patching not on the main thread; threading.main_thread().join() will hang from a greenletr   r`   c                  x                  _         	               n# t          $ r Y nw xY w d           d S )NrE   )rz   r   )r   rJ   rK   ra   rG   s   r   rE   z@BasePatcher.patch_shutdown_not_on_main_thread.<locals>._shutdown  s_     "+K   J}k=AAAAAs   
 
**rE   )r   r<   rd   ra   rJ   rG   r   rK   )r=   rE   r   rJ   rK   ra   rG   s     @@@@@r   rQ   z-BasePatcher.patch_shutdown_not_on_main_thread   s     R}	& 	& 	& 	$#####&*&0	*	B 	B 	B 	B 	B 	B 	B 	B 	B" 	
=+y99999r   c                 <     ddl m  ddlm d fd	}|S )Nr   )time)sleepc                 D   d }                                 u rt          d          	j        rd S                                 sd S | r             | z   }                                r3|             |k    rd S  d                                           1d S d S )NzCannot join current threadg{Gz?)rH   RuntimeErrordeadis_alive)timeoutendr   rB   thread_greenletrG   r   s     r   joinzBBasePatcher._make_existing_non_main_thread_join_func.<locals>.join   s    C++--77"#?@@@*/C*" ??$$  'dffw&//## ?ttvv||Fd //##     r   r7   )r   
gevent.hubr   )rB   r   rG   r   r   r   s   ``` @@r   (_make_existing_non_main_thread_join_funcz4BasePatcher._make_existing_non_main_thread_join_func  se    $$$$$$	 	 	 	 	 	 	 	 	 	@ r   )TTTTTN)r   r   r   rT   rU   rV   rG   rI   rJ   rK   r@   rX   rL   rZ   r]   rM   rN   rO   rP   rQ   staticmethodr   r   r   r   r5   r5   O   s        *  JMKMRV $" " " "6P 6P 6Pp! ! !$	< 	< 	<6 6 65 5 5" " "" " "2 2 2$: : :< ' ' \' ' 'r   r5   )__doc__r[   gevent.exceptionsr   _stater   _utilr   r   r   r3   r5   r   r   r   <module>r      s     


 & & & & & & % % % % % %                         ! ! ! ! ! !9 9 9zq q q q q q q q q qr   