Skip to content

Commit a9007d7

Browse files
committed
0 leaks allowed, skip on ft
1 parent f0ede3d commit a9007d7

1 file changed

Lines changed: 34 additions & 19 deletions

File tree

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,50 @@
1-
from multidict import MultiDict, istr
1+
import gc
22
import sys
3+
import sysconfig
4+
5+
from multidict import MultiDict, istr
6+
7+
# sys.getrefcount is not meaningful under the free-threaded build:
8+
# refcounts are biased per-thread and types may be immortalized, so
9+
# the simple baseline/after comparison below does not apply.
10+
FREETHREADED = bool(sysconfig.get_config_var("Py_GIL_DISABLED"))
311

4-
md = MultiDict([("a", "1"), ("b", "2")])
512

613
if __name__ == "__main__":
7-
# XXX: Code Coverage misbehaves so do this instead
8-
it = iter(md.keys())
9-
iter_type = type(it)
10-
del it
14+
if FREETHREADED:
15+
raise SystemExit(0)
16+
17+
md = MultiDict([("a", "1"), ("b", "2")])
18+
19+
# Iterator type leak
20+
iter_type = type(iter(md.keys()))
21+
gc.collect()
1122
baseline = sys.getrefcount(iter_type)
1223
for _ in range(1000):
13-
it = iter(md.keys())
14-
list(it)
15-
del it
24+
_it = iter(md.keys())
25+
list(_it)
26+
del _it
27+
gc.collect()
1628
after = sys.getrefcount(iter_type)
29+
assert after == baseline, f"iterator type leaked: {after - baseline}"
1730

18-
# NOTE: On Freethreaded Mode this value can be negative
19-
assert (after - baseline) <= 0, "iterator type leaked"
20-
21-
# Test view type leak
31+
# View type leak
2232
view_type = type(md.keys())
33+
gc.collect()
2334
baseline = sys.getrefcount(view_type)
2435
for _ in range(1000):
25-
v = md.keys()
26-
del v
36+
_v = md.keys()
37+
del _v
38+
gc.collect()
2739
after = sys.getrefcount(view_type)
28-
assert (after - baseline) <= 0, "view type leaked"
40+
assert after == baseline, f"view type leaked: {after - baseline}"
2941

42+
# istr type leak
43+
gc.collect()
3044
baseline = sys.getrefcount(istr)
3145
for _ in range(1000):
32-
s = istr("hello")
33-
del s
46+
_s = istr("hello")
47+
del _s
48+
gc.collect()
3449
after = sys.getrefcount(istr)
35-
assert (after - baseline) <= 0, "istr type leaked"
50+
assert after == baseline, f"istr type leaked: {after - baseline}"

0 commit comments

Comments
 (0)