|
@@ -0,0 +1,83 @@
|
|
|
+-- $Id: gengc.lua $
|
|
|
+-- See Copyright Notice in file all.lua
|
|
|
+
|
|
|
+print('testing generational garbage collection')
|
|
|
+
|
|
|
+local debug = require"debug"
|
|
|
+
|
|
|
+assert(collectgarbage("isrunning"))
|
|
|
+
|
|
|
+collectgarbage()
|
|
|
+
|
|
|
+local oldmode = collectgarbage("generational")
|
|
|
+
|
|
|
+
|
|
|
+-- ensure that table barrier evolves correctly
|
|
|
+do
|
|
|
+ local U = {}
|
|
|
+ -- full collection makes 'U' old
|
|
|
+ collectgarbage()
|
|
|
+ assert(not T or T.gcage(U) == "old")
|
|
|
+
|
|
|
+ -- U refers to a new table, so it becomes 'touched1'
|
|
|
+ U[1] = {x = {234}}
|
|
|
+ assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new"))
|
|
|
+
|
|
|
+ -- both U and the table survive one more collection
|
|
|
+ collectgarbage("step", 0)
|
|
|
+ assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival"))
|
|
|
+
|
|
|
+ -- both U and the table survive yet another collection
|
|
|
+ -- now everything is old
|
|
|
+ collectgarbage("step", 0)
|
|
|
+ assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1"))
|
|
|
+
|
|
|
+ -- data was not corrupted
|
|
|
+ assert(U[1].x[1] == 234)
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+if T == nil then
|
|
|
+ (Message or print)('\n >>> testC not active: \z
|
|
|
+ skipping some generational tests <<<\n')
|
|
|
+ print 'OK'
|
|
|
+ return
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+-- ensure that userdata barrier evolves correctly
|
|
|
+do
|
|
|
+ local U = T.newuserdata(0, 1)
|
|
|
+ -- full collection makes 'U' old
|
|
|
+ collectgarbage()
|
|
|
+ assert(T.gcage(U) == "old")
|
|
|
+
|
|
|
+ -- U refers to a new table, so it becomes 'touched1'
|
|
|
+ debug.setuservalue(U, {x = {234}})
|
|
|
+ assert(T.gcage(U) == "touched1" and
|
|
|
+ T.gcage(debug.getuservalue(U)) == "new")
|
|
|
+
|
|
|
+ -- both U and the table survive one more collection
|
|
|
+ collectgarbage("step", 0)
|
|
|
+ assert(T.gcage(U) == "touched2" and
|
|
|
+ T.gcage(debug.getuservalue(U)) == "survival")
|
|
|
+
|
|
|
+ -- both U and the table survive yet another collection
|
|
|
+ -- now everything is old
|
|
|
+ collectgarbage("step", 0)
|
|
|
+ assert(T.gcage(U) == "old" and
|
|
|
+ T.gcage(debug.getuservalue(U)) == "old1")
|
|
|
+
|
|
|
+ -- data was not corrupted
|
|
|
+ assert(debug.getuservalue(U).x[1] == 234)
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+-- just to make sure
|
|
|
+assert(collectgarbage'isrunning')
|
|
|
+
|
|
|
+collectgarbage(oldmode)
|
|
|
+
|
|
|
+print('OK')
|
|
|
+
|