zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
U
¸ý°dEã@sôdZddlmZmZmZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl m Z ddlmZddlmZddlmZdd    lmZzdd
lmZWnek
r°YnXe js¼t‚Gd d „d eƒZGd d„de ƒZedkrðedƒ ¡dS)z)
Testing scenarios that may have leaked.
é)Úprint_functionÚabsolute_importÚdivisionNé)ÚTestCase)Úfails_leakcheck)Úignores_leakcheck)ÚRUNNING_ON_GITHUB_ACTIONS)ÚRUNNING_ON_MANYLINUX)Úinternc@s6eZdZeƒZdd„Zdd„Zdd„Zedd„ƒZ    d    S)
ÚHasFinalizerTracksInstancescCst|ƒ|_|j t|ƒ¡dS©N)r ÚmsgÚEXTANT_INSTANCESÚaddÚid)Úselfr©rúPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\greenlet/tests/test_leaks.pyÚ__init__!s
z$HasFinalizerTracksInstances.__init__cCs|j t|ƒ¡dSr )rÚremover©rrrrÚ__del__$sz#HasFinalizerTracksInstances.__del__cCsdt|ƒ|jfS)Nz(<HasFinalizerTracksInstances at 0x%x %r>)rrrrrrÚ__repr__&sÿz$HasFinalizerTracksInstances.__repr__cCs|j ¡dSr )rÚclear)ÚclsrrrÚreset*sz!HasFinalizerTracksInstances.resetN)
Ú__name__Ú
__module__Ú __qualname__ÚsetrrrrÚ classmethodrrrrrr s r c@s¸eZdZdd„Zdd„Zedd„ƒZdd„Zd    d
„Zd d „Z    d'dd„Z
dd„Z dd„Z e dd„ƒZe dd„ƒZe dd„ƒZdZdd„Zedd„ƒZd(d d!„Zed"d#„ƒZed$d%„ƒZd&S))Ú    TestLeakscCsJd}t |¡}t dd„¡}tdƒD]}|j|Žq$| t |¡|¡dS)N)ÚaÚbÚccWst ¡jj|ŽSr ©ÚgreenletÚ
getcurrentÚparentÚswitch)ÚargsrrrÚ<lambda>6óz)TestLeaks.test_arg_refs.<locals>.<lambda>éd)ÚsysÚ getrefcountr'Úranger*Ú assertEqual)rr+Zrefcount_beforeÚgÚ_rrrÚ test_arg_refs1s
ÿ  zTestLeaks.test_arg_refscCsBi}t dd„¡}tdƒD]}|jf|Žq| t |¡d¡dS)Nc[st ¡jjf|ŽSr r&)Úkwargsrrrr,?r-z+TestLeaks.test_kwarg_refs.<locals>.<lambda>r.é)r'r1r*r2r/r0)rr6r3r4rrrÚtest_kwarg_refs;sÿ zTestLeaks.test_kwarg_refscCs4dd„}tj|d}| ¡t d¡| d¡dS)NcSst d¡dS)Nçü©ñÒMbP?)ÚtimeÚsleeprrrrÚworkerMsz+TestLeaks.__recycle_threads.<locals>.worker©Útargetr9é
)Ú    threadingÚThreadÚstartr:r;Újoin)r<ÚtrrrZ__recycle_threadsEs
 
zTestLeaks.__recycle_threadscs€g‰‡fdd„}tdƒD]$}tj|d}| ¡| d¡~qt ¡| ¡t ¡t     ¡t ¡ˆD]}| 
|ƒ¡qjdS)Ncsˆ t t ¡¡¡dSr )ÚappendÚweakrefÚrefr'r(r©Zggrrr<Vsz,TestLeaks.test_threaded_leak.<locals>.workerr7r=r?© r1r@rArBrCr'r(Ú_TestLeaks__recycle_threadsÚgcZcollectZ assertIsNone©rr<r4rDr3rrHrÚtest_threaded_leakTs   
zTestLeaks.test_threaded_leakcs€g‰‡fdd„}tdƒD]$}tj|d}| ¡| d¡~qt ¡| ¡t ¡t     ¡t ¡ˆD]}| 
|ƒ¡qjdS)NcsNg‰t ¡_‡fdd„}tdƒD]}t |¡ ¡q"ˆ t t ¡¡¡dS)Ncsˆ t ¡¡dSr )rEr'r(r©ÚllrrÚ
additionalkszDTestLeaks.test_threaded_adv_leak.<locals>.worker.<locals>.additionalr7)r'r(rOr1r*rErFrG)rPr4rHrNrr<hs
  z0TestLeaks.test_threaded_adv_leak.<locals>.workerr7r=r?rIrLrrHrÚtest_threaded_adv_leakfs   
