Ë
    êmxi™  ã                   óÖ   — d 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ZddlZddl	Z	ddl
Z
ddl
mZmZmZ ddlmZ d„ Zej"                  d„ «       Ze G d„ de	j&                  «      «       Zy)	ao  Test script to find circular references.

Circular references are not leaks per se, because they will eventually
be GC'd. However, on CPython, they prevent the reference-counting fast
path from being used and instead rely on the slower full GC. This
increases memory footprint and CPU overhead, so we try to eliminate
circular references created by normal operation.
é    N)ÚwebÚgenÚ
httpclient)ÚskipNotCPythonc                 ó˜   ‡‡‡‡‡‡— ˆˆˆˆˆˆfd„Šg Šg Št        «       Št        t        t        | «      «      Št        «       Š ‰| «       ‰S )a  Find circular references in a list of objects.

    The garbage list contains objects that participate in a cycle,
    but also the larger set of objects kept alive by that cycle.
    This function finds subsets of those objects that make up
    the cycle(s).
    c                 ó’  •— | D ]Á  }t        |«      }|‰vrŒ|‰	v rŒ|‰v r7‰‰j                  |«      d  }|j                  |«       ‰j                  |«       ŒS‰j                  |«       ‰j                  |«        ‰t	        j
                  |«      «       ‰j                  «        ‰j                  |«       ‰	j                  |«       ŒÃ y ©N)ÚidÚindexÚappendÚaddÚgcÚget_referentsÚpopÚremove)
ÚlevelÚitemÚitem_idÚ	candidateÚfoundÚgarbage_idsÚinnerÚstackÚ	stack_idsÚvisited_idss
       €€€€€€úS/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/test/circlerefs_test.pyr   z'find_circular_references.<locals>.inner"   sº   ø€ Øò 	%ˆDÜ˜“hˆGØ˜kÑ)ØØ˜+Ñ%ØØ˜)Ñ#Ø! %§+¡+¨dÓ"3Ð"5Ð6�	Ø× Ñ  Ô&Ø—‘˜YÔ'Øà�L‰L˜ÔØ�M‰M˜'Ô"Ù”"×"Ñ" 4Ó(Ô)Ø�I‰IŒKØ×Ñ˜WÔ%Ø�O‰O˜GÕ$ñ#	%ó    )ÚsetÚmapr
   )Úgarbager   r   r   r   r   r   s    @@@@@@r   Úfind_circular_referencesr!      sD   ý€ ÷%ñ %ð( "$€EØ€EÜ“€IÜ”cœ"˜gÓ&Ó'€KÜ“%€Ká	ˆ'„NØ€Lr   c               #   óF  K  — t        j                  «        t        j                  «        t        j                  t         j                  t         j
                  z  «       d–— 	 t        j                  «       } t        j                  }| t        _	        	 t        j                  «        |t        _	        t         j                  dd }g t         j                  dd t        |«      dk(  r+	 t        j                  d«       t        j                  «        yt        |«      D ]©  }| j                  d«       |D ]  }| j                  dt        |«      › �«       Œ! |D ]m  }t!        |t"        j$                  «      sŒ| j                  d|j&                  › �«       | j                  dt        |«      › �«       t)        j*                  |«       Œo Œ« ~t-        | j/                  «       «      ‚# |t        _	        w xY w# t        j                  d«       t        j                  «        w xY w­w)zERaise AssertionError if the wrapped code creates garbage with cycles.Nr   z!
==========
 Circular 
==========z
    z	
