On 23 abr, 20:49, Robert Klemme <shortcut... / googlemail.com> wrote:
>
> Maybe you leak only under certain conditions.  Dunno how complex your
> code in parse is but this seems to be an option.  Maybe you can print
> more along with the cache's id so as to get an idea in which cases you
> don't see finalization.

I'll do that.

One thing which is puzzling me in the meantime is why GC doesn't seem
to work in the following example:

# start example

def finalizer(thing)
  puts "setting up finalizer for #{thing}"
  lambda { puts "finalizer for #{thing}" }
end

def meth
  foo = "hello, world!"
  ObjectSpace.define_finalizer(foo, finalizer(foo.object_id))
end

puts "about to call meth"
meth
puts "did call meth"

puts "about to start GC"
GC.start
puts "did start GC"
def finalizer(thing)
  puts "setting up finalizer for #{thing}"
  lambda { puts "finalizer for #{thing}" }
end

def meth
  foo = "hello, world!"
  ObjectSpace.define_finalizer(foo, finalizer(foo.object_id))
end

puts "about to call meth"
meth
puts "did call meth"

puts "about to start GC"
GC.start
puts "did start GC"

# end example

On my system the output:

about to call meth
setting up finalizer for 1005330
did call meth
about to start GC
did start GC
finalizer for 1005330

I would have thought that the explicit GC would cause foo's finalizer
to be called immediately, but no, it only gets called just before the
process exits.

This isn't the only case in which GC doesn't perform as I would
expect... As another example, the WeakRef code listing on page 732 of
the Pickaxe doesn't work either. It's supposed to print:

Initial object is fol de rol
Weak reference is fol de rol
prog.rb:8: Illegal Reference - probably recycled (WeakRef::RefError)

But for me it prints:

Initial object is fol de rol
Weak reference is fol de rol
Initial object is fol de rol

So either something is awry with the listing, with my understanding of
GC, or with my local Ruby install (1.8.6 on Mac OS X 10.4.9).

Cheers,
Wincent