z TestLeaks.test_threaded_adv_leakcCsLtj ¡}| |d¡tj d¡tj ¡}| ||¡| tjjd¡dS)NrTr)r'Ú    _greenletÚ&get_clocks_used_doing_optional_cleanupZassertGreaterEqualÚenable_optional_cleanupr2Z assertGreaterZCLOCKS_PER_SEC)rÚusedZused2rrrÚassertClocksUsed}s 
 
 zTestLeaks.assertClocksUsedTFc    sbt g¡st‚t ¡t ¡|jtjdd}t     ¡‰t     ¡‰g‰‡fdd„‰g‰‡‡‡‡‡‡fdd„}tj
|d}|  ¡ˆ  d¡t ¡|jt d    d}tˆƒd
ks¬t‚| ˆd j¡ˆdd…=ˆ ¡| d¡~| ¡|jt d    d}|jtjdd}| ||¡ˆsFtj ¡dk    rF| ||¡ˆrF| tjtƒ¡ntj ¡dk    r^| ¡dS) NF)Z
exact_kindcsLtdƒ}tj dtdƒ¡ˆr6t ¡jj}||gƒnt ¡j |g¡dS)NzDELETING STACK OBJECTZtest_leaks_keyzDELETING THREAD STATE)r r'rRZset_thread_localr(r)r*)ZjdÚs)Úexplicit_reference_to_switchrrÚbackground_greenlet¥sþ  z6TestLeaks._check_issue251.<locals>.background_greenletcsRt ˆ¡}ˆ t |j¡¡ˆ |¡| ¡~ˆ ¡ˆ d¡ˆrNt ¡dS)Nr?)    r'rErFrGr)r*r Úwaitr()Zglet)Úbackground_glet_killedÚbackground_glet_runningrYÚbackground_greenletsÚ bg_main_wrefsÚmanually_collect_backgroundrrÚbackground_threadµs
 
 
z4TestLeaks._check_issue251.<locals>.background_threadr=r?Trr)rKZ
is_trackedÚAssertionErrorr rr'r(Z count_objectsr@ÚEventrArBrZÚlistÚlenÚ assertFalseZdeadr rCÚwait_for_pending_cleanupsÚassertLessEqualrRrSr2rrV)    rr_rXZgreenlets_beforer`rDZ lists_beforeZ lists_afterZgreenlets_afterr)r[r\rYr]r^rXr_rÚ_check_issue251†s>   
 
 
  zTestLeaks._check_issue251cCs | ¡dSr ©rhrrrrÚ-test_issue251_killing_cross_thread_leaks_listsz7TestLeaks.test_issue251_killing_cross_thread_leaks_listc    Cs,tj d¡z | ¡W5tj d¡XdS)NFT)r'rRrTrhrrrrÚ#test_issue251_with_cleanup_disableds  z-TestLeaks.test_issue251_with_cleanup_disabledcCs|jdddS)NF©r_rirrrrÚ4test_issue251_issue252_need_to_collect_in_background sz>TestLeaks.test_issue251_issue252_need_to_collect_in_backgroundc    Cs6d|_tj d¡z|jddW5tj d¡XdS)NTFrl)Zexpect_greenlet_leakr'rRrTrhrrrrÚEtest_issue251_issue252_need_to_collect_in_background_cleanup_disabled"s
 zOTestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabledcCs|jddddS)NFT)r_rXrirrrrÚ9test_issue251_issue252_explicit_reference_not_collectable+sþzCTestLeaks.test_issue251_issue252_explicit_reference_not_collectabler.cCsXtjddkr*tjdd…dkr*| d¡tjddkrFtrF| d¡trT| d¡dS)Nrér7)rpézOnly observed on 3.11z!Hard to get a stable pattern herez!Slow and not worth repeating here)r/Ú version_infoZskipTestr    r
