summaryrefslogtreecommitdiff
path: root/epan/proto.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-10-12 17:57:51 +0000
committerEvan Huus <eapache@gmail.com>2013-10-12 17:57:51 +0000
commit540e9c745de9925170fc03af496cb9c2ef84bf26 (patch)
treeb1451fd0ee0175e655ab255f6585438926cd48c3 /epan/proto.c
parentd19a20746bf8b64f892ba0191b142c47767bd1ef (diff)
downloadwireshark-540e9c745de9925170fc03af496cb9c2ef84bf26.tar.gz
Use wmem_free_all on the tree pool rather than freeing each node, label and
field_info separately. We still have to walk the tree in order to free certain fvalues, but that's not a big deal. Another ~11% speed-up running "tshark -nVr" on a large capture. svn path=/trunk/; revision=52569
Diffstat (limited to 'epan/proto.c')
-rw-r--r--epan/proto.c20
1 files changed, 3 insertions, 17 deletions
diff --git a/epan/proto.c b/epan/proto.c
index 2e1b6c5611..21364bea24 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -565,13 +565,6 @@ free_node_tree_data(tree_data_t *tree_data)
g_free(tree_data);
}
-#define FREE_NODE_FIELD_INFO(finfo) \
- if (finfo->rep) { \
- ITEM_LABEL_FREE(finfo->rep); \
- } \
- FVALUE_CLEANUP(&finfo->value); \
- FIELD_INFO_FREE(finfo);
-
static void
proto_tree_free_node(proto_node *node, gpointer data _U_)
{
@@ -579,12 +572,7 @@ proto_tree_free_node(proto_node *node, gpointer data _U_)
proto_tree_children_foreach(node, proto_tree_free_node, NULL);
- /* free the field_info data. */
- FREE_NODE_FIELD_INFO(finfo);
- node->finfo = NULL;
-
- /* Free the proto_node. */
- PROTO_NODE_FREE(node);
+ FVALUE_CLEANUP(&finfo->value);
}
/* frees the resources that the dissection a proto_tree uses */
@@ -595,11 +583,9 @@ proto_tree_free(proto_tree *tree)
proto_tree_children_foreach(tree, proto_tree_free_node, NULL);
- /* free root node */
- PROTO_NODE_FREE(tree);
-
- /* free tree data */
free_node_tree_data(tree_data);
+
+ wmem_free_all(tree_pool);
}
/* Is the parsing being done for a visible proto_tree or an invisible one?