
    ¦iI                     <   d Z ddlmZmZmZ ddlZddlZddlZddl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 dd
lmZ ddlmZ e
j        sJ  G d de          Zd Z G d de          Zedk    r ed                                           dS dS )z)
Testing scenarios that may have leaked.
    )print_functionabsolute_importdivisionN   )TestCase)PY314)RUNNING_ON_FREETHREAD_BUILD)WIN)fails_leakcheck)ignores_leakcheck)RUNNING_ON_MANYLINUXc                   J    e Zd Z e            Zd Zd Zd Zed             Z	dS )HasFinalizerTracksInstancesc                     t          j        |          | _        | j                            t          |                      d S N)sysinternmsgEXTANT_INSTANCESaddid)selfr   s     V/root/projects/butler/venv/lib64/python3.11/site-packages/greenlet/tests/test_leaks.py__init__z$HasFinalizerTracksInstances.__init__   s4    :c??!!"T((+++++    c                 T    | j                             t          |                      d S r   )r   remover   r   s    r   __del__z#HasFinalizerTracksInstances.__del__"   s%    $$RXX.....r   c                 4    dt          |           | j        fz  S )Nz(<HasFinalizerTracksInstances at 0x%x %r>)r   r   r   s    r   __repr__z$HasFinalizerTracksInstances.__repr__$   s!    9tHHdh=
 
 	
r   c                 8    | j                                          d S r   )r   clear)clss    r   resetz!HasFinalizerTracksInstances.reset(   s    ""$$$$$r   N)
__name__
__module____qualname__setr   r   r   r!   classmethodr%    r   r   r   r      sh        suu, , ,/ / /
 
 
 % % [% % %r   r   c                 2    t           r| S t          |           S r   )r	   r   )funcs    r   &fails_leakcheck_except_on_free_thradedr.   -   s    "  4   r   c                       e Zd Zd Zd Zed             Zd Zd Zd Z		 	 dd	Z
d
 Zd Zed             Zed             Zed             ZdZd Zed             ZddZed             Zed             ZdS )	TestLeaksc                     d}t          j        |          }t          j        d           }t          d          D ]} |j        |  |                     t          j        |          |           d S )N)abcc                  B     t          j                    j        j        |  S r   greenlet
getcurrentparentswitch)argss    r   <lambda>z)TestLeaks.test_arg_refs.<locals>.<lambda><   s    =(-//6=tD r   d   )r   getrefcountr7   ranger:   assertEqual)r   r;   refcount_beforeg_s        r   test_arg_refszTestLeaks.test_arg_refs7   sz    /$//DDF Fs 	 	AAHdOOO..@@@@@r   c                 6   i }|                      t          j        |          t          sdnd           t	          j        d           }t          d          D ]} |j        di | |                      t          j        |          t          sdnd           d S )N   r   c                  H     t          j                    j        j        di | S )Nr+   r6   )gkwargss    r   r<   z+TestLeaks.test_kwarg_refs.<locals>.<lambda>F   s&    Ah133:ALLGLL r   r=   r+   )r@   r   r>   r   r7   r?   r:   )r   kwargsrB   rC   s       r   test_kwarg_refszTestLeaks.test_kwarg_refsA   s    0052G!!aHHHLLN Ns 	 	AAHv 	0052G!!aHHHHHr   c                      d } t          j        |           }|                                 t          j        d           |                    d           d S )Nc                  .    t          j        d           d S )NMbP?)timesleepr+   r   r   workerz+TestLeaks.__recycle_threads.<locals>.workerV   s    Jur   targetrM   
   )	threadingThreadstartrN   rO   join)rP   ts     r   __recycle_threadszTestLeaks.__recycle_threadsN   sT    	 	 	F+++				
5	r




