a
    ҏi9D                     @   s   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 e
jsJ G d	d
 d
eZG dd deZedkred  dS )z)
Testing scenarios that may have leaked.
    )print_functionabsolute_importdivisionN   )TestCase)fails_leakcheck)ignores_leakcheck)RUNNING_ON_MANYLINUXc                   @   s6   e Zd Ze Zdd Zdd Zdd Zedd Z	d	S )
HasFinalizerTracksInstancesc                 C   s    t || _| jt|  d S N)sysinternmsgEXTANT_INSTANCESaddid)selfr    r   I/home/Claro/venv/lib/python3.9/site-packages/greenlet/tests/test_leaks.py__init__   s    z$HasFinalizerTracksInstances.__init__c                 C   s   | j t|  d S r   )r   remover   r   r   r   r   __del__   s    z#HasFinalizerTracksInstances.__del__c                 C   s   dt | | jf S )Nz(<HasFinalizerTracksInstances at 0x%x %r>)r   r   r   r   r   r   __repr__    s    
z$HasFinalizerTracksInstances.__repr__c                 C   s   | j   d S r   )r   clear)clsr   r   r   reset$   s    z!HasFinalizerTracksInstances.resetN)
__name__
__module____qualname__setr   r   r   r   classmethodr   r   r   r   r   r
      s   r
   c                   @   s   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	d'ddZ
dd Zdd Zedd Zedd Zedd ZdZdd Zedd Zd(d d!Zed"d# Zed$d% Zd&S ))	TestLeaksc                 C   sJ   d}t |}tdd }tdD ]}|j|  q$| t || d S )N)abcc                  W   s   t  jj|  S r   greenlet
getcurrentparentswitch)argsr   r   r   <lambda>0       z)TestLeaks.test_arg_refs.<locals>.<lambda>d   )r   getrefcountr'   ranger*   assertEqual)r   r+   Zrefcount_beforeg_r   r   r   test_arg_refs+   s    
zTestLeaks.test_arg_refsc                 C   sF   i }t  dd }tdD ]}|jf i | q| t|d d S )Nc                  [   s   t  jjf i | S r   r&   )kwargsr   r   r   r,   9   r-   z+TestLeaks.test_kwarg_refs.<locals>.<lambda>r.      )r'   r0   r*   r1   r   r/   )r   r5   r2   r3   r   r   r   test_kwarg_refs5   s    zTestLeaks.test_kwarg_refsc                  C   s4   dd } t j| d}|  td |d d S )Nc                   S   s   t d d S )NMbP?)timesleepr   r   r   r   workerG   s    z+TestLeaks.__recycle_threads.<locals>.workertargetr8   
   )	threadingThreadstartr9   r:   join)r;   tr   r   r   Z__recycle_threads?   s
    
