From 33b25ac15eac2e2cb4269377c41eada622c81fc1 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sat, 6 Dec 2003 04:05:02 +0000 Subject: [PATCH] From Jeff Morriss: avoid at least some N^2 behavior when changing the time stamp format. svn path=/trunk/; revision=9179 --- file.c | 41 ++++++++++++++++++++++++++++++++++++++--- gtk/packet_list.c | 9 ++++++++- ui_util.h | 6 +++--- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/file.c b/file.c index fef4ed5c50..75d119d5c0 100644 --- a/file.c +++ b/file.c @@ -1,7 +1,7 @@ /* file.c * 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 * By Gerald Combs @@ -1483,6 +1483,7 @@ change_time_formats(capture_file *cf) GTimeVal start_time; gchar status_str[100]; int first, last; + gboolean sorted_by_frame_column; /* Are there any columns with time stamps in the "command-line-specified" format? @@ -1511,6 +1512,27 @@ change_time_formats(capture_file *cf) /* Count of packets at which we've looked. */ 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; 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 any columns that show the time in the "command-line-specified" 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; 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()" @@ -1558,7 +1580,20 @@ change_time_formats(capture_file *cf) count++; /* 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) { /* This packet is in the summary list, on row "row". */ diff --git a/gtk/packet_list.c b/gtk/packet_list.c index 76aced0d78..a38251de05 100644 --- a/gtk/packet_list.c +++ b/gtk/packet_list.c @@ -1,7 +1,7 @@ /* packet_list.c * 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 * By Gerald Combs @@ -173,3 +173,10 @@ packet_list_set_selected_row(gint row) 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; +} diff --git a/ui_util.h b/ui_util.h index 38e8838a24..2d7809ee6d 100644 --- a/ui_util.h +++ b/ui_util.h @@ -1,13 +1,12 @@ /* ui_util.h * 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 - * By Gerald Combs + * By Gerald Combs * Copyright 1998 Gerald Combs * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * 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); gpointer packet_list_get_row_data(gint); void packet_list_set_selected_row(gint); +gint packet_list_get_sort_column(void); /* create byte views in the main window */ void add_main_byte_views(epan_dissect_t *edt);