a
    vÜaÕ  ã                   @   sN   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ZG dd„ de jƒZdS )é    Nc                   @   s:   e Zd Zdd„ Zdd„ Zejr6dd„ Zdd„ Zd	d
„ Z	dS )ÚArgRefcountTestsc                 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 ©N©ÚgreenletÚ
getcurrentÚparentÚswitch)Úargs© r   ú8lib/python3.9/site-packages/greenlet/tests/test_leaks.pyÚ<lambda>   ó    z0ArgRefcountTests.test_arg_refs.<locals>.<lambda>éd   )ÚsysÚgetrefcountr   Úranger   ÚassertEqual)Úselfr   Zrefcount_beforeÚgÚir   r   r   Útest_arg_refs   s    
ÿzArgRefcountTests.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      r   z2ArgRefcountTests.test_kwarg_refs.<locals>.<lambda>r   é   )r   r   r   r   r   r   )r   r   r   r   r   r   r   Útest_kwarg_refs   s    ÿz ArgRefcountTests.test_kwarg_refsc                 C   s2   dd„ }t j|d}| ¡  t d¡ | ¡  d S )Nc                   S   s   t  d¡ d S )Nçü©ñÒMbP?)ÚtimeÚsleepr   r   r   r   Úworker'   s    z0ArgRefcountTests.recycle_threads.<locals>.worker©Útargetr   )Ú	threadingÚThreadÚstartr   r   Újoin)r   r    Útr   r   r   Úrecycle_threads    s
    
z ArgRefcountTests.recycle_threadsc                    s‚   g ‰ ‡ fdd„}t dƒD ]"}tj|d}| ¡  | ¡  ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ d u ¡ qhd S )Nc                      s   ˆ   t t ¡ ¡¡ d S r   )ÚappendÚweakrefÚrefr   r	   r   ©Zggr   r   r    0   s    z3ArgRefcountTests.test_threaded_leak.<locals>.workerr   r!   ©r   r#   r$   r%   r&   r   r	   r(   ÚgcZcollectZ
assertTrue©r   r    r   r'   r   r   r,   r   Útest_threaded_leak.   s    z#ArgRefcountTests.test_threaded_leakc                    s‚   g ‰ ‡ fdd„}t dƒD ]"}tj|d}| ¡  | ¡  ~qt ¡  |  ¡  t ¡  t 	¡  t ¡  ˆ D ]}|  
|ƒ d u ¡ qhd S )Nc                     sN   g  ‰ t  ¡ _‡ fdd„} tdƒD ]}t   | ¡ ¡  q"ˆ t t  ¡ ¡¡ d S )Nc                      s   ˆ   t ¡ ¡ d S r   )r)   r   r	   r   ©Úllr   r   Ú
additionalE   s    zKArgRefcountTests.test_threaded_adv_leak.<locals>.worker.<locals>.additionalr   )r   r	   r2   r   r   r)   r*   r+   )r3   r   r,   r1   r   r    B   s
    z7ArgRefcountTests.test_threaded_adv_leak.<locals>.workerr   r!   r-   r/   r   r,   r   Útest_threaded_adv_leak@   s    z'ArgRefcountTests.test_threaded_adv_leakN)
Ú__name__Ú
__module__Ú__qualname__r   r   r   ZGREENLET_USE_GCr(   r0   r4   r   r   r   r   r      s   	r   )	Zunittestr   r.   r   r*   r   r#   ZTestCaser   r   r   r   r   Ú<module>   s   