summaryrefslogtreecommitdiff
path: root/epan
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2016-01-10 18:07:24 +0100
committerAnders Broman <a.broman58@gmail.com>2016-01-13 07:38:25 +0000
commit5539dba1df313816491bb28718433d4d81162aa3 (patch)
treec799faf7ef86de5dbcf8c248f43b93b119c801e5 /epan
parentc8a1f9d46ef3cb05f18bba07816ff9f5f6a5d53e (diff)
downloadwireshark-5539dba1df313816491bb28718433d4d81162aa3.tar.gz
Do not apply color rule filter every dissection
Introduce a frame_data flag "need_colorize" to indicate that coloring rules need to be evaluated and set it for the GUI (not tshark). This restores the original performance characteristics. It additionally fixes a regression where the color filter name and filter is not shown anymore in the tree (I guess it is related to the edt->tree being NULL when re-selected, resulting in empty color_filter). Remaining problems: - Display filter cannot contain frame.coloring_rule.* fields. Code is present to enable this, but then a method is needed to avoid an expensive second calculation (which is why it is disabled). - The columns are still not updated after coloring rule change. - The two frame.coloring_rule fields in the tree are not updated when the coloring rule is changed (e.g. Ctrl-1). The last two issues were supposed to be fixed by the previous patch, but there is probably some missing code... Tested with GTK and Qt. Bug: 11980 Change-Id: I3ef7713b28db242e178d20f6a5f333374718b52e Reviewed-on: https://code.wireshark.org/review/13170 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/file-file.c11
-rw-r--r--epan/dissectors/packet-frame.c12
-rw-r--r--epan/frame_data.h1
3 files changed, 17 insertions, 7 deletions
diff --git a/epan/dissectors/file-file.c b/epan/dissectors/file-file.c
index e61d4310bf..0c092edbda 100644
--- a/epan/dissectors/file-file.c
+++ b/epan/dissectors/file-file.c
@@ -298,9 +298,14 @@ dissect_file_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
ENDTRY;
}
- /* XXX optimize this so it doesn't need to scan the second time */
- color_filter = color_filters_colorize_packet(file_data->color_edt);
-
+ /* Attempt to (re-)calculate color filters (if any). */
+ if (pinfo->fd->flags.need_colorize) {
+ color_filter = color_filters_colorize_packet(file_data->color_edt);
+ pinfo->fd->color_filter = color_filter;
+ pinfo->fd->flags.need_colorize = 0;
+ } else {
+ color_filter = pinfo->fd->color_filter;
+ }
if (color_filter) {
pinfo->fd->color_filter = color_filter;
item = proto_tree_add_string(fh_tree, hf_file_color_filter_name, tvb,
diff --git a/epan/dissectors/packet-frame.c b/epan/dissectors/packet-frame.c
index 2cec2d50fa..83e6c963f9 100644
--- a/epan/dissectors/packet-frame.c
+++ b/epan/dissectors/packet-frame.c
@@ -616,11 +616,15 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void*
ENDTRY;
}
- /* XXX optimize this so it doesn't need to scan the second time */
- color_filter = color_filters_colorize_packet(fr_data->color_edt);
-
- if (color_filter) {
+ /* Attempt to (re-)calculate color filters (if any). */
+ if (pinfo->fd->flags.need_colorize) {
+ color_filter = color_filters_colorize_packet(fr_data->color_edt);
pinfo->fd->color_filter = color_filter;
+ pinfo->fd->flags.need_colorize = 0;
+ } else {
+ color_filter = pinfo->fd->color_filter;
+ }
+ if (color_filter) {
item = proto_tree_add_string(fh_tree, hf_frame_color_filter_name, tvb,
0, 0, color_filter->filter_name);
PROTO_ITEM_SET_GENERATED(item);
diff --git a/epan/frame_data.h b/epan/frame_data.h
index ef859d9818..6dec802645 100644
--- a/epan/frame_data.h
+++ b/epan/frame_data.h
@@ -84,6 +84,7 @@ typedef struct _frame_data {
unsigned int has_ts : 1; /**< 1 = has time stamp, 0 = no time stamp */
unsigned int has_phdr_comment : 1; /** 1 = there's comment for this packet */
unsigned int has_user_comment : 1; /** 1 = user set (also deleted) comment for this packet */
+ unsigned int need_colorize : 1; /**< 1 = need to (re-)calculate packet color */
} flags;
gint16 tsprec; /**< Time stamp precision */