From a6fbb0097d8142163261fd3083ca391fd178048d Mon Sep 17 00:00:00 2001 From: kibernet Date: Thu, 24 Aug 2017 11:22:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gc=E7=9A=84=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binding/lua/pbc-lua.c | 26 ++++++++++++++++++++++++++ binding/lua/protobuf.lua | 4 ++++ binding/lua53/pbc-lua53.c | 26 ++++++++++++++++++++++++++ binding/lua53/protobuf.lua | 4 ++++ 4 files changed, 60 insertions(+) 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