Ë
    v¹1h2E  ã                   ó  — 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 e
j$                  sJ ‚ G d
„ de«      Z G d„ de«      Zedk(  r ed«      j1                  «        yy)z)
Testing scenarios that may have leaked.
é    )Úprint_functionÚabsolute_importÚdivisionNé   )ÚTestCase)ÚPY314)Úfails_leakcheck)Úignores_leakcheck)ÚRUNNING_ON_MANYLINUXc                   ó<   — e Zd Z e«       Zd„ Zd„ Zd„ Zed„ «       Z	y)ÚHasFinalizerTracksInstancesc                 ó€   — t        j                  |«      | _        | j                  j	                  t        | «      «       y ©N)ÚsysÚinternÚmsgÚEXTANT_INSTANCESÚaddÚid)Úselfr   s     úW/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.pyÚ__init__z$HasFinalizerTracksInstances.__init__   s)   € Ü—:‘:˜c“?ˆŒØ×Ñ×!Ñ!¤" T£(Õ+ó    c                 óL   — | j                   j                  t        | «      «       y r   )r   Úremover   ©r   s    r   Ú__del__z#HasFinalizerTracksInstances.__del__   s   € Ø×Ñ×$Ñ$¤R¨£XÕ.r   c                 ó6   — dt        | «      | j                  fz  S )Nz(<HasFinalizerTracksInstances at 0x%x %r>)r   r   r   s    r   Ú__repr__z$HasFinalizerTracksInstances.__repr__!   s!   € Ø9Üˆt‹H�d—h‘hð=
ñ 
ð 	
r   c                 ó8   — | j                   j                  «        y r   )r   Úclear)Úclss    r   Úresetz!HasFinalizerTracksInstances.reset%   s   € à×Ñ×"Ñ"Õ$r   N)
Ú__name__Ú
__module__Ú__qualname__Úsetr   r   r   r   Úclassmethodr#   © r   r   r   r      s-   „ Ù“uÐò,ò/ò
ð ñ%ó ñ%r   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y)Ú	TestLeaksc                 óæ   — d}t        j                  |«      }t        j                  d„ «      }t        d«      D ]  } |j                  |Ž  Œ | j                  t        j                  |«      |«       y )N)ÚaÚbÚcc                  óX   —  t        j                  «       j                  j                  | Ž S r   ©ÚgreenletÚ
getcurrentÚparentÚswitch)Úargss    r   ú<lambda>z)TestLeaks.test_arg_refs.<locals>.<lambda>1   s#   € Ð=œ(×-Ñ-Ó/×6Ñ6×=Ñ=¸tÐD€ r   éd   )r   Úgetrefcountr2   Úranger5   ÚassertEqual)r   r6   Úrefcount_beforeÚgÚ_s        r   Útest_arg_refszTestLeaks.test_arg_refs,   sb   € ØˆÜŸ/™/¨$Ó/ˆä×ÑÙDóFˆä�s“ò 	ˆAØˆA�H‰H�dŠOð	à×ÑœŸ™¨Ó.°Õ@r   c                 ó6  — i }| j                  t        j                  |«      t        sdnd«       t	        j                  d„ «      }t        d«      D ]  } |j                  di |¤Ž Œ | j                  t        j                  |«      t        sd«       y d«       y )Né   r   c                  ó^   —  t        j                  «       j                  j                  di | ¤ŽS )Nr)   r1   )Úgkwargss    r   r7   z+TestLeaks.test_kwarg_refs.<locals>.<lambda>;   s&   € ÐAœh×1Ñ1Ó3×:Ñ:×AÑAÑLÀGÑL€ r   r8   r)   )r;   r   r9   r   r2   r:   r5   )r   Úkwargsr=   r>   s       r   Útest_kwarg_refszTestLeaks.test_kwarg_refs6   s~   € ØˆØ×ÑœŸ™¨Ó0½5±!ÀaÔHä×ÑÙLóNˆä�s“ò 	ˆAØˆA�H‰HÑ�vÓð	ð 	×ÑœŸ™¨Ó0½5°!ÕHÀaÕHr   c                  ó¢   — d„ } t        j                  | ¬«      }|j                  «        t        j                  d«       |j                  d«       y )Nc                  ó.   — t        j                  d«       y )Nçü©ñÒMbP?)ÚtimeÚsleepr)   r   r   Úworkerz+TestLeaks.__recycle_threads.<locals>.workerK   s   € Ü�J‰J�uÕr   ©ÚtargetrH   é
   )Ú	threadingÚThreadÚstartrI   rJ   Újoin)rK   Úts     r   Ú__recycle_threadszTestLeaks.__recycle_threadsC   s7   € ò	ä×Ñ FÔ+ˆØ	�‰Œ	Ü�
