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 <mmann78@netscape.net>
This commit is contained in:
Michael Mann 2017-02-07 20:18:33 -05:00
parent 243c09fa06
commit 89dfa6bdf4
16 changed files with 58 additions and 104 deletions

View File

@ -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();

View File

@ -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);
}
/*

View File

@ -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
*

View File

@ -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
*

View File

@ -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 */

View File

@ -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;
}
/*

View File

@ -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;
}
/*

View File

@ -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__ */

View File

@ -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;
}
/*

View File

@ -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__ */

View File

@ -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;
}

View File

@ -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__ */

View File

@ -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 {

View File

@ -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__

View File

@ -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 {

View File

@ -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__