Ë
    ðmxiœF  ã                   ó  — 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 e
j&                  sJ ‚ G d„ de«      Zd„ Z G d„ de«      Zedk(  r ed«      j5                  «        yy)z)
Testing scenarios that may have leaked.
é    )Úprint_functionÚabsolute_importÚdivisionNé   )ÚTestCase)ÚPY314)ÚRUNNING_ON_FREETHREAD_BUILD)Ú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     úP/home/htdocs/ttos/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                 ó(   — 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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>;   s#   € Ð=œ(×-Ñ-Ó/×6Ñ6×=Ñ=¸tÐD€ r   éd   )r   Úgetrefcountr6   Úranger9   ÚassertEqual)r   r:   Úrefcount_beforeÚgÚ_s        r   Útest_arg_refszTestLeaks.test_arg_refs6   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*   r5   )Úgkwargss    r   r;   z+TestLeaks.test_kwarg_refs.<locals>.<lambda>E   s&   € ÐAœh×1Ñ1Ó3×:Ñ:×AÑAÑLÀGÑL€ r   r<   r*   )r?   r   r=   r   r6   r>   r9   )r   ÚkwargsrA   rB   s       r   Útest_kwarg_refszTestLeaks.test_kwarg_refs@   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>.workerU   s   € Ü�J‰J�uÕr   ©ÚtargetrL   é
   )Ú	threadingÚThreadÚstartrM   rN   Újoin)rO   Úts     r   Ú__recycle_threadszTestLeaks.__recycle_threadsM   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Úrefr6   r7   )Úggs   €r   rO   z,TestLeaks.test_threaded_leak.<locals>.worker^   s!   ø€ à�I‰I”g—k‘k¤(×"5Ñ"5Ó"7Ó8Õ9r   rE   rP   rR   ©r>   rS   rT   rU   rV   r6   r7   Ú_TestLeaks__recycle_threadsÚgcÚcollectÚassertIsNone©r   rO   rB   rW   rA   r^   s        @r   Útest_threaded_leakzTestLeaks.test_threaded_leak\   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   )r[   r6   r7   )Úlls   €r   Ú
additionalzDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionals   s   ø€ Ø—	‘	œ(×-Ñ-Ó/Õ0r   rE   )r6   r7   ri   r>   r9   r[   r\   r]   )rj   rB   ri   r^   s     @€r   rO   z0TestLeaks.test_threaded_adv_leak.<locals>.workerp   sf   ù€ à,.Ð.ˆB”×$Ñ$Ó&Ô)ô1ä˜1“Xò 7�Ü×!Ñ! *Ó-×4Ñ4Õ6ð7à�I‰I”g—k‘k¤(×"5Ñ"5Ó"7Ó8Õ9r   rE   rP   rR   r_   rd   s        @r   Útest_threaded_adv_leakz TestLeaks.test_threaded_adv_leakn   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   )r6   Ú	_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   r6   rm   Úset_thread_localr7   r8   r9   )Ú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 )NrR   )	r6   r[   r\   r]   r8   r9   r(   Úwaitr7   )ÚgletÚbackground_glet_killedÚbackground_glet_runningr~   Ú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   rP   rR   Tr   r   )ra   Ú
is_trackedr   r$   r6   r7   Úcount_objectsrS   ÚEventrT   rU   r€   ÚlistÚlenÚassertFalseÚdeadr(   rV   Úwait_for_pending_cleanupsÚassertLessEqualrm   rn   r?   r   ru   )r   r†   r}   Úgreenlets_beforer‡   rW   Úlists_beforeÚlists_afterÚgreenlets_afterr‚   rƒ   r~   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)r6   rm   rp   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_leakr6   rm   rp   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†   r}   r—   r   s    r   Ú9test_issue251_issue252_explicit_reference_not_collectablezCTestLeaks.test_issue251_issue252_explicit_reference_not_collectable4  s   € à×ÑØ(-Ø)-ð 	õ 	/r   r<   c                 ó²   — t         j                  d   dk\  sJ ‚t         j                  d d dk  r| j                  d«       t        r| j                  d«       y y )Nr   é   rE   )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<  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>.fP  s   € Ør   é'  c                  ól   •— t        ‰«      D ]%  } t        j                  ‰«      j                  «        Œ' y r   )r>   r6   r9   )rB   ÚITERr«   s    €€r   Úrun_itz?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itT  s-   ø€ Ü˜4“[ò .�Ü×!Ñ! !Ó$×+Ñ+Õ-ñ.r   r¤   r   )r¨   r>   Úget_process_ussÚUNTRACK_ATTEMPTSÚmaxr�   )r   r¯   rB   Ú
uss_beforeÚcountÚ	uss_afterr®   r«   s         @@r   Ú%test_untracked_memory_doesnt_increasez/TestLeaks.test_untracked_memory_doesnt_increaseI  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   )r6   r7   r8   r9   ÚGreenletExit)Ú
EXIT_COUNTs   €r   r«   z3TestLeaks._check_untracked_memory_thread.<locals>.fr  sP   ø€ ðÜ×#Ñ#Ó%×,Ñ,×3Ñ3Ô5ð øô ×(Ñ(ò Ø˜1“ Ñ"“Øðús	   ƒ,0 °"Ar¬   c                  ó˜   •— g } t        ‰«      D ]8  }t        j                  ‰«      }| j                  |«       |j                  «        Œ: | S r   )r>   r6   r[   r9   )ÚgletsrB   rA   r®   r«   s      €€r   r¯   z8TestLeaks._check_untracked_memory_thread.<locals>.run_it{  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*   rE   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   rB   rA   Ú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Æ   rP   é   r*   r   zafter attempts %d)r¨   r>   r±   rS   rT   rU   rV   r�   Úis_aliver³   r²   r?   r¼   r®   r�   r°   r�   )r   rÃ   rÆ   r³   rµ   r´   Úthread_funcrW   rº   r®   r«   r¯   rÄ   s    `      @@@@@r   Ú_check_untracked_memory_threadz(TestLeaks._check_untracked_memory_threadk  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'   rC   rI   Ústaticmethodr`   re   rk   ru   r•   r˜   rš   r-   r�   r    r¢   r±   r¨   r   r¶   rÊ   rÎ   rÐ   r*   r   r   r/   r/   4   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   ra   rM   r\   rS   r6   Ú r   r   r	   Ú	leakcheckr
   r   r   ÚGREENLET_USE_GCÚobjectr   r-   r/   r%   Ú
__import__Úmainr*   r   r   ú<module>rÜ      sŒ   ðñ÷ AÑ @ã 
Û 	ã Û Û ó Ý Ý Ý )Ý &Ý (Ý +ð
 ×ÒÐ Ðô% &ô %ò !ôRH�ô RHðh ˆzÒÙˆzÓ×ÑÕ!ð r   