‰
�5ÔØ	�‰ˆr�
r   c                 óž  ‡— g Šˆfd„}t        d«      D ]:  }t        j                  |¬«      }|j                  «        |j	                  d«       ~Œ< t        j                  «        | j                  «        t        j                  «        t        j                  «        t        j                  «        ‰D ]  }| j                   |«       «       Œ y )Nc                  ór   •— ‰ j                  t        j                  t        j                  «       «      «       y r   )ÚappendÚweakrefÚrefr2   r3   )Úggs   €r   rK   z,TestLeaks.test_threaded_leak.<locals>.workerT   s!   ø€ à�I‰I”g—k‘k¤(×"5Ñ"5Ó"7Ó8Õ9r   rA   rL   rN   ©r:   rO   rP   rQ   rR   r2   r3   Ú_TestLeaks__recycle_threadsÚgcÚcollectÚassertIsNone©r   rK   r>   rS   r=   rZ   s        @r   Útest_threaded_leakzTestLeaks.test_threaded_leakR   s£   ø€ Øˆô	:ô �q“ò 	ˆAÜ× Ñ ¨Ô/ˆAØ�G‰GŒIØ�F‰F�2ŒJÙð		ô
 	×ÑÔØ×ÑÔ Ü×ÑÔÜ
�
‰
ŒÜ×ÑÔØò 	#ˆAØ×Ñ™a›cÕ"ñ	#r   c                 óž  ‡— g Šˆfd„}t        d«      D ]:  }t        j                  |¬«      }|j                  «        |j	                  d«       ~Œ< t        j                  «        | j                  «        t        j                  «        t        j                  «        t        j                  «        ‰D ]  }| j                   |«       «       Œ y )Nc                  ó  •‡— g xŠt        j                  «       _        ˆfd„} t        d«      D ]%  }t        j                   | «      j	                  «        Œ' ‰j                  t        j                  t        j                  «       «      «       y )Nc                  óL   •— ‰ j                  t        j                  «       «       y r   )rW   r2   r3   )Úlls   €r   Ú
additionalzDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionali   s   ø€ Ø—	‘	œ(×-Ñ-Ó/Õ0r   rA   )r2   r3   re   r:   r5   rW   rX   rY   )rf   r>   re   rZ   s     @€r   rK   z0TestLeaks.test_threaded_adv_leak.<locals>.workerf   sf   ù€ à,.Ð.ˆB”×$Ñ$Ó&Ô)ô1ä˜1“Xò 7�Ü×!Ñ! *Ó-×4Ñ4Õ6ð7à�I‰I”g—k‘k¤(×"5Ñ"5Ó"7Ó8Õ9r   rA   rL   rN   r[   r`   s        @r   Útest_threaded_adv_leakz TestLeaks.test_threaded_adv_leakd   s£   ø€ Øˆô	:ô �q“ò 	ˆAÜ× Ñ ¨Ô/ˆAØ�G‰GŒIØ�F‰F�2ŒJÙð		ô
 	×ÑÔØ×ÑÔ Ü×ÑÔÜ
�
‰
ŒÜ×ÑÔØò 	#ˆAØ×Ñ™a›cÕ"ñ	#r   c                 óV  — t         j                  j                  «       }| j                  |d«       t         j                  j	                  d«       t         j                  j                  «       }| j                  ||«       | j                  t         j                  j                  d«       y )Nr   Tr   )r2   Ú	_greenletÚ&get_clocks_used_doing_optional_cleanupÚassertGreaterEqualÚenable_optional_cleanupr;   ÚassertGreaterÚCLOCKS_PER_SEC)r   ÚusedÚused2s      r   ÚassertClocksUsedzTestLeaks.assertClocksUsed{   sz   € Ü×!Ñ!×HÑHÓJˆØ×Ñ  aÔ(ä×Ñ×2Ñ2°4Ô8Ü×"Ñ"×IÑIÓKˆØ×Ñ˜˜uÔ%Ø×Ñœ8×-Ñ-×<Ñ<¸aÕ@r   c                 ó„  ‡‡‡	‡
‡‡‡— t        j                  g «      sJ ‚t        j                  «        t	        j
                  «        | j                  t        j                  d¬«      }t        j                  «       Š