Locals: z
Traceback: )r   ÚdisableÚcollectÚ	set_debugÚDEBUG_STATSÚDEBUG_SAVEALLÚioÚStringIOÚsysÚstderrr    ÚlenÚenabler!   ÚwriteÚreprÚ
isinstanceÚtypesÚ	FrameTypeÚf_localsÚ	tracebackÚprint_stackÚAssertionErrorÚgetvalue)ÚfÚ
old_stderrr    Úcircularr   s        r   Úassert_no_cycle_garbager;   @   s‰  è ø€ ô ‡J�J„LÜ‡J�J„LÜ‡L�L”—‘¤"×"2Ñ"2Ñ2Ô3Û	ðô �K‰K‹MˆÜ—Z‘Zˆ
ØŒŒ
ð	$Ü�J‰JŒLà#ŒCŒJÜ—*‘*™Q�-ˆð Œ�
‰
‘1ˆÜˆw‹<˜1ÒØô 	�‰�QŒÜ
�	‰	�ô 1°Ó9ò 	0ˆHØ�G‰GÐ:Ô;Ø ò /�Ø—‘˜&¤ d£ Ð-Õ.ð/à ò 0�Ü˜d¤E§O¡OÕ4Ø—G‘G˜j¨¯©¨Ð8Ô9Ø—G‘G˜m¬D°«J¨<Ð8Ô9Ü×)Ñ)¨$Õ/ñ	0ð		0ð Ü˜QŸZ™Z›\Ó*Ð*øð# $ŒC�Jûô& 	�‰�QŒÜ
�	‰	�üsD   ‚A!H!Á$/G3 ÂG# Â(?G3 Ã(*H!ÄA"G3 Å5A.G3 Ç#G0Ç0G3 Ç3+HÈH!c                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚCircleRefsTestc                 óD  ‡—  G ˆfd„d«      Š| j                  t        «      5 }t        «       5   ‰d«      } ‰d«      } ‰d«      }||_        ||_        ||_        ||_        ~~d d d «       d d d «       | j                  dt        j                  «      «       | j                  dt        |j                  «      «       | j                  dt        |j                  «      «       | j                  d	t        |j                  «      «       y # 1 sw Y   Œ¦xY w# 1 sw Y   ŒªxY w)
Nc                   ó   •— e Zd Zˆ fd„Zd„ Zy)ú)CircleRefsTest.test_known_leak.<locals>.Cc                 ó>   •— || _         d | _        d | _        d | _        y r	   )ÚnameÚaÚbÚc)ÚselfrB   ÚCs     €r   Ú__init__z2CircleRefsTest.test_known_leak.<locals>.C.__init__m   s   ø€ Ø �”	Ø-1�”Ø-1�”Ø-1�•r   c                 ó    — d| j                   › �S )Nzname=)rB   ©rF   s    r   Ú__repr__z2CircleRefsTest.test_known_leak.<locals>.C.__repr__s   s   € Ø˜tŸy™y˜kÐ*Ð*r   N)Ú__name__Ú
__module__Ú__qualname__rH   rK   )rG   s   €r   rG   r@   l   s   ø„ ô2ó+r   rG   rC   rD   rE   ÚCircularz
    name=az
    name=bz
    name=c)
ÚassertRaisesr6   r;   rD   rE   rC   ÚassertInÚstrÚ	exceptionÚassertNotIn)rF   ÚcmrC   rD   rE   rG   s        @r   Útest_known_leakzCircleRefsTest.test_known_leakj   sï   ø€ ÷	+ó 	+ð ×Ñœ~Ó.ð 	°"Ü(Ó*ñ 
ñ �c“F�Ù�c“F�Ù�c“F�Ø�”Ø�”Ø�”Ø�”Ø�q÷
÷	ð 	�‰�j¤# b§l¡lÓ"3Ô4ð 	�‰�l¤C¨¯©Ó$5Ô6Ø�‰�l¤C¨¯©Ó$5Ô6Ø×Ñ˜¤s¨2¯<©<Ó'8Õ9÷'
ð 
ú÷	ð 	ús"   £D®7D
Á%DÄ
D	ÄDÄDc              ƒ   óâ  K  — t        j                  d|fg«      }t        j                  j	                  «       \  }}t        j
                  j                  |«      }|j                  |«       t        j                  «       }t        «       5  |j                  d|› d�«      ƒ d {  –—†  d d d «       |j                  «        |j                  «        |j                  «        y 7 Œ=# 1 sw Y   Œ<xY w­w)Nú/zhttp://127.0.0.1:)r   ÚApplicationÚtornadoÚtestingÚbind_unused_portÚ
httpserverÚ
HTTPServerÚ
add_socketr   ÚAsyncHTTPClientr;   ÚfetchÚcloseÚstop)rF   Úhandler_classÚappÚsocketÚportÚserverÚclients          r   Úrun_handlerzCircleRefsTest.run_handlerŒ   sÆ   è ø€ Ü�o‰oà�}Ð%ðó
ˆô
 —‘×7Ñ7Ó9‰ˆ�Ü×#Ñ#×.Ñ.¨sÓ3ˆØ×Ñ˜&Ô!ä×+Ñ+Ó-ˆÜ$Ó&ñ 	<ð —,‘,Ð!2°4°&¸Ð:Ó;×;Ð;÷	<ð 	�‰ŒØ�‰ŒØ�‰�ð <ø÷	<ð 	<üs0   ‚BC/Â
