
    R?g                         S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSK
JrJrJr  SSKJr  S r\R"                  S 5       r\ " S S\	R&                  5      5       rg)	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                    ^^^^^^ UUUUUU4S jm/ m/ m[        5       m[        [        [        U 5      5      m[        5       mT" U 5        T$ )zFind 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                   > U  H  n[        U5      nUT;  a  M  UT	;   a  M  UT;   a8  TTR                  U5      S  nUR                  U5        TR                  U5        M\  TR                  U5        TR                  U5        T" [        R
                  " U5      5        TR                  5         TR                  U5        T	R                  U5        M     g N)idindexappendaddgcget_referentspopremove)
levelitemitem_id	candidatefoundgarbage_idsinnerstack	stack_idsvisited_idss
       >/usr/lib/python3/dist-packages/tornado/test/circlerefs_test.pyr   'find_circular_references.<locals>.inner"   s    DhGk)+%)#!%++d"3"56	  &Y'LLMM'""""4()IIKW%OOG$#     )setmapr
   )garbager   r   r   r   r   r   s    @@@@@@r   find_circular_referencesr"      sD    % %( "$EEIc"g&'K%K	'NLr   c               #   t  #    [         R                  " 5         [         R                  " 5         [         R                  " [         R                  [         R
                  -  5        Sv    [        R                  " 5       n [        R                  nU [        l	         [         R                  " 5         U[        l	        [         R                  SS n/ [         R                  SS& [        U5      S:X  a-   [         R                  " S5        [         R                  " 5         g[        U5       H  nU R                  S5        U H   nU R                  S[        U5       35        M"     U Hu  n[!        U["        R$                  5      (       d  M$  U R                  SUR&                   35        U R                  S[        U5       35        [(        R*                  " U5        Mw     M     A[-        U R/                  5       5      e! U[        l	        f = f! [         R                  " S5        [         R                  " 5         f = f7f)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|     JJLJJLLL""2"223	 KKMZZ

	$JJL#CJ**Q- 

1w<1 	Q
		 19HGG:; &d-. ! dEOO44GGj89GGmDJ<89))$/	 !	 : QZZ\**# $CJ& 	Q
		sE   A$H8'0H G8 -A H .,H8A'H A3H 8HH -H55H8c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)CircleRefsTesth   c                 \  ^  " U4S jS[         5      mU R                  [        5       n[        5          T" S5      nT" S5      nT" S5      nX2l        XBl        X#l        XCl        AAS S S 5        S S S 5        U R                  S[        WR                  5      5        U R                  S[        UR                  5      5        U R                  S[        UR                  5      5        U R                  S	[        UR                  5      5        g ! , (       d  f       N= f! , (       d  f       N= f)
Nc                   (   > \ rS rSrU 4S jrS rSrg))CircleRefsTest.test_known_leak.<locals>.Cl   c                 <   > Xl         S U l        S U l        S U l        g r	   )nameabc)selfrE   Cs     r   __init__2CircleRefsTest.test_known_leak.<locals>.C.__init__m   s     	-1-1-1r   c                      SU R                    3$ )Nzname=)rE   rI   s    r   __repr__2CircleRefsTest.test_known_leak.<locals>.C.__repr__s   s    tyyk**r   )rF   rG   rH   rE   N)__name__
__module____qualname____firstlineno__rK   rO   __static_attributes__)rJ   s   r   rJ   rB   l   s    2+r   rJ   rF   rG   rH   Circularz
    name=az
    name=bz
    name=c)objectassertRaisesr7   r<   rG   rH   rF   assertInstr	exceptionassertNotIn)rI   cmrF   rG   rH   rJ   s        @r   test_known_leakCircleRefsTest.test_known_leakj   s    	+ 	+ ~."(* cFcFcFq + / 	j#bll"34 	lC$56lC$56s2<<'89' +* /.s"   D3D'D
D	D
D+c                   #    [         R                  " SU4/5      n[        R                  R	                  5       u  p4[        R
                  R                  U5      nUR                  U5        [        R                  " 5       n[        5          UR                  SU S35      I S h  vN   S S S 5        UR                  5         UR                  5         UR                  5         g  N=! , (       d  f       NA= f7f)N/zhttp://127.0.0.1:)r   Applicationtornadotestingbind_unused_port
httpserver
HTTPServer
add_socketr   AsyncHTTPClientr<   fetchclosestop)rI   handler_classappsocketportserverclients          r   run_handlerCircleRefsTest.run_handler   s     oo}%

 779##..s3&!++-$& ,,!24&:;;; ' 	 < '&s0   B	C5C$$C"%C$)9C5"C$$
C2.C5c                      " S S[         R                  5      n[        R                  " U R	                  U5      5        g )Nc                       \ rS rSrS rSrg)1CircleRefsTest.test_sync_handler.<locals>.Handler   c                 &    U R                  S5        g Nok
)r/   rN   s    r   get5CircleRefsTest.test_sync_handler.<locals>.Handler.get   s    

6"r    NrQ   rR   rS   rT   r|   rU   r~   r   r   Handlerrw      s    #r   r   r   RequestHandlerasynciorunrs   rI   r   s     r   test_sync_handler CircleRefsTest.test_sync_handler   s-    	#c(( 	# 	D$$W-.r   c                      " S S[         R                  5      n[        R                  " U R	                  U5      5        g )Nc                       \ rS rSrS rSrg)=CircleRefsTest.test_finish_exception_handler.<locals>.Handler   c                 .    [         R                  " S5      erz   )r   FinishrN   s    r   r|   ACircleRefsTest.test_finish_exception_handler.<locals>.Handler.get   s    jj((r   r~   Nr   r~   r   r   r   r      s    )r   r   r   r   s     r   test_finish_exception_handler,CircleRefsTest.test_finish_exception_handler   s-    	)c(( 	) 	D$$W-.r   c                      " S S[         R                  5      n[        R                  " U R	                  U5      5        g )Nc                   8    \ rS rSr\R
                  S 5       rSrg)1CircleRefsTest.test_coro_handler.<locals>.Handler   c              3   ^   #    [         R                  " S5      v   U R                  S5        g 7fNg{Gz?r{   r   sleepr/   rN   s    r   r|   5CircleRefsTest.test_coro_handler.<locals>.Handler.get   s      mmD))

6"s   +-r~   N)rQ   rR   rS   rT   r   	coroutiner|   rU   r~   r   r   r   r      s    ]]# #r   r   r   r   s     r   test_coro_handler CircleRefsTest.test_coro_handler   s-    	#c(( 	# 	D$$W-.r   c                      " S S[         R                  5      n[        R                  " U R	                  U5      5        g )Nc                       \ rS rSrS rSrg)2CircleRefsTest.test_async_handler.<locals>.Handler   c                 n   #    [         R                  " S5      I S h  vN   U R                  S5        g  N7fr   r   rN   s    r   r|   6CircleRefsTest.test_async_handler.<locals>.Handler.get   s(     mmD)))

6" *s   535r~   Nr   r~   r   r   r   r      s    #r   r   r   r   s     r   test_async_handler!CircleRefsTest.test_async_handler   s-    	#c(( 	#
 	D$$W-.r   c                 6  ^^ SS K nUR                  R                  S5       m " U4S jS[        5      nU" 5       mU4S jn[	        5          [
        R                  " U" 5       5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr      c                   T   > \ rS rSr Y r\R                  R                  S 5       rSr	g)4CircleRefsTest.test_run_on_executor.<locals>.Factory   c                     g r	   r~   rN   s    r   r   8CircleRefsTest.test_run_on_executor.<locals>.Factory.run   s    r   r~   N)
rQ   rR   rS   rT   executorrc   
concurrentrun_on_executorr   rU   )thread_pools   r   Factoryr      s&    &##33  4 r   r   c                  f   >#    [        S5       H  n TR                  5       I S h  vN   M     g  N	7f)N   )ranger   )ifactorys    r   main1CircleRefsTest.test_run_on_executor.<locals>.main   s&     qA!++-'' "'s   "1/
1)concurrent.futuresfuturesThreadPoolExecutorrW   r<   r   r   )rI   r   r   r   r   r   s       @@r   test_run_on_executor#CircleRefsTest.test_run_on_executor   sm    
 	"2215 &   iG(
 )*DF# +! 65  +*! 65s#   *B
A9(B
9
B	B


Br~   N)rQ   rR   rS   rT   r^   rs   r   r   r   r   r   rU   r~   r   r   r>   r>   h   s&     :D,////$r   r>   )__doc__r   
contextlibr   r)   r+   r5   r2   typingunittestrc   r   r   r   tornado.test.utilr   r"   contextmanagerr<   TestCaser>   r~   r   r   <module>r      sx      	 	 
      ( ( ,$N # #N p$X&& p$ p$r   