From 5a875c12a195f9436b0574023020a448db7573f0 Mon Sep 17 00:00:00 2001 From: "Robert G. Jakabosky" Date: Tue, 29 Mar 2011 07:37:56 -0700 Subject: [PATCH] Fixed bug with destroying & creating 0MQ sockets quickly. --- src/pre_generated-zmq.nobj.c | 42 ++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/pre_generated-zmq.nobj.c b/src/pre_generated-zmq.nobj.c index 9b74bfa..0a8bf88 100644 --- a/src/pre_generated-zmq.nobj.c +++ b/src/pre_generated-zmq.nobj.c @@ -165,7 +165,7 @@ typedef struct ffi_export_symbol { #define obj_type_ZMQ_Socket_check(L, _index) \ obj_udata_luacheck(L, _index, &(obj_type_ZMQ_Socket)) #define obj_type_ZMQ_Socket_delete(L, _index, flags) \ - obj_udata_luadelete(L, _index, &(obj_type_ZMQ_Socket), flags) + obj_udata_luadelete_weak(L, _index, &(obj_type_ZMQ_Socket), flags) #define obj_type_ZMQ_Socket_push(L, obj, flags) \ obj_udata_luapush_weak(L, (void *)obj, &(obj_type_ZMQ_Socket), flags) @@ -181,7 +181,7 @@ typedef struct ffi_export_symbol { #define obj_type_ZMQ_Ctx_check(L, _index) \ obj_udata_luacheck(L, _index, &(obj_type_ZMQ_Ctx)) #define obj_type_ZMQ_Ctx_delete(L, _index, flags) \ - obj_udata_luadelete(L, _index, &(obj_type_ZMQ_Ctx), flags) + obj_udata_luadelete_weak(L, _index, &(obj_type_ZMQ_Ctx), flags) #define obj_type_ZMQ_Ctx_push(L, obj, flags) \ obj_udata_luapush_weak(L, (void *)obj, &(obj_type_ZMQ_Ctx), flags) @@ -331,6 +331,26 @@ static FUNC_UNUSED void obj_udata_luapush(lua_State *L, void *obj, obj_type *typ lua_setmetatable(L, -2); } +static FUNC_UNUSED void *obj_udata_luadelete_weak(lua_State *L, int _index, obj_type *type, int *flags) { + void *obj; + obj_udata *ud = obj_udata_luacheck_internal(L, _index, &(obj), type); + *flags = ud->flags; + /* null userdata. */ + ud->obj = NULL; + ud->flags = 0; + /* clear the metatable to invalidate userdata. */ + lua_pushnil(L); + lua_setmetatable(L, _index); + /* get objects weak table. */ + lua_pushlightuserdata(L, obj_udata_weak_ref_key); + lua_rawget(L, LUA_REGISTRYINDEX); /* weak ref table. */ + /* remove object from weak table. */ + lua_pushlightuserdata(L, obj); + lua_pushnil(L); + lua_rawset(L, -3); + return obj; +} + static FUNC_UNUSED void obj_udata_luapush_weak(lua_State *L, void *obj, obj_type *type, int flags) { obj_udata *ud; @@ -767,6 +787,20 @@ static const char zmq_ffi_lua_code[] = "-- try loading luajit's ffi\n" " return ud_obj\n" "end\n" "\n" +"local function obj_udata_luadelete_weak(ud_obj, type_mt)\n" +" local ud = obj_udata_luacheck_internal(ud_obj, type_mt)\n" +" local obj, flags = ud.obj, ud.flags\n" +" -- null userdata.\n" +" ud.obj = nil\n" +" ud.flags = 0\n" +" -- invalid userdata, by setting the metatable to nil.\n" +" d_setmetatable(ud_obj, nil)\n" +" -- remove object from weak ref. table.\n" +" local obj_key = tonumber(ffi.cast('uintptr_t', obj))\n" +" weak_objects[obj_key] = nil\n" +" return obj, flags\n" +"end\n" +"\n" "local function obj_udata_luapush_weak(obj, type_mt, obj_type, flags)\n" " if obj == nil then return end\n" "\n" @@ -965,7 +999,7 @@ static const char zmq_ffi_lua_code[] = "-- try loading luajit's ffi\n" "\n" "local function obj_type_ZMQ_Socket_delete(ud_obj)\n" " ZMQ_Socket_objects[ud_obj] = nil\n" -" return obj_udata_luadelete(ud_obj, ZMQ_Socket_mt)\n" +" return obj_udata_luadelete_weak(ud_obj, ZMQ_Socket_mt)\n" "end\n" "\n" "local function obj_type_ZMQ_Socket_push(c_obj, flags)\n" @@ -1024,7 +1058,7 @@ static const char zmq_ffi_lua_code[] = "-- try loading luajit's ffi\n" "\n" "local function obj_type_ZMQ_Ctx_delete(ud_obj)\n" " ZMQ_Ctx_objects[ud_obj] = nil\n" -" return obj_udata_luadelete(ud_obj, ZMQ_Ctx_mt)\n" +" return obj_udata_luadelete_weak(ud_obj, ZMQ_Ctx_mt)\n" "end\n" "\n" "local function obj_type_ZMQ_Ctx_push(c_obj, flags)\n"