2012-02-22 2 views
1

Я работаю над wraping libcurl в luajit ffi. Мой финализатор не вызван.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

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

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

+0

, если вы обнаружите ответ самостоятельно, вы должны опубликовать его в качестве действительного ответа и принять его. – Necrolis

+0

aah Я думал, что нужно ждать таймаута, прежде чем можно будет ответить самим автоответчиком. Благодарю. Ах, вы не можете принять свой собственный ответ в течение 2 дней. –

ответ

3

типов во время компиляции в 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

Или Вы можете просто зарегистрироваться финализациями на возвращенном указателе, как это:

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"