簡體   English   中英

luajit ffi實現塊終結器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM