[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Prevent userdata from being marked for garbage collection?
 
- From: Carsten Fuchs <carsten.fuchs@...>
 
- Date: Thu, 05 Jul 2012 23:26:09 +0200
 
Hi Roberto,
Am 2012-07-05 18:30, schrieb Roberto Ierusalimschy:
No. 'obj' is still "alive" both as a upvalue for the sentinel's
finalizer and in the ephemeron. While a finalizer can access an object,
the object cannot be collected.  (However, if 'obj' had its own
finalizer, it would run in the first collection cycle after 'obj' became
not directly accessible.).
Many thanks for all the details!
I experimented a lot with your sample code, and I tried follow all its paths. However, 
right now I'm a bit more confused than less. As I'd really like to fully understand 
this, please let me ask again:
In the Lua 5.1 code, after
    mksentinel(myobject)
    myobject = nil
the myobject and the sentinel are referring to each other (sentinel is a value of 
myobject, and myobject is an upvalue of the sentinel's __gc metamethod), but the garbage 
collectors next "mark phase" would see them as an unreachable island and thus leave them 
both "white".
(Or does that sentinel's upvalue reference cause one last time the myobject to become 
black?)
In the "cleaning phase", the sentinel with its __gc metamethod is put into the tmudata 
list. (If myobject had a __gc (in 5.2), it would be, too -- and gone for good.)
According to PiL2, chapter 31.2, the sentinel is also marked as alive / "black".
(I guess this is done to exclude it from the subsequent "sweep phase"?)
Is here the magic? Does the last step propagate from the userdata and thus also cause 
the referred myobject to become alive again?
The "sweep phase" by observation does not remove the myobject, and the "finalization 
phase" calls the __gc metamethod of the sentinel, creating a new sentinel for myobject 
for the next garbage collection cycle.
Where is my mistake?
Best regards,
Carsten
--
   Cafu - the open-source Game and Graphics Engine
for multiplayer, cross-platform, real-time 3D Action
          Learn more at http://www.cafu.de