[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: LuaJIT FFI __gc metamethod?
- From: Mike Pall <mikelu-1102@...>
- Date: Mon, 28 Feb 2011 17:02:25 +0100
Josh Haberman wrote:
> My use case is that I want to expose a refcounted C structure to Lua via
> the FFI. When Lua no longer needs the structure, I want to unref it
> using a C function.
Good news: you can drop your userdata workarounds now -- I just
added finalizers to cdata objects:
http://luajit.org/ext_ffi_api.html#ffi_gc
Typical usage:
local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)
...
p = nil -- Last reference to p is gone.
-- GC will eventually run finalizer: ffi.C.free(p)
You can also use a Lua function as a finalizer. E.g. for structs
or arrays that need more complex cleanup:
local function delarray(a)
for i=0,9 do if a[i] ~= nil then ffi.C.free(a) end end
end
local function newarray()
return ffi.gc(ffi.new("void *[10]"), delarray)
end
--Mike