rrrrÚ_only_test_some_versions3s  
 
z"TestLeaks._only_test_some_versionscs | ¡dd„‰d‰‡‡fdd„}tdƒD]
}|ƒq*t ¡ ¡j}t|jƒD]@}t|t ¡ ¡jƒ}|ƒt ¡ ¡j}||krN|dkrNqqN| ||¡dS)NcSsdS)NrrrrrrÚfGsz:TestLeaks.test_untracked_memory_doesnt_increase.<locals>.fé'cs tˆƒD]}t ˆ¡ ¡qdSr )r1r'r*)r4©ÚITERrtrrÚrun_itKs z?TestLeaks.test_untracked_memory_doesnt_increase.<locals>.run_itrpr)    rsr1ÚpsutilÚProcessÚmemory_full_infoÚussÚUNTRACK_ATTEMPTSÚmaxrg)rrxr4Ú
uss_beforeÚcountÚ    uss_afterrrvrÚ%test_untracked_memory_doesnt_increase@s z/TestLeaks.test_untracked_memory_doesnt_increasecsP| ¡dg‰‡fdd„‰d‰‡‡fdd„‰|‰G‡‡‡fdd„dƒ}d}}t|jƒD]È}dˆd<|ƒ}tj|d    }| ¡| d
¡| | ¡¡|dkr¤|j    }t
||j    ƒ}ˆrØ|  |j d ¡|  ˆdˆ|j ¡~~ˆsð|  ˆdd¡ˆrü| ¡t ¡ ¡j}||krX|d krXq"qX| ¡t ¡ ¡j}| ||d |f¡dS)Nrcs@zt ¡j ¡Wn(tjk
r:ˆdd7<‚YnXdS)Nrr)r'r(r)r*Z GreenletExitr)Ú
EXIT_COUNTrrrtis z3TestLeaks._check_untracked_memory_thread.<locals>.frucs2g}tˆƒD] }t ˆ¡}| |¡| ¡q |Sr )r1r'rEr*)Úgletsr4r3rvrrrxrs  
 
 
z8TestLeaks._check_untracked_memory_thread.<locals>.run_itcs,eZdZdZZdZdZ‡‡‡fdd„ZdS)z<TestLeaks._check_untracked_memory_thread.<locals>.ThreadFuncrrr7csnt ¡ ¡j|_t|jƒD]}|jtˆƒƒ7_q|jD]}ˆ     dt
|ƒ¡q:ˆrZd|_t ¡ ¡j|_ dS)Nzsuspended activer) ryrzr{r|rr1rwr„ÚtupleZassertInÚstrr)rr4r3©Údeallocate_in_threadrxÚtestrrÚ__call__„s
zETestLeaks._check_untracked_memory_thread.<locals>.ThreadFunc.__call__N)rrrrrr„rwrŠrr‡rrÚ
ThreadFunc€sr‹r=érrzafter attempts %d)rsr1r}r@rArBrCreÚis_aliverr~r2r„rwrfryrzr{r|rg)rrˆr‹rrr€Z thread_funcrDr)rƒrwrˆrtrxr‰rÚ_check_untracked_memory_threadbsB   
 z(TestLeaks._check_untracked_memory_threadcCs|jdddS)NT©rˆ©rŽrrrrÚItest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread³szSTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_threadcCs|jdddS)NFrrrrrrÚGtest_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main¹szQTestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_mainN)TF)T)rrrr5r8Ú staticmethodrJrMrQrVrhrjrkrrmrnror}rsrr‚rŽr‘r’rrrrr"/s6
 
 
 
}
 
 
 
 
Q
r"Ú__main__Zunittest)Ú__doc__Ú
__future__rrrr/rKr:rFr@ryr'ÚrZ    leakcheckrrr    r
r Ú ImportErrorZGREENLET_USE_GCraÚobjectr r"rÚ
__import__ÚmainrrrrÚ<module>s2