r   c                    g fd}t          d          D ]A}t          j        |          }|                                 |                    d           ~Bt          j                     |                                  t          j                     t          j	                     t          j                     D ]}| 
                     |                        d S )Nc                  x                          t          j        t          j                                         d S r   )appendweakrefrefr7   r8   )ggs   r   rP   z,TestLeaks.test_threaded_leak.<locals>.worker_   s.    IIgk("5"7"78899999r   rF   rQ   rS   r?   rT   rU   rV   rW   r7   r8   _TestLeaks__recycle_threadsgccollectassertIsNoner   rP   rC   rX   rB   r_   s        @r   test_threaded_leakzTestLeaks.test_threaded_leak]   s    	: 	: 	: 	: 	: q 	 	A ///AGGIIIFF2JJJ   

 	# 	#Aaacc""""	# 	#r   c                    g fd}t          d          D ]A}t          j        |          }|                                 |                    d           ~Bt          j                     |                                  t          j                     t          j	                     t          j                     D ]}| 
                     |                        d S )Nc                  (   g xt          j                    _        fd} t          d          D ](}t          j         |                                            )                    t          j        t          j                                         d S )Nc                  T                          t          j                               d S r   )r\   r7   r8   )lls   r   
additionalzDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionalt   s$    		(-//00000r   rF   )r7   r8   rj   r?   r:   r\   r]   r^   )rk   rC   rj   r_   s     @r   rP   z0TestLeaks.test_threaded_adv_leak.<locals>.workerq   s    ,..B$&&)1 1 1 1 11XX 7 7!*--446666IIgk("5"7"78899999r   rF   rQ   rS   r`   re   s        @r   test_threaded_adv_leakz TestLeaks.test_threaded_adv_leako   s    	: 	: 	: 	: 	: q 	 	A ///AGGIIIFF2JJJ   

 	# 	#Aaacc""""	# 	#r   c                 ^   t           j                                        }|                     |d           t           j                            d           t           j                                        }|                     ||           |                     t           j        j        d           d S )Nr   Tr   )r7   	_greenlet&get_clocks_used_doing_optional_cleanupassertGreaterEqualenable_optional_cleanupr@   assertGreaterCLOCKS_PER_SEC)r   usedused2s      r   assertClocksUsedzTestLeaks.assertClocksUsed   s    !HHJJa(((224888"IIKKu%%%8-<a@@@@@r   TFc                   	
 t          j        g           sJ t                                           t	          j                     |                     t          j        d          }t          j                    
t          j                    	g fdg 	
fd}t          j	        |          }|
                                 
                    d           t	          j                     |                     t          d          }t                    dk    sJ |                     d	         j                   d d = 	                                 |                    d           ~|                                  |                     t          d          }|                     t          j        d          }|                     ||           sct          j                                        E|                     ||           r,|                     t          j        t!                                 n	 t          j                                        |                                  d S d S )
NF)
exact_kindc                  2   t          d          } t          j                            dt          d                     r+t          j                    j        j        } || g           d S t          j                    j                            | g           d S )NzDELETING STACK OBJECTtest_leaks_keyzDELETING THREAD STATE)r   r7   rn   set_thread_localr8   r9   r:   )jdsexplicit_reference_to_switchs     r   background_greenletz6TestLeaks._check_issue251.<locals>.background_greenlet   s    ,-DEEB// +,CDDF F F
 , :'))072$#%%,33RD99999r   c                  \   t          j                   }                     t          j        | j                                                 |            |                                  ~                                                      d           rt          j                     d S d S )NrS   )	r7   r\   r]   r^   r9   r:   r)   waitr8   )gletbackground_glet_killedbackground_glet_runningr   background_greenletsbg_main_wrefsmanually_collect_backgrounds    r   background_threadz4TestLeaks._check_issue251.<locals>.background_thread   s    $%899D  T[!9!9::: ''---KKMMM#'')))"''+++
 + &#%%%%%& &r   rQ   rS   Tr   r   )rb   
