[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: using light userdata to keep full userdata alive?
- From: Norman Ramsey <nr@...>
- Date: Tue, 08 Jan 2008 20:32:02 -0500
> On 1/8/08, Norman Ramsey <nr@eecs.harvard.edu> wrote:
> > The only way I can think of to do this is to use a weak table
> > in which both keys and values are weak and the light userdata is the key,
> > the heavy userdata is the value. Is this the correct approach?
> > Are there other possible approaches?
>
> i guess it should be weak keys and strong values
OK, I'm still trying to figure out why. The explanation of weak
tables in section 2.10.2 is not precise enough for me to understand.
Mabye somebody can tell me if the following description is correct?
1. If a value v appears as a key in a table with weak keys or as a
value in a table with weak values, we call those appearances
'weak references'.
2. All other appearances (as a key or value in a table without the
weakness property listed above, as a local variable of a live
chunk, as a formal parameter of a live function, or as a value on
the Lua stack) are 'strong references'.
3. If there are no strong references to a value, it can be
garbage-collected.
4. When a value v is garbage collected, if it appears as a key or a
value in a table, the relevent key-value pair is removed from the
table.
So in the scenario I imagine, I have a light userdata L and a heavy
userdata H. I want to guarantee
If there is a strong reference to L, there is a strong reference to H.
So now I think I understand why I want a table with with weak keys L
and strong values H. If there is a strong reference to L, H stays
alive. If not, L is collected and in the process the strong reference
to H disappears.
Thanks for letting me think out loud, everybody.
Norman