From Kovarththanan Rajaratnam:

Precompile custom columns filters.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3767

svn path=/trunk/; revision=29174
This commit is contained in:
Anders Broman 2009-07-23 05:48:39 +00:00
parent 1e7878b53d
commit ded297677f
5 changed files with 25 additions and 9 deletions

View File

@ -61,6 +61,7 @@ col_setup(column_info *cinfo, gint num_cols)
cinfo->col_last = g_new(int, NUM_COL_FMTS);
cinfo->col_title = g_new(gchar*, num_cols);
cinfo->col_custom_field = g_new(gchar*, num_cols);
cinfo->col_custom_dfilter = g_new(dfilter_t*, num_cols);
cinfo->col_data = (const gchar **)g_new(gchar*, num_cols);
cinfo->col_buf = g_new(gchar*, num_cols);
cinfo->col_fence = g_new(int, num_cols);
@ -287,7 +288,8 @@ col_custom_set_fstr(header_field_info *hfinfo, const gchar *format, ...)
for (i = ci->col_first[COL_CUSTOM];
i <= ci->col_last[COL_CUSTOM]; i++) {
if (ci->fmt_matx[i][COL_CUSTOM] &&
strcmp(ci->col_custom_field[i], hfinfo->abbrev) == 0) {
ci->col_custom_field[i] &&
strcmp(ci->col_custom_field[i], hfinfo->abbrev) == 0) {
ci->col_data[i] = ci->col_buf[i];
g_vsnprintf(ci->col_buf[i], COL_MAX_LEN, format, ap);
@ -313,7 +315,6 @@ void
col_custom_prime_edt(epan_dissect_t *edt, column_info *cinfo)
{
int i;
dfilter_t *dfilter_code;
ci = cinfo; /* Save this into the static variable ci for use by
* col_custom_set_fstr() later. */
@ -324,12 +325,8 @@ col_custom_prime_edt(epan_dissect_t *edt, column_info *cinfo)
for (i = cinfo->col_first[COL_CUSTOM];
i <= cinfo->col_last[COL_CUSTOM]; i++) {
if (cinfo->fmt_matx[i][COL_CUSTOM] &&
strlen(cinfo->col_custom_field[i]) > 0) {
if(dfilter_compile(cinfo->col_custom_field[i], &dfilter_code)) {
epan_dissect_prime_dfilter(edt, dfilter_code);
dfilter_free(dfilter_code);
}
}
cinfo->col_custom_dfilter[i])
epan_dissect_prime_dfilter(edt, cinfo->col_custom_dfilter[i]);
}
}

View File

@ -668,8 +668,15 @@ build_column_format_array(column_info *cinfo, gboolean reset_fences)
cinfo->col_title[i] = g_strdup(get_column_title(i));
if (cinfo->col_fmt[i] == COL_CUSTOM) {
cinfo->col_custom_field[i] = g_strdup(get_column_custom_field(i));
if(!dfilter_compile(cinfo->col_custom_field[i], &cinfo->col_custom_dfilter[i])) {
/* XXX: Should we issue a warning? */
g_free(cinfo->col_custom_field[i]);
cinfo->col_custom_field[i] = NULL;
cinfo->col_custom_dfilter[i] = NULL;
}
} else {
cinfo->col_custom_field[i] = NULL;
cinfo->col_custom_dfilter[i] = NULL;
}
cinfo->fmt_matx[i] = (gboolean *) g_malloc0(sizeof(gboolean) *
NUM_COL_FMTS);

View File

@ -27,6 +27,9 @@
#include <glib.h>
/* Forward declaration (epan/dfilter/dfilter.h) */
typedef struct _dfilter_t dfilter_t;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@ -47,6 +50,7 @@ typedef struct _column_info {
gint *col_last; /* Last column number with a given format */
gchar **col_title; /* Column titles */
gchar **col_custom_field; /* Custom column field */
dfilter_t **col_custom_dfilter; /* Compiled custom column field */
const gchar **col_data; /* Column data */
gchar **col_buf; /* Buffer into which to copy data for column */
int *col_fence; /* Stuff in column buffer before this index is immutable */

View File

@ -729,7 +729,8 @@ proto_registrar_get_byname(const char *field_name)
header_field_info* hfinfo;
prefix_initializer_t pi;
DISSECTOR_ASSERT(field_name != NULL);
if (!field_name)
return NULL;
hfinfo = g_tree_lookup(gpa_name_tree, field_name);

View File

@ -1420,8 +1420,15 @@ main(int argc, char *argv[])
cfile.cinfo.col_title[i] = g_strdup(get_column_title(i));
if (cfile.cinfo.col_fmt[i] == COL_CUSTOM) {
cfile.cinfo.col_custom_field[i] = g_strdup(get_column_custom_field(i));
if(!dfilter_compile(cfile.cinfo.col_custom_field[i], &cfile.cinfo.col_custom_dfilter[i])) {
/* XXX: Should we issue a warning? */
g_free(cfile.cinfo.col_custom_field[i]);
cfile.cinfo.col_custom_field[i] = NULL;
cfile.cinfo.col_custom_dfilter[i] = NULL;
}
} else {
cfile.cinfo.col_custom_field[i] = NULL;
cfile.cinfo.col_custom_dfilter[i] = NULL;
}
cfile.cinfo.fmt_matx[i] = (gboolean *) g_malloc0(sizeof(gboolean) *
NUM_COL_FMTS);