t        j                  «       Š	g Šˆfd„Šg Šˆ	ˆ
ˆˆˆˆfd„}t        j                  |¬«      }|j                  «        ‰
j                  d«       t	        j
                  «        | j                  t        d¬«      }t        ‰«      dk(  sJ ‚| j                  ‰d	   j                  «       ‰d d …= ‰	j!                  «        |j#                  d«       ~| j%                  «        | j                  t        d¬«      }| j                  t        j                  d¬«      }| j'                  ||«       ‰s[t        j(                  j+                  «       �=| j-                  ||«       ‰r*| j-                  t        j.                  t!        «       «       n	 t        j(                  j+                  «       �| j1                  «        y y )
NF)Ú
exact_kindc                  ó2  •— t        d«      } t        j                  j                  dt        d«      «       ‰r2t        j                  «       j
                  j                  } || g«       y t        j                  «       j
                  j                  | g«       y )NzDELETING STACK OBJECTÚtest_leaks_keyzDELETING THREAD STATE)r   r2   ri   Úset_thread_localr3   r4   r5   )ÚjdÚsÚexplicit_reference_to_switchs     €r   Úbackground_greenletz6TestLeaks._check_issue251.<locals>.background_greenlet£   sv   ø€ ä,Ð-DÓEˆBÜ×Ñ×/Ñ/Ø Ü+Ð,CÓDôFñ
 ,Ü×'Ñ'Ó)×0Ñ0×7Ñ7�Ù�2�$•ä×#Ñ#Ó%×,Ñ,×3Ñ3°R°DÕ9r   c                  ó@  •— t        j                   ‰«      } ‰j                  t        j                  | j                  «      «       ‰j                  | «       | j                  «        ~ ‰j                  «        ‰j                  d«       ‰rt        j                  «        y y )NrN   )	r2   rW   rX   rY   r4   r5   r'   Úwaitr3   )ÚgletÚbackground_glet_killedÚbackground_glet_runningrz   Úbackground_greenletsÚbg_main_wrefsÚmanually_collect_backgrounds    €€€€€€r   Úbackground_threadz4TestLeaks._check_issue251.<locals>.background_thread³   sy   ø€ Ü×$Ñ$Ð%8Ó9ˆDØ× Ñ ¤§¡¨T¯[©[Ó!9Ô:à ×'Ñ'¨Ô-Ø�K‰KŒMàØ#×'Ñ'Ô)Ø"×'Ñ'¨Ô+ñ
 +Ü×#Ñ#Õ%ð +r   rL   rN   Tr   r   )r]   Ú
