From Jeff Morriss: avoid at least some N^2 behavior when changing the

time stamp format.

svn path=/trunk/; revision=9179
This commit is contained in:
Guy Harris 2003-12-06 04:05:02 +00:00
parent a517aeb953
commit 33b25ac15e
3 changed files with 49 additions and 7 deletions

41
file.c
View File

@ -1,7 +1,7 @@
/* file.c /* file.c
* File I/O routines * File I/O routines
* *
* $Id: file.c,v 1.326 2003/12/04 10:59:33 guy Exp $ * $Id: file.c,v 1.327 2003/12/06 04:05:02 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>
@ -1483,6 +1483,7 @@ change_time_formats(capture_file *cf)
GTimeVal start_time; GTimeVal start_time;
gchar status_str[100]; gchar status_str[100];
int first, last; int first, last;
gboolean sorted_by_frame_column;
/* Are there any columns with time stamps in the "command-line-specified" /* Are there any columns with time stamps in the "command-line-specified"
format? format?
@ -1511,6 +1512,27 @@ change_time_formats(capture_file *cf)
/* Count of packets at which we've looked. */ /* Count of packets at which we've looked. */
count = 0; count = 0;
/* If the rows are currently sorted by the frame column then we know
* the row number of each packet: it's the row number of the previously
* displayed packet + 1.
*
* Otherwise, if the display is sorted by a different column then we have
* to use the O(N) packet_list_find_row_from_data() (thus making the job
* of changing the time display format O(N**2)).
*
* (XXX - In fact it's still O(N**2) because gtk_clist_set_text() takes
* the row number and walks that many elements down the clist to find
* the appropriate element.)
*/
sorted_by_frame_column = FALSE;
for (i = 0; i < cf->cinfo.num_cols; i++) {
if (cf->cinfo.col_fmt[i] == COL_NUMBER)
{
sorted_by_frame_column = (i == packet_list_get_sort_column());
break;
}
}
stop_flag = FALSE; stop_flag = FALSE;
g_get_current_time(&start_time); g_get_current_time(&start_time);
@ -1518,7 +1540,7 @@ change_time_formats(capture_file *cf)
is in a row of the summary list and, if so, whether there are is in a row of the summary list and, if so, whether there are
any columns that show the time in the "command-line-specified" any columns that show the time in the "command-line-specified"
format and, if so, update that row. */ format and, if so, update that row. */
for (fdata = cf->plist; fdata != NULL; fdata = fdata->next) { for (fdata = cf->plist, row = -1; fdata != NULL; fdata = fdata->next) {
/* Update the progress bar, but do it only N_PROGBAR_UPDATES times; /* Update the progress bar, but do it only N_PROGBAR_UPDATES times;
when we update it, we have to run the GTK+ main loop to get it when we update it, we have to run the GTK+ main loop to get it
to repaint what's pending, and doing so may involve an "ioctl()" to repaint what's pending, and doing so may involve an "ioctl()"
@ -1558,7 +1580,20 @@ change_time_formats(capture_file *cf)
count++; count++;
/* Find what row this packet is in. */ /* Find what row this packet is in. */
row = packet_list_find_row_from_data(fdata); if (!sorted_by_frame_column) {
/* This function is O(N), so we try to avoid using it... */
row = packet_list_find_row_from_data(fdata);
} else {
/* ...which we do by maintaining a count of packets that are
being displayed (i.e., that have passed the display filter),
and using the current value of that count as the row number
(which is why we can only do it when the display is sorted
by the frame number). */
if (fdata->flags.passed_dfilter)
row++;
else
continue;
}
if (row != -1) { if (row != -1) {
/* This packet is in the summary list, on row "row". */ /* This packet is in the summary list, on row "row". */

View File

@ -1,7 +1,7 @@
/* packet_list.c /* packet_list.c
* packet list related functions 2002 Olivier Abad * packet list related functions 2002 Olivier Abad
* *
* $Id: packet_list.c,v 1.5 2002/11/15 22:21:15 oabad Exp $ * $Id: packet_list.c,v 1.6 2003/12/06 04:05:02 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>
@ -173,3 +173,10 @@ packet_list_set_selected_row(gint row)
gtk_clist_select_row(GTK_CLIST(packet_list), row, -1); gtk_clist_select_row(GTK_CLIST(packet_list), row, -1);
} }
/* Return the column number that the clist is currently sorted by */
gint
packet_list_get_sort_column(void)
{
return GTK_CLIST(packet_list)->sort_column;
}

View File

@ -1,13 +1,12 @@
/* ui_util.h /* ui_util.h
* Definitions for UI utility routines * Definitions for UI utility routines
* *
* $Id: ui_util.h,v 1.12 2002/09/23 19:09:47 oabad Exp $ * $Id: ui_util.h,v 1.13 2003/12/06 04:05:02 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs * Copyright 1998 Gerald Combs
* *
*
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 * as published by the Free Software Foundation; either version 2
@ -49,6 +48,7 @@ void packet_list_set_text(gint, gint, const gchar *);
void packet_list_set_cls_time_width(gint); void packet_list_set_cls_time_width(gint);
gpointer packet_list_get_row_data(gint); gpointer packet_list_get_row_data(gint);
void packet_list_set_selected_row(gint); void packet_list_set_selected_row(gint);
gint packet_list_get_sort_column(void);
/* create byte views in the main window */ /* create byte views in the main window */
void add_main_byte_views(epan_dissect_t *edt); void add_main_byte_views(epan_dissect_t *edt);