diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-11 14:08:08 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-11 12:09:07 +0000 |
commit | ecc4f756bdb6175cc0b3b11af2f90884db1c602c (patch) | |
tree | 99d8ca48a72752e1257d4b8b321f41d1767ee020 /epan/wslua/wslua_listener.c | |
parent | 70d06deb2e31bd605e672200a7755764febe94ae (diff) |
Added Reload Lua plugins.
This is initial support for reloading Lua plugins without
restarting the application.
Still todo:
- Deregister FileHandlers
- Support deregister ProtoField with existing abbrev (same_name_hfinfo)
- Add a progress dialog when reloading many plugins
- Search for memory leakages in wslua functions
Change-Id: I48870d8741251705ca15ffe1068613fcb0cb18c1
Reviewed-on: https://code.wireshark.org/review/5028
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'epan/wslua/wslua_listener.c')
-rw-r--r-- | epan/wslua/wslua_listener.c | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/epan/wslua/wslua_listener.c b/epan/wslua/wslua_listener.c index 64ed0610ff..cd4509985a 100644 --- a/epan/wslua/wslua_listener.c +++ b/epan/wslua/wslua_listener.c @@ -183,6 +183,18 @@ static void lua_tap_draw(void *tapdata) { } } +/* TODO: we should probably use a Lua table here */ +static GPtrArray *listeners = NULL; + +static void deregister_Listener (lua_State* L _U_, Listener tap) { + if (tap->all_fields) { + epan_set_always_visible(FALSE); + tap->all_fields = FALSE; + } + + remove_tap_listener(tap); +} + WSLUA_CONSTRUCTOR Listener_new(lua_State* L) { /* Creates a new `Listener` listener object. */ #define WSLUA_OPTARG_Listener_new_TAP 1 /* The name of this tap. */ @@ -231,6 +243,8 @@ WSLUA_CONSTRUCTOR Listener_new(lua_State* L) { epan_set_always_visible(TRUE); } + g_ptr_array_add(listeners, tap); + pushListener(L,tap); WSLUA_RETURN(1); /* The newly created Listener listener object */ } @@ -272,13 +286,10 @@ WSLUA_METHOD Listener_remove(lua_State* L) { /* Removes a tap `Listener`. */ Listener tap = checkListener(L,1); - if (tap->all_fields) { - epan_set_always_visible(FALSE); - tap->all_fields = FALSE; + if (g_ptr_array_remove(listeners, tap)) { + deregister_Listener(L, tap); } - remove_tap_listener(tap); - return 0; } @@ -326,7 +337,16 @@ WSLUA_ATTRIBUTE_FUNC_SETTER(Listener,reset); static int Listener__gc(lua_State* L _U_) { - /* do NOT free Listener, it's never free'd */ + Listener tap = toListener(L, 1); + + if (listeners && g_ptr_array_remove(listeners, tap)) { + deregister_Listener(L, tap); + } + + g_free(tap->filter); + g_free(tap->name); + g_free(tap); + return 0; } @@ -355,11 +375,28 @@ WSLUA_META Listener_meta[] = { int Listener_register(lua_State* L) { wslua_set_tap_enums(L); + + listeners = g_ptr_array_new(); + WSLUA_REGISTER_CLASS(Listener); WSLUA_REGISTER_ATTRIBUTES(Listener); return 0; } +static void deregister_tap_listener (gpointer data, gpointer userdata) { + lua_State *L = (lua_State *) userdata; + Listener tap = (Listener) data; + deregister_Listener(L, tap); +} + +int wslua_deregister_listeners(lua_State* L) { + g_ptr_array_foreach(listeners, deregister_tap_listener, L); + g_ptr_array_free(listeners, FALSE); + listeners = NULL; + + return 0; +} + /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * |