Forum: Ruby Infinite loop with Singleton mixin

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Adam G. (Guest)
on 2009-02-25 06:46
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?
Yukihiro M. (Guest)
on 2009-02-25 09:03
(Received via mailing list)
Hi,

In message "Re: Infinite loop with Singleton mixin"
    on Wed, 25 Feb 2009 13:45:41 +0900, Adam G.
<removed_email_address@domain.invalid> writes:

|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.
Adam G. (Guest)
on 2009-02-25 19:38
Yukihiro M. wrote:
> Hi,
>
> In message "Re: Infinite loop with Singleton mixin"
>     on Wed, 25 Feb 2009 13:45:41 +0900, Adam G.
> <removed_email_address@domain.invalid> writes:
>
> |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
----

Anyway, thanks for your attention, and thank you for your hard work on
Ruby.
This topic is locked and can not be replied to.