kr_zonecut_deinit(&engine->resolver.root_hints);
kr_cache_close(&engine->resolver.cache);
lru_deinit(engine->resolver.cache_rtt);
+ free(engine->resolver.cache_rtt);
lru_deinit(engine->resolver.cache_rep);
+ free(engine->resolver.cache_rep);
/* Unload modules. */
for (size_t i = 0; i < engine->modules.len; ++i) {
static int l_ffi_deinit(struct kr_module *module)
{
- lua_State *L = l_ffi_preface(module, "deinit");
- if (!L) {
- return 0;
+ /* Deinit the module in Lua (if possible) */
+ int ret = 0;
+ lua_State *L = module->lib;
+ if (l_ffi_preface(module, "deinit")) {
+ ret = l_ffi_call(L, 1);
}
- int ret = l_ffi_call(L, 1);
/* Free the layer API wrapper */
lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t)module->data);
- lua_getfield(L, -1, "_layercdata");
+ lua_getfield(L, -1, "_layer_capi");
free(lua_touserdata(L, -1));
lua_pop(L, 2);
/* Unref module and unset 'lib', so the module
/* Create FFI module with trampolined functions. */
memset(module, 0, sizeof(*module));
module->name = strdup(name);
- REGISTER_FFI_CALL(L, module->init, "init", &l_ffi_init);
- REGISTER_FFI_CALL(L, module->deinit, "deinit", &l_ffi_deinit);
+ module->init = &l_ffi_init;
+ module->deinit = &l_ffi_deinit;
REGISTER_FFI_CALL(L, module->layer, "layer", &l_ffi_layer);
module->data = (void *)(intptr_t)luaL_ref(L, LUA_REGISTRYINDEX);
module->lib = L;