c_extensions/c_marking.rb

tests/_examples/c_extensions/c_marking.rb in the metorex repository.

# A C extension whose wrapped structs are freed when nothing reaches them
# any more: not Ruby, not the mark function of a struct something reaches,
# and not an address C registered. What is left is freed as the program ends.
require "tmpdir"
require_relative "build_helper"

directory = Dir.mktmpdir
require(build_extension("c_marking.c", "c_marking", directory))

chain = CMarking.node(1, CMarking.node(2, nil))
lone = CMarking.node(3, nil)
lone = nil
CMarking.plain
GC.start
p(CMarking.freed)

chain = nil
GC.start
p(CMarking.freed.sort)

CMarking.pin(CMarking.node(4, nil))
kept = CMarking.node(5, nil)
GC.start
p(CMarking.freed.sort)

CMarking.stop_recording
FileUtils.rm_rf(directory)

Output:

[3]
[1, 2, 3]
[1, 2, 3]
freed 4 as the program ended
freed 5 as the program ended