Hello Rubyists:
Does Ruby’s GC treat a class variable (@@x) as ‘global scope’ or as
‘local scope’?
Here is my situation:
I have a class variable that holds instances of ‘self’. These objects
are not referenced any where else; these objects are retrieved using
its id which is stored else where. It is my understanding that
Ruby’s GC doesn’t see these stored id as a reference to the
objects (since id -> Fixnum).
I don’t want these objects to be garbage collected as long as its
instance is referred the class variable. Please note that the objects
are not referenced by other class’s objects.
Example:
class Test
@@x = []
def initialize()
# among other thing …
@@x.push(self) if not @@x.include?(self)
end
def kill_self()
# among other things
@@x.delete(self)
end
end
class TestFactory
@store = []
def getATest()
procObj = Proc.new do |id|
@store.delete(id)
end
t = Test.new()
@store.push(t.__id__)
ObjectSpace.define_finalizer(t, procObj)
return t.__id__
end
def releaseTest(id)
_id2Obj(id).kill_self() # <— retrieves Obj from id
end
end
testF = TestFactory.new()
id = testF.getATest()
…
…
I don’t want ‘t’ to be garbage collected here. GC.disable is not an
option
…
…
testF.releaseTest(id)
END
Questions:
(1) Will ‘t’ be garbage collected since the only reference to ‘t’ is
in @@x, which could go out of scope?
(2) Is my understanding ‘scope’ correct?
Any help will be greatly appreciated.
Thanks,
-Madan.
Hi,
In message “Re: Question on GC”
on Fri, 19 May 2006 22:58:28 +0900, “Madan M.”
[email protected] writes:
|Does Ruby’s GC treat a class variable (@@x) as ‘global scope’ or as
|‘local scope’?
Global, in a sense you use.
|(1) Will ‘t’ be garbage collected since the only reference to ‘t’ is
|in @@x, which could go out of scope?
No, class variables remain as it is, even after its scope ended.
|(2) Is my understanding ‘scope’ correct?
It’s called ‘extent’ in GC field. Class variables have limited scope
and infinite extent.
matz.
Nobu:
The procObj does not refer to object ‘t’. procObj is attached as a
finalizer to object ‘t’. If the object reference to ‘t’ is not stored
in the class variable, object ‘t’ will be marked (or should I say
un-marked) for garbage collection.
Please correct me if I am wrong, or if I am missing the obvious (like
the reference to object ‘t’ in procObj, which I cant see).
Thanks,
Madan.
Hi,
At Fri, 19 May 2006 22:58:28 +0900,
Madan M. wrote in [ruby-talk:193553]:
end
Note that procObj also refers t, so this object will never get
collected.
procObj = @store.method(:delete).to_proc
is an alternative.
On May 19, 2006, at 11:24 AM, Madan M. wrote:
t = Test.new()
is an alternative.
The procObj does not refer to object ‘t’.
Even the you don’t refer to t by name, procObj’s environment knows
about t.
Please correct me if I am wrong, or if I am missing the obvious (like
the reference to object ‘t’ in procObj, which I cant see).
You can’t see them, but they are there. It is a feature of Ruby.
$ cat x.rb
def x
p = proc { eval(‘p t’) }
t = 5
return p
end
x.call
$ ruby x.rb
5
–
Eric H. - [email protected] - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant
http://trackmap.robotcoop.com