From 89dfa6bdf4051bc0f7ae64925814d811a37c628a Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Tue, 7 Feb 2017 20:18:33 -0500 Subject: [PATCH] Switch rtd and srt tables to use wmem_tree_t instead of (sorted) GSList. Change-Id: I54fec10801eb8f359414f34bf705767964c9725e Reviewed-on: https://code.wireshark.org/review/20017 Reviewed-by: Michael Mann --- epan/epan.c | 1 - epan/rtd_table.c | 41 +++++----------------- epan/rtd_table.h | 3 +- epan/srt_table.c | 47 +++++--------------------- epan/srt_table.h | 7 ++-- ui/cli/tap-rtd.c | 7 ++-- ui/cli/tap-srt.c | 9 ++--- ui/cli/tshark-tap.h | 4 +-- ui/gtk/response_time_delay_table.c | 5 +-- ui/gtk/response_time_delay_table.h | 7 ++-- ui/gtk/service_response_time_table.c | 7 ++-- ui/gtk/service_response_time_table.h | 5 +-- ui/qt/response_time_delay_dialog.cpp | 5 +-- ui/qt/response_time_delay_dialog.h | 2 +- ui/qt/service_response_time_dialog.cpp | 5 +-- ui/qt/service_response_time_dialog.h | 7 ++-- 16 files changed, 58 insertions(+), 104 deletions(-) diff --git a/epan/epan.c b/epan/epan.c index b79769b24e..06f78cfcfd 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -226,7 +226,6 @@ epan_cleanup(void) stat_tap_table_cleanup(); follow_cleanup(); disabled_protos_cleanup(); - cleanup_srt_table(); stats_tree_cleanup(); #ifdef HAVE_LUA wslua_cleanup(); diff --git a/epan/rtd_table.c b/epan/rtd_table.c index d8cc80f3fe..595c616c33 100644 --- a/epan/rtd_table.c +++ b/epan/rtd_table.c @@ -66,16 +66,7 @@ const value_string* get_rtd_value_string(register_rtd_t* rtd) return rtd->vs_type; } -static GSList *registered_rtd_tables = NULL; - -static gint -insert_sorted_by_table_name(gconstpointer aparam, gconstpointer bparam) -{ - const register_rtd_t *a = (const register_rtd_t *)aparam; - const register_rtd_t *b = (const register_rtd_t *)bparam; - - return g_ascii_strcasecmp(proto_get_protocol_short_name(find_protocol_by_id(a->proto_id)), proto_get_protocol_short_name(find_protocol_by_id(b->proto_id))); -} +static wmem_tree_t *registered_rtd_tables = NULL; void register_rtd_table(const int proto_id, const char* tap_listener, guint num_tables, guint num_timestats, const value_string* vs_type, @@ -84,7 +75,7 @@ register_rtd_table(const int proto_id, const char* tap_listener, guint num_table register_rtd_t *table; DISSECTOR_ASSERT(rtd_packet_func); - table = g_new(register_rtd_t,1); + table = wmem_new(wmem_epan_scope(), register_rtd_t); table->proto_id = proto_id; if (tap_listener != NULL) @@ -97,7 +88,10 @@ register_rtd_table(const int proto_id, const char* tap_listener, guint num_table table->vs_type = vs_type; table->filter_check = filter_check_cb; - registered_rtd_tables = g_slist_insert_sorted(registered_rtd_tables, table, insert_sorted_by_table_name); + if (registered_rtd_tables == NULL) + registered_rtd_tables = wmem_tree_new(wmem_epan_scope()); + + wmem_tree_insert_string(registered_rtd_tables, wmem_strdup(wmem_epan_scope(), proto_get_protocol_filter_name(proto_id)), table, 0); } void free_rtd_table(rtd_stat_table* table, rtd_gui_free_cb gui_callback, void *callback_data) @@ -130,26 +124,9 @@ void reset_rtd_table(rtd_stat_table* table, rtd_gui_reset_cb gui_callback, void } -static gint -find_matching_rtd(gconstpointer arg1, gconstpointer arg2) -{ - register_rtd_t *rtd = (register_rtd_t*)arg1; - const gchar *name = (const gchar *)arg2; - - return strcmp(proto_get_protocol_filter_name(rtd->proto_id), name); -} - register_rtd_t* get_rtd_table_by_name(const char* name) { - GSList *found_rtd; - - found_rtd = g_slist_find_custom(registered_rtd_tables, - (gpointer)name, find_matching_rtd); - - if (found_rtd) - return (register_rtd_t*)found_rtd->data; - - return NULL; + return (register_rtd_t*)wmem_tree_lookup_string(registered_rtd_tables, name, 0); } gchar* rtd_table_get_tap_string(register_rtd_t* rtd) @@ -197,9 +174,9 @@ void rtd_table_dissector_init(register_rtd_t* rtd, rtd_stat_table* table, rtd_gu gui_callback(table, callback_data); } -void rtd_table_iterate_tables(GFunc func, gpointer user_data) +void rtd_table_iterate_tables(wmem_foreach_func func, gpointer user_data) { - g_slist_foreach(registered_rtd_tables, func, user_data); + wmem_tree_foreach(registered_rtd_tables, func, user_data); } /* diff --git a/epan/rtd_table.h b/epan/rtd_table.h index 5706326587..3385ccac98 100644 --- a/epan/rtd_table.h +++ b/epan/rtd_table.h @@ -27,6 +27,7 @@ #include "tap.h" #include "timestats.h" #include "value_string.h" +#include "wmem/wmem.h" #ifdef __cplusplus extern "C" { @@ -142,7 +143,7 @@ WS_DLL_PUBLIC void reset_rtd_table(rtd_stat_table* table, rtd_gui_reset_cb gui_c * @param func action to be performed on all converation tables * @param user_data any data needed to help perform function */ -WS_DLL_PUBLIC void rtd_table_iterate_tables(GFunc func, gpointer user_data); +WS_DLL_PUBLIC void rtd_table_iterate_tables(wmem_foreach_func func, gpointer user_data); /** Return filter used for register_tap_listener * diff --git a/epan/srt_table.c b/epan/srt_table.c index f4da2811b1..c838ef7c1a 100644 --- a/epan/srt_table.c +++ b/epan/srt_table.c @@ -137,28 +137,11 @@ void reset_srt_table(GArray* srt_array, srt_gui_reset_cb gui_callback, void *cal } } -static GSList *registered_srt_tables = NULL; - -static gint -find_matching_srt(gconstpointer arg1, gconstpointer arg2) -{ - register_srt_t *srt = (register_srt_t*)arg1; - const gchar *name = (const gchar *)arg2; - - return strcmp(proto_get_protocol_filter_name(srt->proto_id), name); -} +static wmem_tree_t *registered_srt_tables = NULL; register_srt_t* get_srt_table_by_name(const char* name) { - GSList *found_srt; - - found_srt = g_slist_find_custom(registered_srt_tables, - (gpointer)name, find_matching_srt); - - if (found_srt) - return (register_srt_t*)found_srt->data; - - return NULL; + return (register_srt_t*)wmem_tree_lookup_string(registered_srt_tables, name, 0); } gchar* srt_table_get_tap_string(register_srt_t* srt) @@ -202,15 +185,6 @@ void srt_table_dissector_init(register_srt_t* srt, GArray* srt_array, srt_gui_in srt->srt_init(srt, srt_array, gui_callback, callback_data); } -static gint -insert_sorted_by_table_name(gconstpointer aparam, gconstpointer bparam) -{ - const register_srt_t *a = (const register_srt_t *)aparam; - const register_srt_t *b = (const register_srt_t *)bparam; - - return g_ascii_strcasecmp(proto_get_protocol_short_name(find_protocol_by_id(a->proto_id)), proto_get_protocol_short_name(find_protocol_by_id(b->proto_id))); -} - void register_srt_table(const int proto_id, const char* tap_listener, int max_tables, tap_packet_cb srt_packet_func, srt_init_cb init_cb, srt_param_handler_cb param_cb) { @@ -218,7 +192,7 @@ register_srt_table(const int proto_id, const char* tap_listener, int max_tables, DISSECTOR_ASSERT(init_cb); DISSECTOR_ASSERT(srt_packet_func); - table = g_new(register_srt_t,1); + table = wmem_new(wmem_epan_scope(), register_srt_t); table->proto_id = proto_id; if (tap_listener != NULL) @@ -231,12 +205,15 @@ register_srt_table(const int proto_id, const char* tap_listener, int max_tables, table->param_cb = param_cb; table->param_data = NULL; - registered_srt_tables = g_slist_insert_sorted(registered_srt_tables, table, insert_sorted_by_table_name); + if (registered_srt_tables == NULL) + registered_srt_tables = wmem_tree_new(wmem_epan_scope()); + + wmem_tree_insert_string(registered_srt_tables, wmem_strdup(wmem_epan_scope(), proto_get_protocol_filter_name(proto_id)), table, 0); } -void srt_table_iterate_tables(GFunc func, gpointer user_data) +void srt_table_iterate_tables(wmem_foreach_func func, gpointer user_data) { - g_slist_foreach(registered_srt_tables, func, user_data); + wmem_tree_foreach(registered_srt_tables, func, user_data); } srt_stat_table* @@ -309,12 +286,6 @@ add_srt_table_data(srt_stat_table *rst, int indx, const nstime_t *req_time, pack time_stat_update(&rp->stats, &delta, pinfo); } -void -cleanup_srt_table(void) -{ - g_slist_free_full(registered_srt_tables, g_free); -} - /* * Editor modelines * diff --git a/epan/srt_table.h b/epan/srt_table.h index 9cd6e154ec..ac508fb759 100644 --- a/epan/srt_table.h +++ b/epan/srt_table.h @@ -25,6 +25,7 @@ #include "tap.h" #include "timestats.h" +#include "wmem/wmem.h" #ifdef __cplusplus extern "C" { @@ -159,7 +160,7 @@ WS_DLL_PUBLIC void reset_srt_table(GArray* srt_array, srt_gui_reset_cb gui_callb * @param func action to be performed on all converation tables * @param user_data any data needed to help perform function */ -WS_DLL_PUBLIC void srt_table_iterate_tables(GFunc func, gpointer user_data); +WS_DLL_PUBLIC void srt_table_iterate_tables(wmem_foreach_func func, gpointer user_data); /** Return filter used for register_tap_listener * @@ -220,10 +221,6 @@ WS_DLL_PUBLIC void init_srt_table_row(srt_stat_table *rst, int proc_index, const */ WS_DLL_PUBLIC void add_srt_table_data(srt_stat_table *rst, int proc_index, const nstime_t *req_time, packet_info *pinfo); -/** Clean internal structures - */ -extern void cleanup_srt_table(void); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/ui/cli/tap-rtd.c b/ui/cli/tap-rtd.c index 2e43286b62..ee3c0a64e5 100644 --- a/ui/cli/tap-rtd.c +++ b/ui/cli/tap-rtd.c @@ -141,10 +141,10 @@ dissector_rtd_init(const char *opt_arg, void* userdata) } /* Set GUI fields for register_rtd list */ -void -register_rtd_tables(gpointer data, gpointer user_data _U_) +gboolean +register_rtd_tables(const void *key _U_, void *value, void *userdata _U_) { - register_rtd_t *rtd = (register_rtd_t*)data; + register_rtd_t *rtd = (register_rtd_t*)value; stat_tap_ui ui_info; ui_info.group = REGISTER_STAT_GROUP_RESPONSE_TIME; @@ -154,6 +154,7 @@ register_rtd_tables(gpointer data, gpointer user_data _U_) ui_info.nparams = 0; ui_info.params = NULL; register_stat_tap_ui(&ui_info, rtd); + return FALSE; } /* diff --git a/ui/cli/tap-srt.c b/ui/cli/tap-srt.c index 32fde53594..11286c5dfb 100644 --- a/ui/cli/tap-srt.c +++ b/ui/cli/tap-srt.c @@ -161,17 +161,17 @@ dissector_srt_init(const char *opt_arg, void* userdata) } /* Set GUI fields for register_srt list */ -void -register_srt_tables(gpointer data, gpointer user_data _U_) +gboolean +register_srt_tables(const void *key _U_, void *value, void *userdata _U_) { - register_srt_t *srt = (register_srt_t*)data; + register_srt_t *srt = (register_srt_t*)value; const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt))); stat_tap_ui ui_info; /* XXX - CAMEL dissector hasn't been converted over due seemingly different tap packet handling functions. So let the existing TShark CAMEL tap keep its registration */ if (strcmp(short_name, "CAMEL") == 0) - return; + return FALSE; ui_info.group = REGISTER_STAT_GROUP_RESPONSE_TIME; ui_info.title = NULL; /* construct this from the protocol info? */ @@ -180,6 +180,7 @@ register_srt_tables(gpointer data, gpointer user_data _U_) ui_info.nparams = 0; ui_info.params = NULL; register_stat_tap_ui(&ui_info, srt); + return FALSE; } /* diff --git a/ui/cli/tshark-tap.h b/ui/cli/tshark-tap.h index d3f8d0179c..7dc2a98746 100644 --- a/ui/cli/tshark-tap.h +++ b/ui/cli/tshark-tap.h @@ -26,8 +26,8 @@ extern void init_iousers(struct register_ct* ct, const char *filter); extern void init_hostlists(struct register_ct* ct, const char *filter); -extern void register_srt_tables(gpointer data, gpointer user_data); -extern void register_rtd_tables(gpointer data, gpointer user_data); +extern gboolean register_srt_tables(const void *key, void *value, void *userdata); +extern gboolean register_rtd_tables(const void *key, void *value, void *userdata); extern void register_simple_stat_tables(gpointer data, gpointer user_data); #endif /* __TSHARK_TAP_H__ */ diff --git a/ui/gtk/response_time_delay_table.c b/ui/gtk/response_time_delay_table.c index 3ee0ffff22..e7d8b94ca4 100644 --- a/ui/gtk/response_time_delay_table.c +++ b/ui/gtk/response_time_delay_table.c @@ -362,9 +362,9 @@ static tap_param rtd_stat_params[] = { { PARAM_FILTER, "filter", "Filter", NULL, TRUE } }; -void register_response_time_delay_tables(gpointer data, gpointer user_data _U_) +gboolean register_response_time_delay_tables(const void *key _U_, void *value, void *userdata _U_) { - register_rtd_t* rtd = (register_rtd_t*)data; + register_rtd_t* rtd = (register_rtd_t*)value; const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd))); tap_param_dlg* rtd_dlg; @@ -380,6 +380,7 @@ void register_response_time_delay_tables(gpointer data, gpointer user_data _U_) rtd_dlg->user_data = rtd; /* TODO: Actually use this */ register_param_stat(rtd_dlg, short_name, REGISTER_STAT_GROUP_RESPONSE_TIME); + return FALSE; } /* diff --git a/ui/gtk/response_time_delay_table.h b/ui/gtk/response_time_delay_table.h index 11cf0b328d..bd178796cd 100644 --- a/ui/gtk/response_time_delay_table.h +++ b/ui/gtk/response_time_delay_table.h @@ -34,9 +34,10 @@ /** Register function to register dissectors that support RTD for GTK. * - * @param data register_rtd_t* representing dissetor RTD table - * @param user_data is unused + * @param key is unused + * @param value register_rtd_t* representing dissetor RTD table + * @param userdata is unused */ -void register_response_time_delay_tables(gpointer data, gpointer user_data); +gboolean register_response_time_delay_tables(const void *key, void *value, void *userdata); #endif /* __RESPONSE_TIME_DELAY_TABLE_H__ */ diff --git a/ui/gtk/service_response_time_table.c b/ui/gtk/service_response_time_table.c index 31a083d35a..590c01a2c7 100644 --- a/ui/gtk/service_response_time_table.c +++ b/ui/gtk/service_response_time_table.c @@ -838,9 +838,9 @@ static tap_param scsi_stat_params[] = { }; -void register_service_response_tables(gpointer data, gpointer user_data _U_) +gboolean register_service_response_tables(const void *key _U_, void *value, void *userdata _U_) { - register_srt_t *srt = (register_srt_t*)data; + register_srt_t *srt = (register_srt_t*)value; const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt))); tap_param_dlg* srt_dlg; @@ -848,7 +848,7 @@ void register_service_response_tables(gpointer data, gpointer user_data _U_) tap data. Let those specific dialogs register for themselves */ if ((strcmp(short_name, "RPC") == 0) || (strcmp(short_name, "DCERPC") == 0)) - return; + return FALSE; srt_dlg = g_new(tap_param_dlg, 1); @@ -869,6 +869,7 @@ void register_service_response_tables(gpointer data, gpointer user_data _U_) } register_param_stat(srt_dlg, short_name, REGISTER_STAT_GROUP_RESPONSE_TIME); + return FALSE; } diff --git a/ui/gtk/service_response_time_table.h b/ui/gtk/service_response_time_table.h index c30ee72fec..7aeaf08b3b 100644 --- a/ui/gtk/service_response_time_table.h +++ b/ui/gtk/service_response_time_table.h @@ -95,9 +95,10 @@ void reset_table_data(srt_stat_table* rst, void* gui_data); /** Register function to register dissectors that support SRT for GTK. * + * @param key is unused * @param data register_srt_t* representing dissetor SRT table - * @param user_data is unused + * @param userdata is unused */ -void register_service_response_tables(gpointer data, gpointer user_data); +gboolean register_service_response_tables(const void *key, void *value, void *userdata); #endif /* __SERVICE_RESPONSE_TIME_TABLE_H__ */ diff --git a/ui/qt/response_time_delay_dialog.cpp b/ui/qt/response_time_delay_dialog.cpp index 53a5d257d8..25f6deee78 100644 --- a/ui/qt/response_time_delay_dialog.cpp +++ b/ui/qt/response_time_delay_dialog.cpp @@ -48,9 +48,9 @@ rtd_init(const char *args, void*) { } } -void register_response_time_delay_tables(gpointer data, gpointer) +gboolean register_response_time_delay_tables(const void *, void *value, void*) { - register_rtd_t *rtd = (register_rtd_t*)data; + register_rtd_t *rtd = (register_rtd_t*)value; const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd))); const char *cfg_abbr = rtd_table_get_tap_string(rtd); @@ -61,6 +61,7 @@ void register_response_time_delay_tables(gpointer data, gpointer) REGISTER_STAT_GROUP_RESPONSE_TIME, rtd_init, ResponseTimeDelayDialog::createRtdDialog); + return FALSE; } enum { diff --git a/ui/qt/response_time_delay_dialog.h b/ui/qt/response_time_delay_dialog.h index 0e5c6e56be..22d64027a2 100644 --- a/ui/qt/response_time_delay_dialog.h +++ b/ui/qt/response_time_delay_dialog.h @@ -60,6 +60,6 @@ private slots: * @param data register_rtd_t* representing dissetor RTD table * @param user_data is unused */ -void register_response_time_delay_tables(gpointer data, gpointer user_data); +gboolean register_response_time_delay_tables(const void *key, void *value, void *userdata); #endif // __RESPONSE_TIME_DELAY_DIALOG_H__ diff --git a/ui/qt/service_response_time_dialog.cpp b/ui/qt/service_response_time_dialog.cpp index 0e89ef2044..6fbc279438 100644 --- a/ui/qt/service_response_time_dialog.cpp +++ b/ui/qt/service_response_time_dialog.cpp @@ -50,9 +50,9 @@ srt_init(const char *args, void*) { } } -void register_service_response_tables(gpointer data, gpointer) +gboolean register_service_response_tables(const void *, void *value, void*) { - register_srt_t *srt = (register_srt_t*)data; + register_srt_t *srt = (register_srt_t*)value; const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt))); const char *cfg_abbr = srt_table_get_tap_string(srt); tpdCreator tpd_creator = ServiceResponseTimeDialog::createSrtDialog; @@ -74,6 +74,7 @@ void register_service_response_tables(gpointer data, gpointer) REGISTER_STAT_GROUP_RESPONSE_TIME, srt_init, tpd_creator); + return FALSE; } enum { diff --git a/ui/qt/service_response_time_dialog.h b/ui/qt/service_response_time_dialog.h index b30a3e5e97..9722141d87 100644 --- a/ui/qt/service_response_time_dialog.h +++ b/ui/qt/service_response_time_dialog.h @@ -67,10 +67,11 @@ private slots: /** Register function to register dissectors that support SRT. * - * @param data register_srt_t* representing dissetor SRT table - * @param user_data is unused + * @param key is unused + * @param value register_srt_t* representing dissetor SRT table + * @param userdata is unused */ -void register_service_response_tables(gpointer data, gpointer user_data); +gboolean register_service_response_tables(const void *key, void *value, void *userdata); #endif // __SERVICE_RESPONSE_TIME_DIALOG_H__