views:

148

answers:

2
+2  Q: 

lua userdata gc

Is it possible for a piece of lua user data to hold reference to a lua object? (Like a table, or another piece of user data?). Basically, what I want to know is:

Can I create a piece of userdata in such a way taht when the gc runs, the user data can say: "Hey! I'm holding references to these other objects, mark them as well."

Thanks!

EDIT: responding to lhf:

Suppose I have:

struct Vertex {
  double x, y, z;
}

struct Quaternion {
  double w, x, y, z;
}

Now, I can do:

struct Foo {
  Vertex v;
  Quaternion q;
}

but suppose instead I want:

struct Bar {
  Vertex *v;
  Quaternion *q;
}

[i.e. suppose Vertex & Quaternion are really big pieces of userdata].

Now, suppose I have a lua user function that takes a userdata Vertex, and a userdata Quaternion, and creates a userdata Bar (I d9n't want a userdata Foo since I want to save the space) -- then I need somehow for the userdata Vertex*/Quaternion* to not be gc-ed.

A: 

Been a while since I did anything with lua. I think that if the data referenced was created by the lua machine, then it will clean it up itself. Otherwise you must wait for the gc callback in your C code and free the memory yourself.

Duracell
+2  A: 

Is it possible for a piece of lua user data to hold reference to a lua object?

No. A userdata can't hold a pointer to another Lua object. If you want to use a userdata to keep another Lua object alive, you have to do it using weak tables. Roberto's book as a section on how to do it.

Norman Ramsey
anon
You put the userdata in the table along with the Lua value(s) that you're trying to keep alive. Roberto's book is online and explains it all.
Norman Ramsey
Why would I use a weak table instead of a strong table then?
anon
Because when the GC runs, if the weak table is the only reference, your userdata will be collected, and it will then stop keeping other objects alive.
Norman Ramsey
The clarification needed is then: Keep a mapping from userdata to 'other objects', with weak storage of the mapping keys.
kaizer.se