luajit ffi, реализующий финализатор чанков - PullRequest
1 голос
/ 22 февраля 2012

Я работаю над переносом libcurl в luajit ffi.Мой финализатор не получил вызов.

local ffi = require("ffi")

ffi.cdef [[
  typedef struct{} CURL;
  CURL * curl_easy_init();
  void curl_easy_cleanup(CURL *);
]]

local CURL_lib = ffi.load("../lib/libcurl.so")
local CURL_CTX

local CURL_CTX_mt = {
  __gc = function()  print "finalizing"; CURL_lib.curl_easy_cleanup(CURL_CTX); end
}

ffi.metatype("CURL", CURL_CTX_mt)

CURL_CTX = ffi.new("CURL[1]")
CURL_CTX = CURL_lib.curl_easy_init();
print "done"

Что мне здесь не хватает?: D

Кстати, CURL определяется как typedef void CURL; Я уверен, что способ, которым я пытаюсь это сделать, не достаточно чист.Любой совет ?

Эврика!: self answer - все еще интересуются комментариями, если есть какие-либо явные проблемы.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Типы времени компиляции в luajit должны быть structs (или unions, я думаю), если вы инициализируете свой тип контекста как указатель, он больше не является struct.Таким образом, здесь происходит несоответствие концепции.Итак, чтобы исправить ситуацию, добавьте void * к вашему struct, повесьте metatype на struct и используйте void * для контекста библиотеки.

local ffi = require("ffi")

ffi.cdef [[
  typedef struct { void * ctx; } curl;
  curl * curl_easy_init();
  void curl_easy_cleanup(curl *);
]]

local curl_lib = ffi.load("../lib/libcurl.so")
local curl

local curl_mt = {
  __gc = function()  curl_lib.curl_easy_cleanup(curl.ctx); end
}

local curl_proto = ffi.metatype("curl", curl_mt)

curl = curl_proto(nil)
curl.ctx = curl_lib.curl_easy_init();
1 голос
/ 29 января 2014

Или Вы можете просто зарегистрировать финализатор на возвращенном указателе следующим образом:

local ffi = require("ffi")

ffi.cdef [[
    typedef struct{} CURL;
    CURL * curl_easy_init();
    void curl_easy_cleanup(CURL *);
]]

local CURL_lib = ffi.load("../lib/libcurl.so")

local function curl_pointer_finalizer(pointer)
    print "finalizing"
    CURL_lib.curl_easy_cleanup(pointer)
end

local function curl_easy_init()
    return ffi.gc(CURL_lib.curl_easy_init(), curl_pointer_finalizer)
end

local CURL_CTX = curl_easy_init() -- wrapper func
print "done"
...