|
1 | | -from multidict import MultiDict, istr |
| 1 | +import gc |
2 | 2 | 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")) |
3 | 11 |
|
4 | | -md = MultiDict([("a", "1"), ("b", "2")]) |
5 | 12 |
|
6 | 13 | 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() |
11 | 22 | baseline = sys.getrefcount(iter_type) |
12 | 23 | 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() |
16 | 28 | after = sys.getrefcount(iter_type) |
| 29 | + assert after == baseline, f"iterator type leaked: {after - baseline}" |
17 | 30 |
|
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 |
22 | 32 | view_type = type(md.keys()) |
| 33 | + gc.collect() |
23 | 34 | baseline = sys.getrefcount(view_type) |
24 | 35 | for _ in range(1000): |
25 | | - v = md.keys() |
26 | | - del v |
| 36 | + _v = md.keys() |
| 37 | + del _v |
| 38 | + gc.collect() |
27 | 39 | after = sys.getrefcount(view_type) |
28 | | - assert (after - baseline) <= 0, "view type leaked" |
| 40 | + assert after == baseline, f"view type leaked: {after - baseline}" |
29 | 41 |
|
| 42 | + # istr type leak |
| 43 | + gc.collect() |
30 | 44 | baseline = sys.getrefcount(istr) |
31 | 45 | for _ in range(1000): |
32 | | - s = istr("hello") |
33 | | - del s |
| 46 | + _s = istr("hello") |
| 47 | + del _s |
| 48 | + gc.collect() |
34 | 49 | 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