zTestLeaks.__recycle_threadsc                    s   g   fdd}t dD ]$}tj|d}|  |d ~qt  |   t  t	  t   D ]}| 
|  qjd S )Nc                      s     tt  d S r   )appendweakrefrefr'   r(   r   Zggr   r   r;   P   s    z,TestLeaks.test_threaded_leak.<locals>.workerr6   r<   r>   r0   r?   r@   rA   rB   r'   r(   _TestLeaks__recycle_threadsgcZcollectZassertIsNoner   r;   r3   rC   r2   r   rG   r   test_threaded_leakN   s    
zTestLeaks.test_threaded_leakc                    s   g   fdd}t dD ]$}tj|d}|  |d ~qt  |   t  t	  t   D ]}| 
|  qjd S )Nc                     sN   g   t  _ fdd} tdD ]}t  |   q"tt   d S )Nc                      s     t  d S r   )rD   r'   r(   r   llr   r   
additionale   s    zDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionalr6   )r'   r(   rN   r0   r*   rD   rE   rF   )rO   r3   rG   rM   r   r;   b   s
    z0TestLeaks.test_threaded_adv_leak.<locals>.workerr6   r<   r>   rH   rK   r   rG   r   test_threaded_adv_leak`   s    
z TestLeaks.test_threaded_adv_leakc                 C   sL   t j }| |d t jd t j }| || | t jjd d S )Nr   Tr   )r'   	_greenlet&get_clocks_used_doing_optional_cleanupZassertGreaterEqualenable_optional_cleanupr1   ZassertGreaterZCLOCKS_PER_SEC)r   usedZused2r   r   r   assertClocksUsedw   s    

zTestLeaks.assertClocksUsedTFc           	         sb  t g sJ t  t  | jtjdd}t t  g fddg  fdd}tj	|d}|
  d t  | jtd	d}td
ksJ | d j d d =    |d ~|   | jtd	d}| jtjdd}| || sFtj d urF| || rF| tjt  n tj d ur^|   d S )NF)Z
exact_kindc                     sL   t d} tjdt d  r6t jj}|| g nt j| g d S )NzDELETING STACK OBJECTZtest_leaks_keyzDELETING THREAD STATE)r
   r'   rQ   Zset_thread_localr(   r)   r*   )Zjds)explicit_reference_to_switchr   r   background_greenlet   s    z6TestLeaks._check_issue251.<locals>.background_greenletc                     sR   t  } t| j |  |   ~    d rNt   d S )Nr>   )	r'   rD   rE   rF   r)   r*   r    waitr(   )Zglet)background_glet_killedbackground_glet_runningrX   background_greenletsbg_main_wrefsmanually_collect_backgroundr   r   background_thread   s    


z4TestLeaks._check_issue251.<locals>.background_threadr<   r>   Tr   r   )rJ   Z
is_trackedr
   r   r'   r(   Zcount_objectsr?   Eventr@   rA   rY   listlenassertFalseZdeadr    rB   wait_for_pending_cleanupsassertLessEqualrQ   rR   r1   r   rU   )	r   r^   rW   Zgreenlets_beforer_   rC   Zlists_beforeZlists_afterZgreenlets_afterr   )rZ   r[   rX   r\   r]   rW   r^   r   _check_issue251   sB    


zTestLeaks._check_issue251c                 C   s   |    d S r   rf   r   r   r   r   -test_issue251_killing_cross_thread_leaks_list   s    z7TestLeaks.test_issue251_killing_cross_thread_leaks_listc              	   C   s8   t jd z|   W t jd nt jd 0 d S )NFT)r'   rQ   rS   rf   r   r   r   r   #test_issue251_with_cleanup_disabled  s    
z-TestLeaks.test_issue251_with_cleanup_disabledc                 C   s   | j dd d S )NFr^   rg   r   r   r   r   4test_issue251_issue252_need_to_collect_in_background  s    z>TestLeaks.test_issue251_issue252_need_to_collect_in_backgroundc              	   C   sB   d| _ tjd z| jdd W tjd ntjd 0 d S )NTFrj   )Zexpect_greenlet_leakr'   rQ   rS   rf   r   r   r   r   Etest_issue251_issue252_need_to_collect_in_background_cleanup_disabled  s
    zOTestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabledc                 C   s   | j ddd d S )NFT)r^   rW   rg   r   r   r   r   9test_issue251_issue252_explicit_reference_not_collectable&  s    zCTestLeaks.test_issue251_issue252_explicit_reference_not_collectabler.   c                 C   s@   t jd dksJ t jd d dk r.| d tr<| d d S )Nr      r6   )rn      zOnly observed on 3.11z!Slow and not worth repeating here)r   version_infoZskipTestr	   r   r   r   r   _only_test_some_versions.  s
    
z"TestLeaks._only_test_some_versionsc                    s   |    dd d  fdd}tdD ]
}|  q*|  }t| jD ]4}t||  }|  |  }||krH|dkrH q~qH| || d S )Nc                   S   s   dS )Nr   r   r   r   r   r   fB  s    z:TestLeaks.test_untracked_memory_doesnt_increase.<locals>.f'  c                     s    t  D ]} t  qd S r   )r0   r'   r*   )r3   ITERrr   r   r   run_itF  s    z?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itrn   r   )rq   r0   get_process_ussUNTRACK_ATTEMPTSmaxre   )r   rv   r3   
uss_beforecount	uss_afterr   rt   r   %test_untracked_memory_doesnt_increase;  s    z/TestLeaks.test_untracked_memory_doesnt_increasec                    sD  |    dg  fdddfdd| G fddd}d  }}t| jD ]}d d< | }tj|d	}|  |d
 | |  |d u r|j	}t
||j	}r| |jd |  d |j  ~~s|  d d r|   |  }||krX|dkrX qqX|   |  }| ||d|f  d S )Nr   c                      s>   zt  j  W n& t jy8    d  d7  <  Y n0 dS )Nr   r   )r'   r(   r)   r*   ZGreenletExitr   )
EXIT_COUNTr   r   rr   d  s    z3TestLeaks._check_untracked_memory_thread.<locals>.frs   c                     s2   g } t  D ] }t}| | |  q| S r   )r0   r'   rD   r*   )gletsr3   r2   rt   r   r   rv   m  s    


z8TestLeaks._check_untracked_memory_thread.<locals>.run_itc                       s,   e Zd Zd ZZdZdZ fddZdS )z<TestLeaks._check_untracked_memory_thread.<locals>.ThreadFuncr   r   r6   c                    sb     | _t| jD ]}|  jt 7  _q| jD ]}dt| q4 rTd| _  | _d S )Nzsuspended activer   )	rw   rz   r0   ru   r   tupleZassertInstrr|   )r   r3   r2   deallocate_in_threadrv   testr   r   __call__  s    

zETestLeaks._check_untracked_memory_thread.<locals>.ThreadFunc.__call__N)r   r   r   rz   r|   r   ru   r   r   r   r   r   
ThreadFunc{  s   r   r<      r   r   zafter attempts %d)rq   r0   rx   r?   r@   rA   rB   rc   is_aliverz   ry   r1   r   ru   rd   rw   re   )r   r   r   rz   r|   r{   Zthread_funcrC   r   )r~   ru   r   rr   rv   r   r   _check_untracked_memory_thread]  sB    
z(TestLeaks._check_untracked_memory_threadc                 C   s   | j dd d S )NTr   r   r   r   r   r   Itest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread  s    zSTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_threadc                 C   s   | j dd d S )NFr   r   r   r   r   r   Gtest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main  s    zQTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainN)TF)T)r   r   r   r4   r7   staticmethodrI   rL   rP   rU   rf   rh   ri   r   rk   rl   rm   rx   rq   r   r}   r   r   r   r   r   r   r   r"   )   s6   



  
~




Q
r"   __main__Zunittest)__doc__
__future__r   r   r   r   rJ   r9   rE   r?   r'    r   Z	leakcheckr   r   r	   ZGREENLET_USE_GCobjectr
   r"   r   
__import__mainr   r   r   r   <module>   s&   
   