Thanks Michael, after you pointed it out it was embarrassingly obvious. The GC follows *table* references; references from another ffi object do not prevent GC. On Fri, May 25, 2012 at 12:59 AM, Michal Kottman <k0mpjut0r@xxxxxxxxx>wrote: > On 24 May 2012 10:01, Richard Hundt <richardhundt@xxxxxxxxx> wrote: > > Just a heads up, it works beautifully :) > > > > However, this is what bit me: you can't keep a reference to a member of > the object returned via ffi.load after the object itself has been garbage > collected. > > > > function loadlib() > > local mylib = assert(ffi.load('mylib')) -- mylib gets GC'ed eventually > > return { some_function = mylib.mylib_some_function } > > end > > > > local l = loadlib() > > l.some_function() -- sooner or later doing this is going to blow up when > mylib above gets collected > > I've been hit by this more than once (forgetting to save a reference). > Basically I have a Lua C function which returns a userdata filled by > some data, which I later ffi.cast() to a more appropriate type in Lua. > The problem was that I never saved the reference to the userdata, > which was then garbage collected. > > The main point to remember: save a reference along with the casted data. > > local points = mylib.calculatePoints() > return { > points_ptr = points, -- keep a reference so it is not garbage collected > points = ffi.cast('Point*', points) > } > > Your case is a similar issue to this one. > >