is_trackedr   r#   r2   r3   Úcount_objectsrO   ÚEventrP   rQ   r|   ÚlistÚlenÚassertFalseÚdeadr'   rR   Úwait_for_pending_cleanupsÚassertLessEqualri   rj   r;   r   rq   )r   r‚   ry   Úgreenlets_beforerƒ   rS   Úlists_beforeÚlists_afterÚgreenlets_afterr~   r   rz   r€   r�   s    ``      @@@@@r   Ú_check_issue251zTestLeaks._check_issue251„   så  þ€ ô �}‰}˜RÔ Ð Ð Ü#×)Ñ)Ô+Ü×ÑÔØ×-Ñ-¬h×.?Ñ.?ÈEÐ-ÓRÐä"+§/¡/Ó"3ÐÜ!*§¡Ó!2ÐØ!Ðô	:ð ˆ÷	&ñ 	&ô$ ×ÑÐ$5Ô6ˆØ	�‰Œ	Ø×$Ñ$ RÔ(Ü×ÑÔØ×)Ñ)¬$¸4Ð)Ó@ˆäÐ'Ó(¨AÒ-Ð-Ð-Ø×ÑÐ-¨aÑ0×5Ñ5Ô6ð !¢Ð#Ø×"Ñ"Ô$ð 	
�‰ˆrŒ
Øð 	×&Ñ&Ô(à×(Ñ(¬¸$Ð(Ó?ˆØ×,Ñ,¬X×->Ñ->È5Ð,ÓQˆð
 	×Ñ˜[¨,Ô7ñ ,Ü×!Ñ!×HÑHÓJÐVà×Ñ˜_Ð.>Ô?Ù*ð × Ñ Ô!<×!MÑ!MÌsËuÕUð ä×Ñ×DÑDÓFÐRØ×!Ñ!Õ#ð Sr   c                 ó$   — | j                  «        y r   ©r‘   r   s    r   Ú-test_issue251_killing_cross_thread_leaks_listz7TestLeaks.test_issue251_killing_cross_thread_leaks_list  s   € Ø×ÑÕr   c                 óê   — t         j                  j                  d«       	 | j                  «        t         j                  j                  d«       y # t         j                  j                  d«       w xY w)NFT)r2   ri   rl   r‘   r   s    r   Ú#test_issue251_with_cleanup_disabledz-TestLeaks.test_issue251_with_cleanup_disabled  sP   € Ü×Ñ×2Ñ2°5Ô9ð	=Ø× Ñ Ô"ä×Ñ×6Ñ6°tÕ<øŒH×Ñ×6Ñ6°tÕ<ús   ¡A Á!A2c                 ó(   — | j                  d¬«       y )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                  j                  d«       	 | j	                  d¬«       t        j                  j                  d«       y # t        j                  j                  d«       w xY w)NTFr˜   )Úexpect_greenlet_leakr2   ri   rl   r‘   r   s    r   ÚEtest_issue251_issue252_need_to_collect_in_background_cleanup_disabledzOTestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabled!  s]   € à$(ˆÔ!Ü×Ñ×2Ñ2°5Ô9ð	=Ø× Ñ ¸UÐ ÔCä×Ñ×6Ñ6°tÕ<øŒH×Ñ×6Ñ6°tÕ<ús   ¨A Á!A;c                 ó*   — | j                  dd¬«       y )NFT)r‚   ry   r“   r   s    r   Ú9test_issue251_issue252_explicit_reference_not_collectablezCTestLeaks.test_issue251_issue252_explicit_reference_not_collectable*  s   € à×ÑØ(-Ø)-ð 	õ 	/r   r8   c                 ó²   — t         j                  d   dk\  sJ ‚t         j                  d d dk  r| j                  d«       t        r| j                  d«       y y )Nr   é   rA   )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_versions2  sT   € ô ×Ñ Ñ" aÒ'Ð'Ð'Ü×Ñ˜B˜QÐ &Ò(Ø�M‰MÐ1Ô2ÝØ�M‰MÐ=Õ>ð  r   c                 ó`  ‡‡— | j                  «        d„ ŠdŠˆˆfd„}t        d«      D ]	  } |«        Œ | j                  «       }t        | j                  «      D ]@  }t	        || j                  «       «      } |«        | j                  «       }||k  sŒ:|dkD  sŒ@ n | j                  |«       y )Nc                   ó   — y)Nr   r)   r)   r   r   Úfz:TestLeaks.test_untracked_memory_doesnt_increase.<locals>.fF  s   € Ør   é'  c                  ól   •— t        ‰«      D ]%  } t        j                  ‰«      j                  «        Œ' y r   )r:   r2   r5   )r>   ÚITERr§   s    €€r   Úrun_itz?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itJ  s-   ø€ Ü˜4“[ò .�Ü×!Ñ! !Ó$×+Ñ+Õ-ñ.r   r    r   )r¤   r:   Úget_process_ussÚUNTRACK_ATTEMPTSÚmaxrŒ   )r   r«   r>   Ú
uss_beforeÚcountÚ	uss_afterrª   r§   s         @@r   Ú%test_untracked_memory_doesnt_increasez/TestLeaks.test_untracked_memory_doesnt_increase?  s±   ù€ ð 	×%Ñ%Ô'ò	ð ˆõ	.ô
 �q“ò 	ˆAÙ�Hð	ð ×)Ñ)Ó+ˆ
ä˜4×0Ñ0Ó1ò 	ˆEÜ˜Z¨×)=Ñ)=Ó)?Ó@ˆJÙŒHà×,Ñ,Ó.ˆIØ˜JÓ&¨5°1«9Ùð	ð 	×Ñ˜Y¨
Õ3r   c                 ó<  ‡‡‡	‡
‡‡— | j                  «        dgŠˆfd„Š
dŠ	ˆ	ˆ
fd„Š| Š G ˆˆˆfd„d«      }d x}}t        | j                  «      D �]  }d‰d<    |«       }t        j                  |¬«      }|j                  «        |j                  d«       | j                  |j                  «       «       |€|j                  }t        ||j                  «      }‰r>| j                  |j                  d	«       | j                  ‰d   ‰	|j                  z  «       ~~‰s| j                  ‰d   d«       ‰r| j                  «        | j                  «       }||k  s�Œ|d
kD  s�Œ n | j                  «        | j                  «       }| j!                  ||dfz  «       y )Nr   c                  óª   •— 	 t        j                  «       j                  j                  «        y# t         j                  $ r ‰ dxx   dz  cc<   ‚ w xY w)Nr   r   )r2   r3   r4   r5   ÚGreenletExit)Ú
EXIT_COUNTs   €r   r§   z3TestLeaks._check_untracked_memory_thread.<locals>.fh  sP   ø€ ðÜ×#Ñ#Ó%×,Ñ,×3Ñ3Ô5ð øô ×(Ñ(ò Ø˜1“ Ñ"“Øðús	   ƒ,0 °"Ar¨   c                  ó˜   •— g } t        ‰«      D ]8  }t        j                  ‰«      }| j                  |«       |j                  «        Œ: | S r   )r:   r2   rW   r5   )Úgletsr>   r=   rª   r§   s      €€r   r«   z8TestLeaks._check_untracked_memory_thread.<locals>.run_itq  sH   ø€ ØˆEÜ˜4“[ò �ô ×%Ñ% aÓ(�Ø—‘˜Q”Ø—‘•
ðð ˆLr   c                   ó,   •— e Zd ZdxZZdZdZˆ ˆˆfd„Zy)ú<TestLeaks._check_untracked_memory_thread.<locals>.ThreadFuncr   r)   rA   c                 ó>  •— ‰j                  «       | _        t        | j                  «      D ]%  }| xj                  t         ‰«       «      z  c_        Œ' | j                  D ]  }‰j                  dt        |«      «       Œ ‰rd| _        ‰j                  «       | _        y )Nzsuspended activer)   )	r¬   r¯   r:   rª   r¸   ÚtupleÚassertInÚstrr±   )r   r>   r=   Údeallocate_in_threadr«   Útests      €€€r   Ú__call__zETestLeaks._check_untracked_memory_thread.<locals>.ThreadFunc.__call__ƒ  sƒ   ø€ Ø"&×"6Ñ"6Ó"8�”ä˜tŸy™yÓ)ò 2�AØ—J’J¤%©«£/Ñ1–Jð2ð Ÿ™ò >�AØ—M‘MÐ"4´c¸!³fÕ=ð>ñ (Ø!#�D”JØ!%×!5Ñ!5Ó!7�•r   N)r$   r%   r&   r¯   r±   r¸   rª   rÁ   )r¿   r«   rÀ   s   €€€r   Ú
ThreadFuncrº     s   ø„ Ø%&Ð&ˆJ˜ØˆEØˆD÷8r   rÂ   rL   é   r)   r   zafter attempts %d)r¤   r:   r­   rO   rP   rQ   rR   r‰   Úis_aliver¯   r®   r;   r¸   rª   r‹   r¬   rŒ   )r   r¿   rÂ   r¯   r±   r°   Úthread_funcrS   r¶   rª   r§   r«   rÀ   s    `      @@@@@r   Ú_check_untracked_memory_threadz(TestLeaks._check_untracked_memory_threada  s„  ý€ Ø×%Ñ%Ô'ð �Sˆ
ô	ð ˆõ
	ð ˆ÷	8õ 	8ð$ "&Ð%ˆ
�YÜ˜4×0Ñ0Ó1ó 	ˆEØˆJ�q‰MÙ$›,ˆKÜ× Ñ ¨Ô4ˆAØ�G‰GŒIØ�F‰F�2ŒJØ×Ñ˜QŸZ™Z›\Ô*àÐ!Ø(×3Ñ3�
ä˜Z¨×)?Ñ)?Ó@ˆJÙ#Ø× Ñ  ×!2Ñ!2°BÔ7Ø× Ñ  ¨A¡°°{×7GÑ7GÑ0GÔHàØÙ'Ø× Ñ  ¨A¡°Ô2Ù#Ø×.Ñ.Ô0à×,Ñ,Ó.ˆIà˜JÔ&¨5°1¬9Ùð5	ð8 	×&Ñ&Ô(Ø×(Ñ(Ó*ˆ	Ø×Ñ˜Y¨
Ð4GÈ5È(Ñ4RÕSr   c                 ó(   — | j                  d¬«       y )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   € ð 	×+Ñ+ÀÐ+ÕFr   c                 ó(   — | j                  d¬«       y )NFrÈ   rÉ   r   s    r   ÚGtest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainzQTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main¸  s   € ð 	×+Ñ+ÀÐ+ÕGr   N)TF)T)r$   r%   r&   r?   rE   Ústaticmethodr\   ra   rg   rq   r‘   r”   r–   r	   r™   rœ   rž   r­   r¤   r
   r²   rÆ   rÊ   rÌ   r)   r   r   r+   r+   *   sÞ   „ òAò
Ið ñó ðò#ò$#ò.Að 59Ø5:ó|$ò|ò=ð ñ@ó ð@ð( ñ=ó ð=ð ñ/ó ð/ð
 Ðò?ð ñ4ó ð4ó>OTðb ñGó ðGð ñHó ñHr   r+   Ú__main__Úunittest)Ú__doc__Ú
__future__r   r   r   r   r]   rI   rX   rO   r2   Ú r   r   Ú	leakcheckr	   r
   r   ÚGREENLET_USE_GCÚobjectr   r+   r$   Ú
__import__Úmainr)   r   r   ú<module>rØ      s„   ðñ÷ AÑ @ã 
Û 	ã Û Û ó Ý Ý Ý &Ý (Ý +ð ×ÒÐ Ðô% &ô %ô RH�ô RHðh ˆzÒÙˆzÓ×ÑÕ!ð r   