aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2000-04-03 08:42:45 +0000
committerGuy Harris <guy@alum.mit.edu>2000-04-03 08:42:45 +0000
commitf3c287d201e991ff13a0ebe7ed68747a34e715b2 (patch)
treeed934975fa564e2ed1bc4ec60be32d4dde1dd242
parent9e47031a4a88190e430a7b62c2f5c066fc4c0f60 (diff)
downloadwireshark-f3c287d201e991ff13a0ebe7ed68747a34e715b2.tar.gz
wireshark-f3c287d201e991ff13a0ebe7ed68747a34e715b2.tar.bz2
wireshark-f3c287d201e991ff13a0ebe7ed68747a34e715b2.zip
Use a GMemChunk for allocating and freeing "frame_data" structures; it
reduces the memory required for one big capture file I have by about 10 megabytes, and speeds up the reading in of that file, presumably because it amortizes the memory-allocator space and CPU time overhead over a set of several "frame_data" structures. svn path=/trunk/; revision=1776
-rw-r--r--file.c25
-rw-r--r--file.h3
2 files changed, 17 insertions, 11 deletions
diff --git a/file.c b/file.c
index 1d5c7029bf..4081d1415e 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.174 2000/03/31 21:42:23 oabad Exp $
+ * $Id: file.c,v 1.175 2000/04/03 08:42:44 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -177,8 +177,6 @@ fail:
void
close_cap_file(capture_file *cf, void *w)
{
- frame_data *fd, *fd_next;
-
/* Destroy all popup packet windows, as they refer to packets in the
capture file we're closing. */
destroy_packet_wins();
@@ -202,10 +200,8 @@ close_cap_file(capture_file *cf, void *w)
/* ...which means we have nothing to save. */
cf->user_saved = FALSE;
- for (fd = cf->plist; fd != NULL; fd = fd_next) {
- fd_next = fd->next;
- g_free(fd);
- }
+ if (cf->plist_chunk != NULL)
+ g_mem_chunk_destroy(cf->plist_chunk);
if (cf->rfcode != NULL) {
dfilter_destroy(cf->rfcode);
cf->rfcode = NULL;
@@ -304,6 +300,10 @@ read_cap_file(capture_file *cf)
freeze_clist(cf);
proto_tree_is_visible = FALSE;
+ cf->plist_chunk = g_mem_chunk_new("frame_data_chunk",
+ sizeof(frame_data),
+ 1024 * sizeof(frame_data), /* XXX - magic number */
+ G_ALLOC_AND_FREE);
success = wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf, &err);
/* Set the file encapsulation type now; we don't know what it is until
we've looked at all the packets, as we don't know until then whether
@@ -661,7 +661,7 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
}
/* Allocate the next list entry, and add it to the list. */
- fdata = (frame_data *) g_malloc(sizeof(frame_data));
+ fdata = g_mem_chunk_alloc(cf->plist_chunk);
fdata->next = NULL;
fdata->prev = NULL;
@@ -695,8 +695,13 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
cf->count++;
fdata->num = cf->count;
add_packet_to_packet_list(fdata, cf, buf);
- } else
- g_free(fdata);
+ } else {
+ /* XXX - if we didn't have read filters, or if we could avoid
+ allocating the "frame_data" structure until we knew whether
+ the frame passed the read filter, we could use a G_ALLOC_ONLY
+ memory chunk, probably saving time and space. */
+ g_mem_chunk_free(cf->plist_chunk, fdata);
+ }
}
int
diff --git a/file.h b/file.h
index e269f77899..dff9d580cf 100644
--- a/file.h
+++ b/file.h
@@ -1,7 +1,7 @@
/* file.h
* Definitions for file structures and routines
*
- * $Id: file.h,v 1.64 2000/02/12 08:15:20 guy Exp $
+ * $Id: file.h,v 1.65 2000/04/03 08:42:45 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -102,6 +102,7 @@ typedef struct _capture_file {
gchar *sfilter; /* Search filter string */
gboolean sbackward; /* TRUE if search is backward, FALSE if forward */
guint8 pd[WTAP_MAX_PACKET_SIZE]; /* Packet data */
+ GMemChunk *plist_chunk; /* Memory chunk for frame_data structures */
frame_data *plist; /* Packet list */
frame_data *plist_end; /* Last packet in list */
frame_data *first_displayed; /* First frame displayed */