diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gc/weakrefs.nim | 48 | ||||
-rw-r--r-- | tests/specials.nim | 2 |
2 files changed, 49 insertions, 1 deletions
diff --git a/tests/gc/weakrefs.nim b/tests/gc/weakrefs.nim new file mode 100644 index 000000000..3b12d7998 --- /dev/null +++ b/tests/gc/weakrefs.nim @@ -0,0 +1,48 @@ +discard """ + output: "true" +""" + +import intsets + +type + TMyObject = object + id: int + StrongObject = ref TMyObject + WeakObject = object + id: int + data: ptr TMyObject + +var + gid: int # for id generation + valid = initIntSet() + +proc finalizer(x: StrongObject) = + valid.excl(x.id) + +proc create: StrongObject = + new(result, finalizer) + result.id = gid + valid.incl(gid) + inc gid + +proc register(s: StrongObject): WeakObject = + result.data = cast[ptr TMyObject](s) + result.id = s.id + +proc access(w: WeakObject): StrongObject = + ## returns nil if the object doesn't exist anymore + if valid.contains(w.id): + result = cast[StrongObject](w.data) + +proc main = + var s: seq[WeakObject] + newSeq(s, 10_000) + for i in 0 .. s.high: + s[i] = register(create()) + # test that we have at least 80% unreachable weak objects by now: + var unreachable = 0 + for i in 0 .. s.high: + if access(s[i]) == nil: inc unreachable + echo unreachable > 8_000 + +main() diff --git a/tests/specials.nim b/tests/specials.nim index 7e1a58d78..f0f471c02 100644 --- a/tests/specials.nim +++ b/tests/specials.nim @@ -131,7 +131,7 @@ proc runGcTests(r: var TResults, options: string) = test "gctest" # disabled for now as it somehow runs very slowly ('delete' bug?) but works: test "gcleak3" - + test "weakrefs" # ------------------------- threading tests ----------------------------------- |