C#Â#C!Â$C#Â(9C/Ã!C#Ã#C,Ã(C/c                 ó~   —  G d„ dt         j                  «      }t        j                  | j	                  |«      «       y )Nc                   ó   — e Zd Zd„ Zy)ú1CircleRefsTest.test_sync_handler.<locals>.Handlerc                 ó&   — | j                  d«       y ©Núok
)r.   rJ   s    r   Úgetz5CircleRefsTest.test_sync_handler.<locals>.Handler.get¤   s   € Ø—
‘
˜6Õ"r   N©rL   rM   rN   rq   © r   r   ÚHandlerrm   £   s   „ ó#r   rt   ©r   ÚRequestHandlerÚasyncioÚrunrj   ©rF   rt   s     r   Útest_sync_handlerz CircleRefsTest.test_sync_handler¢   s-   € ô	#”c×(Ñ(ô 	#ô 	�‰�D×$Ñ$ WÓ-Õ.r   c                 ó~   —  G d„ dt         j                  «      }t        j                  | j	                  |«      «       y )Nc                   ó   — e Zd Zd„ Zy)ú=CircleRefsTest.test_finish_exception_handler.<locals>.Handlerc                 ó,   — t        j                  d«      ‚ro   )r   ÚFinishrJ   s    r   rq   zACircleRefsTest.test_finish_exception_handler.<locals>.Handler.get«   s   € Ü—j‘j Ó(Ð(r   Nrr   rs   r   r   rt   r}   ª   s   „ ó)r   rt   ru   ry   s     r   Útest_finish_exception_handlerz,CircleRefsTest.test_finish_exception_handler©   s-   € ô	)”c×(Ñ(ô 	)ô 	�‰�D×$Ñ$ WÓ-Õ.r   c                 ó~   —  G d„ dt         j                  «      }t        j                  | j	                  |«      «       y )Nc                   ó0   — e Zd Zej                  d„ «       Zy)ú1CircleRefsTest.test_coro_handler.<locals>.Handlerc              3   ó\   K  — t        j                  d«      –— | j                  d«       y ­w©Ng{®Gáz„?rp   ©rw   Úsleepr.   rJ   s    r   rq   z5CircleRefsTest.test_coro_handler.<locals>.Handler.get²   s!   è ø€ ä—m‘m DÓ)Ò)Ø—
‘
˜6Õ"ùs   ‚*,N)rL   rM   rN   r   Ú	coroutinerq   rs   r   r   rt   rƒ   ±   s   „ Ø�]‰]ñ#ó ñ#r   rt   ru   ry   s     r   Útest_coro_handlerz CircleRefsTest.test_coro_handler°   s-   € ô	#”c×(Ñ(ô 	#ô 	�‰�D×$Ñ$ WÓ-Õ.r   c                 ó~   —  G d„ dt         j                  «      }t        j                  | j	                  |«      «       y )Nc                   ó   — e Zd Zd„ Zy)ú2CircleRefsTest.test_async_handler.<locals>.Handlerc              “   ól   K  — t        j                  d«      ƒ d {  –—†  | j                  d«       y 7 Œ­wr…   r†   rJ   s    r   rq   z6CircleRefsTest.test_async_handler.<locals>.Handler.get»   s)   è ø€ Ü—m‘m DÓ)×)Ð)Ø—
‘
˜6Õ"ð *ús   ‚4›2œ4Nrr   rs   r   r   rt   rŒ   º   s   „ ó#r   rt   ru   ry   s     r   Útest_async_handlerz!CircleRefsTest.test_async_handler¹   s-   € ô	#”c×(Ñ(ô 	#ô
 	�‰�D×$Ñ$ WÓ-Õ.r   c                 ó  ‡‡— dd l }|j                  j                  d«      5 Š G ˆfd„d«      } |«       Šˆfd„}t        «       5  t	        j
                   |«       «       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)Nr   é   c                   óL   •— e Zd ZW ° Zej
                  j                  d„ «       Zy)ú4CircleRefsTest.test_run_on_executor.<locals>.Factoryc                  ó   — y r	   rs   rJ   s    r   rx   z8CircleRefsTest.test_run_on_executor.<locals>.Factory.runÍ   s   € àr   N)rL   rM   rN   ÚexecutorrZ   Ú
concurrentÚrun_on_executorrx   )Úthread_pools   €r   ÚFactoryr’   Ê   s&   ø„ Ù&�à×#Ñ#×3Ñ3ñ ó 4ñ r   r˜   c               “   ób   •K  — t        d«      D ]  } ‰j                  «       ƒ d {  –—†  Œ y 7 Œ­w)Né   )Úrangerx   )ÚiÚfactorys    €r   Úmainz1CircleRefsTest.test_run_on_executor.<locals>.mainÓ   s,   øè ø€ ä˜q›ò (�AØ!Ÿ+™+›-×'Ñ'ñ(Ø'ús   ƒ"/¥-¦/)Úconcurrent.futuresÚfuturesÚThreadPoolExecutorr;   rw   rx   )rF   r•   r˜   rž   r�   r—   s       @@r   Útest_run_on_executorz#CircleRefsTest.test_run_on_executorÁ   s{   ù€ ó
 	"à×Ñ×2Ñ2°1Ó5ð 	$¸÷ ó  ñ “iˆGô(ô
 )Ó*ñ $Ü—‘™D›FÔ#÷$÷!	$ð 	$÷ $ð $ú÷!	$ð 	$ús#   ¢#A=ÁA1Á A=Á1A:	Á6A=Á=BN)
rL   rM   rN   rV   rj   rz   r€   r‰   rŽ   r¢   rs   r   r   r=   r=   h   s&   „ ò :òDò,/ò/ò/ò/ó$r   r=   )Ú__doc__rw   Ú
contextlibr   r(   r*   r4   r1   ÚtypingÚunittestrZ   r   r   r   Útornado.test.utilr   r!   Úcontextmanagerr;   ÚTestCaser=   rs   r   r   ú<module>rª      sx   ðñó Û Û 	Û 	Û 
Û Û Û Û ã ß (Ñ (Ý ,ò$ðN ×Ññ#ó ð#ðN ôp$�X×&Ñ&ó p$ó ñp$r   