
    Mh                         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dS )	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 rH                    |          d          }|                    |                               |           g                    |                               |            t	          j        |                                                                          |           	                    |           d S N)idindexappendaddgcget_referentspopremove)
levelitemitem_id	candidatefoundgarbage_idsinnerstack	stack_idsvisited_idss
       \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/tornado/test/circlerefs_test.pyr   z'find_circular_references.<locals>.inner"   s    	% 	%DhhGk))+%%)##!%++d"3"3"5"56	  &&&Y'''LLMM'"""E""4(()))IIKKKW%%%OOG$$$$#	% 	%    )setmapr
   )garbager   r   r   r   r   r   s    @@@@@@r   find_circular_referencesr!      s    % % % % % % % % % %( "$EEIc"g&&''K%%K	E'NNNLr   c               #   X  K   t          j                     t          j                     t          j        t           j        t           j        z             dV  	 t          j                    } t          j	        }| t          _	        	 t          j                     |t          _	        n# |t          _	        w xY wt           j
        dd         }g t           j
        dd<   t          |          dk    r*	 t          j        d           t          j                     dS t          |          D ]}|                     d           |D ]'}|                     dt          |                      (|D ]r}t!          |t"          j                  rV|                     d|j                    |                     dt          |                      t)          j        |           s~t-          |                                           # t          j        d           t          j                     w xY 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      JLLLJLLLL""22333	EEE KMMZ

	$JLLL#CJJCJ####*QQQ- 
111w<<1 	Q
	 199 	0 	0HGG:;;;  / /-d--....  0 0dEO44 0GG888999GG8DJJ88999)$///	0
 QZZ\\***
Q
	s+   +H  B% H  %B33;H  C(H   )H)c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	CircleRefsTestc                     G fdd          |                      t                    5 }t                      5   d          } d          } d          }||_        ||_        ||_        ||_        ~~d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     dt          |j                             |                     dt          |j                             |                     dt          |j                             | 	                    d	t          |j                             d S )
Nc                        e Zd Z fdZd ZdS ))CircleRefsTest.test_known_leak.<locals>.Cc                 @    || _         d | _        d | _        d | _        d S 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    *ty***r   N)__name__
__module____qualname__rH   rK   )rG   s   r   rG   r@   l   s=        2 2 2 2 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   	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ ~.. 	"(** 
 
 AcFFAcFFAcFFq
 
 
 
 
 
 
 
 
 
 
 
 
 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	j#bl"3"3444 	lC$5$5666lC$5$5666s2<'8'899999s5   BA B:BB
	
BB
	BB!$B!c                 
  K   t          j        d|fg          }t          j                                        \  }}t          j                            |          }|                    |           t          j	                    }t                      5  |                    d| d           d {V  d d d            n# 1 swxY w Y   |                                 |                                 |                                 d S )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   s5     o}%
 

 7799#..s33&!!!+--$&& 	< 	< ,,:4:::;;;;;;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	s    B<<C C c                      G d dt           j                  }t          j        |                     |                     d S )Nc                       e Zd Zd ZdS )1CircleRefsTest.test_sync_handler.<locals>.Handlerc                 0    |                      d           d S 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   sU    	# 	# 	# 	# 	#c( 	# 	# 	# 	D$$W--.....r   c                      G d dt           j                  }t          j        |                     |                     d S )Nc                       e Zd Zd ZdS )=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(((r   Nrr   rs   r   r   rt   r}      s#        ) ) ) ) )r   rt   ru   ry   s     r   test_finish_exception_handlerz,CircleRefsTest.test_finish_exception_handler   sU    	) 	) 	) 	) 	)c( 	) 	) 	) 	D$$W--.....r   c                      G d dt           j                  }t          j        |                     |                     d S )Nc                   .    e Zd Zej        d             ZdS )1CircleRefsTest.test_coro_handler.<locals>.Handlerc              3   `   K   t          j        d          V  |                     d           d S Ng{Gz?rp   rw   sleepr.   rJ   s    r   rq   z5CircleRefsTest.test_coro_handler.<locals>.Handler.get   s4      mD)))))

6"""""r   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   sU    	# 	# 	# 	# 	#c( 	# 	# 	# 	D$$W--.....r   c                      G d dt           j                  }t          j        |                     |                     d S )Nc                       e Zd Zd ZdS )2CircleRefsTest.test_async_handler.<locals>.Handlerc                 h   K   t          j        d           d {V  |                     d           d S r   r   rJ   s    r   rq   z6CircleRefsTest.test_async_handler.<locals>.Handler.get   s@      mD)))))))))

6"""""r   Nrr   rs   r   r   rt   r      s#        # # # # #r   rt   ru   ry   s     r   test_async_handlerz!CircleRefsTest.test_async_handler   sU    	# 	# 	# 	# 	#c( 	# 	# 	#
 	D$$W--.....r   c                 8   dd l }|j                            d          5  G fdd          } |            fd}t                      5  t	          j         |                       d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr      c                   >    e Zd Z Zej        j        d             ZdS )4CircleRefsTest.test_run_on_executor.<locals>.Factoryc                     d S r	   rs   rJ   s    r   rx   z8CircleRefsTest.test_run_on_executor.<locals>.Factory.run   s    4r   N)rL   rM   rN   executorrZ   
concurrentrun_on_executorrx   )thread_pools   r   Factoryr      s:        &#3    43     r   r   c                  d   K   t          d          D ]}                                  d {V  d S )N   )rangerx   )ifactorys    r   mainz1CircleRefsTest.test_run_on_executor.<locals>.main   sI      q ( (A!++--''''''''( (r   )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2155 	$                    giiG( ( ( ( (
 )** $ $DDFF###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $!	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s5   -BA7+B7A;	;B>A;	?BB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      s         				 				 



         ( ( ( ( ( ( ( ( ( ( , , , , , ,$ $ $N # # #N p$ p$ p$ p$ p$X& p$ p$ p$ p$ p$r   