Infinite loop with Singleton mixin

A

Adam Gardner

This loops inifitely, but it doesn't seem like it should.

--
require 'singleton'

class SingleThing
include Singleton
def initialize
@a = OtherThing.new
end
end

class OtherThing
def initialize
@single_ref = SingleThing.instance
end
end

a = SingleThing.instance

---

It looks as if the the SingleThing.instance method doesn't start
returning the allocated instance until initialize has *finished*, but it
seems to me it should start returning the allocated instance as soon as
initialize *starts*. Otherwise, methods called during initialize (and
the methods they call, and so on) can't refer back to the singleton
object using SingleThing.instance.

Any thoughts?
 
A

Adam Gardner

Yukihiro said:
Hi,

In message "Re: Infinite loop with Singleton mixin"
on Wed, 25 Feb 2009 13:45:41 +0900, Adam Gardner

|This loops inifitely, but it doesn't seem like it should.

Uninitialized singleton object should not be disclosed, I think. So I
think it should loop infinitely, as you specified.

matz.

Personally, I disagree. I think both consistency and utility would be
better served by having .instance return the instance as soon as
initialize has started - after all, there are plenty of other ways to
get references to objects which haven't finished their initialize
function, and they don't cause undue trouble. But I can understand why
it might need to be the way it is. I'll try and work around it.

Incidentally, it turns out the code above isn't looping the way I
thought it was; it's actually stuck inside the while loop in
singleton.rb:148-152

while false.equal?(@__instance__)
Thread.critical = false
sleep(0.08) # timeout
Thread.critical = true
end

Which, itself, suggests a work-around:

----
require 'singleton'

class SingleThing
include Singleton
def initialize
self.class.instance_variable_set:)@__instance__,self)
@a = OtherThing.new
end
end

class OtherThing
def initialize
@single_ref = SingleThing.instance
end
end

a = SingleThing.instance
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top