[英]luajit ffi implementing a chunk finalizer
我正在將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
BTW CURL定義為typedef void CURL;
我確定我嘗試做的方法還不夠干凈。 有什么建議嗎?
尤里卡! :自我解答-如果有任何明顯的問題,仍然對評論感興趣。
編譯luajit時間類型必須是structs
(或unions
,如果你初始化上下文類型為指針,我認為),它不再是一個struct
。 因此,這里存在概念不匹配的情況。 因此,要解決問題,請在您的struct
添加一個void *
,在該struct
上懸掛該元metatype
,然后將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();
或者您可以像這樣在返回的指針上注冊終結器:
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.