is_trackedr   r%   r7   r8   count_objectsrT   EventrU   rV   r   listlenassertFalsedeadr)   rW   wait_for_pending_cleanupsassertLessEqualrn   ro   r@   r   rv   )r   r   r~   greenlets_beforer   rX   lists_beforelists_aftergreenlets_afterr   r   r   r   r   s    ``      @@@@@r   _check_issue251zTestLeaks._check_issue251   s    }R     #))+++--h.?E-RR"+/"3"3!*!2!2!	: 	: 	: 	: 	: 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&$ $5666				$$R((())$4)@@'((A-----a05666 !#""$$$ 	
r


 	&&((((($(??,,X->5,QQ
 	[,777 , 	!HHJJV_.>???* V   !<!MsuuUUU DDFFR!!##### SRr   c                 .    |                                   d S r   r   r   s    r   -test_issue251_killing_cross_thread_leaks_listz7TestLeaks.test_issue251_killing_cross_thread_leaks_list  s    r   c                     t           j                            d           	 |                                  t           j                            d           d S # t           j                            d           w xY w)NFT)r7   rn   rq   r   r   s    r   #test_issue251_with_cleanup_disabledz-TestLeaks.test_issue251_with_cleanup_disabled  sj    225999	=  """66t<<<<<H66t<<<<s   A !A7c                 2    |                      d           d S )NFr   r   r   s    r   4test_issue251_issue252_need_to_collect_in_backgroundz>TestLeaks.test_issue251_issue252_need_to_collect_in_background  s!    & 	?????r   c                    d| _         t          j                            d           	 |                     d           t          j                            d           d S # t          j                            d           w xY w)NTFr   )expect_greenlet_leakr7   rn   rq   r   r   s    r   Etest_issue251_issue252_need_to_collect_in_background_cleanup_disabledzOTestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabled,  sw    $(!225999	=  U CCC66t<<<<<H66t<<<<s   A !B c                 4    |                      dd           d S )NFT)r   r~   r   r   s    r   9test_issue251_issue252_explicit_reference_not_collectablezCTestLeaks.test_issue251_issue252_explicit_reference_not_collectable5  s/    (-)- 	 	/ 	/ 	/ 	/ 	/r   r=   c                     t           j        d         dk    sJ t           j        d d         dk     r|                     d           t          r|                     d           d S d S )Nr      rF   )r      zOnly observed on 3.11z!Slow and not worth repeating here)r   version_infoskipTestr   r   s    r   _only_test_some_versionsz"TestLeaks._only_test_some_versions=  sr     "a''''BQB&((MM1222 	?MM=>>>>>	? 	?r   c                    |                                   d dfd}t          d          D ]} |             |                                 }t          | j                  D ]P}t	          ||                                           } |             |                                 }||k    r|dk    r nQ|                     ||           d S )Nc                      dS )Nr   r+   r+   r   r   fz:TestLeaks.test_untracked_memory_doesnt_increase.<locals>.fQ  s    1r   '  c                  x    t                    D ](} t          j                                                   )d S r   )r?   r7   r:   )rC   ITERr   s    r   run_itz?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itU  sB    4[[ . .!!$$++----. .r   r   r   )r   r?   get_process_ussUNTRACK_ATTEMPTSmaxr   )r   r   rC   
uss_beforecount	uss_afterr   r   s         @@r   %test_untracked_memory_doesnt_increasez/TestLeaks.test_untracked_memory_doesnt_increaseJ  s	    	%%'''	 	 	 	. 	. 	. 	. 	. 	.
 q 	 	AFHHHH
 ))++
4011 	 	EZ)=)=)?)?@@JFHHH,,..IJ&&5199Y
33333r   c                   	
 |                                   |                                  dgfd
d		
fd|  G fdd          }d x}}t          | j                  D ].}dd<    |            }t	          j        |          }|                                 |                    d           |                     |	                                           ||j
        }t          ||j
                  }r?|                     |j        d	           |                     d         	|j        z             ~~s|                     d         d           r|                                  |                                 }||k    r|d
k    r n0|                                  |                                 }|                     ||d|fz             d S )Nr   c                      	 t          j                    j                                         n$# t           j        $ r  dxx         dz  cc<    w xY wdS )Nr   r   )r7   r8   r9   r:   GreenletExit)
EXIT_COUNTs   r   r   z3TestLeaks._check_untracked_memory_thread.<locals>.fx  sg    #%%,335555(   1" 1s	   *. !Ar   c                      g } t                    D ]?}t          j                  }|                     |           |                                 @| S r   )r?   r7   r\   r:   )gletsrC   rB   r   r   s      r   r   z8TestLeaks._check_untracked_memory_thread.<locals>.run_it  sR    E4[[   %a((Q



Lr   c                   .    e Zd ZdxZZdZdZ fdZdS )<TestLeaks._check_untracked_memory_thread.<locals>.ThreadFuncr   r+   rF   c                 P                                    | _        t          | j                  D ]'}| xj        t                                 z  c_        (| j        D ]%}                    dt          |                     &rd| _                                         | _        d S )Nzsuspended activer+   )	r   r   r?   r   r   tupleassertInstrr   )r   rC   rB   deallocate_in_threadr   tests      r   __call__zETestLeaks._check_untracked_memory_thread.<locals>.ThreadFunc.__call__  s    "&"6"6"8"8ty)) 2 2AJJ%//1JJJ > >AMM"4c!ff====' $!#DJ!%!5!5!7!7r   N)r&   r'   r(   r   r   r   r   r   )r   r   r   s   r   
ThreadFuncr     sL        %&&JED8 8 8 8 8 8 8 8 8r   r   rQ      r+   r   zafter attempts %d)r   r   r?   r   rT   rU   rV   rW   r   is_aliver   r   r@   r   r   r   r   )r   r   r   r   r   r   thread_funcrX   r   r   r   r   r   s    `      @@@@@r   _check_untracked_memory_threadz(TestLeaks._check_untracked_memory_threadl  sT   %%''' 	S
	 	 	 	 	 
	 
	 
	 
	 
	 
	 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8$ "&%
Y4011 	 	EJqM$*,,K 444AGGIIIFF2JJJQZZ\\***!(3
Z)?@@J# I  !2B777  A{7G0GHHH' 3  A222# 1..000,,..IJ&&5199&&(((((**	Y
4G5(4RSSSSSr   c                 2    |                      d           d S )NTr   )r   r   s    r   Itest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_threadzSTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread  s!     	+++FFFFFr   c                     t           r#t          rt          r|                     d           |                     d           d S )Nz6Windows 3.14t appears to leak. No other platform does.Fr   )r
   r	   r   r   r   r   s    r   Gtest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainzQTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main  sN      	T. 	T5 	TMMRSSS+++GGGGGr   N)TF)T)r&   r'   r(   rD   rJ   staticmethodra   rf   rl   rv   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   r+   r   r   r0   r0   5   s       A A A
I 
I 
I   \# # #$# # #.A A A 595:|$ |$ |$ |$|  = = = ,@ @ ,+@( ,= = ,+= ,/ / ,+/
 ? ? ? 4 4 4>TT TT TT TTl G G G H H H H Hr   r0   __main__unittest)__doc__
__future__r   r   r   r   rb   rN   r]   rT   r7    r   r   r	   r
   	leakcheckr   r   r   GREENLET_USE_GCobjectr   r.   r0   r&   
__import__mainr+   r   r   <module>r      s    A @ @ @ @ @ @ @ @ @ 



 				                    ) ) ) ) ) )       & & & & & & ( ( ( ( ( ( + + + + + +
    % % % % %& % % % ! ! !bH bH bH bH bH bH bH bHH zJz!!!!! r   