diff --git a/binding/lua/pbc-lua.c b/binding/lua/pbc-lua.c index 894e74f..0857bf0 100644 --- a/binding/lua/pbc-lua.c +++ b/binding/lua/pbc-lua.c @@ -1029,6 +1029,31 @@ _clear_gcobj(lua_State *L) { return 0; } +//kibernet +//手动调用该方法清除userdata的内存 +static int +_clear_gcobj_manual(lua_State *L) { + struct gcobj * obj = (struct gcobj *)lua_touserdata(L,1); + int i; + for (i=0;isize_pat;i++) { + pbc_pattern_delete(obj->pat[i]); + } + for (i=0;isize_msg;i++) { + pbc_rmessage_delete(obj->msg[i]); + } + free(obj->pat); + free(obj->msg); + + obj->size_pat = 0; + obj->cap_pat = 4; + obj->size_msg = 0; + obj->cap_msg = 4; + obj->pat = (struct pbc_pattern **)malloc(obj->cap_pat * sizeof(struct pbc_pattern *)); + obj->msg = (struct pbc_rmessage **)malloc(obj->cap_msg * sizeof(struct pbc_rmessage *)); + + return 0; +} + static int _gc(lua_State *L) { struct gcobj * obj = (struct gcobj *)lua_newuserdata(L,sizeof(*obj)); @@ -1113,6 +1138,7 @@ luaopen_protobuf_c(lua_State *L) { {"_last_error", _last_error }, {"_decode", _decode }, {"_gc", _gc }, + {"_clear_gcobj_manual", _clear_gcobj_manual }, {"_add_pattern", _add_pattern }, {"_add_rmessage", _add_rmessage }, {"_env_enum_id", _env_enum_id}, diff --git a/binding/lua/protobuf.lua b/binding/lua/protobuf.lua index b4aa8ab..05ca8a3 100644 --- a/binding/lua/protobuf.lua +++ b/binding/lua/protobuf.lua @@ -584,4 +584,8 @@ function extract(tbl) end end +function clear_gc_manual( ) + c._clear_gcobj_manual(GC) +end + default=set_default diff --git a/binding/lua53/pbc-lua53.c b/binding/lua53/pbc-lua53.c index 6514e8c..2342594 100644 --- a/binding/lua53/pbc-lua53.c +++ b/binding/lua53/pbc-lua53.c @@ -823,6 +823,31 @@ _clear_gcobj(lua_State *L) { return 0; } +//kibernet +//手动调用该方法清除userdata的内存 +static int +_clear_gcobj_manual(lua_State *L) { + struct gcobj * obj = (struct gcobj *)lua_touserdata(L,1); + int i; + for (i=0;isize_pat;i++) { + pbc_pattern_delete(obj->pat[i]); + } + for (i=0;isize_msg;i++) { + pbc_rmessage_delete(obj->msg[i]); + } + free(obj->pat); + free(obj->msg); + + obj->size_pat = 0; + obj->cap_pat = 4; + obj->size_msg = 0; + obj->cap_msg = 4; + obj->pat = (struct pbc_pattern **)malloc(obj->cap_pat * sizeof(struct pbc_pattern *)); + obj->msg = (struct pbc_rmessage **)malloc(obj->cap_msg * sizeof(struct pbc_rmessage *)); + + return 0; +} + static int _gc(lua_State *L) { struct gcobj * obj; @@ -897,6 +922,7 @@ luaopen_protobuf_c(lua_State *L) { {"_last_error", _last_error }, {"_decode", _decode }, {"_gc", _gc }, + {"_clear_gcobj_manual", _clear_gcobj_manual }, {"_add_pattern", _add_pattern }, {"_add_rmessage", _add_rmessage }, {"_env_enum_id", _env_enum_id}, diff --git a/binding/lua53/protobuf.lua b/binding/lua53/protobuf.lua index ba2373e..dfd5a4c 100644 --- a/binding/lua53/protobuf.lua +++ b/binding/lua53/protobuf.lua @@ -526,6 +526,10 @@ function M.extract(tbl) end end +function clear_gc_manual( ) + c._clear_gcobj_manual(GC) +end + M.default=set_default return M