Wireshark-dev: Re: [Wireshark-dev] Memory leak
From: "Didier" <dgautheron@xxxxxxxx>
Date: Fri, 20 Jul 2007 03:11:20 +0200
On Thu, 19 Jul 2007 14:16:49 -0400, Jeff Morriss wrote > Didier wrote: > > Hi, > > > > 1) It seems that since some glib 2.0 version g_mem_chunk_destroy doesn't > > free > > The docs certainly seem to indicate that the memory should actually > be freed: > > http://www.gtk.org/api/2.6/glib/glib-Memory-Chunks.html#g-mem-chunk-destroy > > and my (basic) attempt to follow the code goes down to > g_slice_free1() which appears to at least _try_ to free the memory. > Am I missing something? In my understanding now g-mem-chunk-destroy only free the mem chunk object (aka sizeof structure g_mem_chunk) not the allocated memory as with gtk1. You have to call g_mem_chunk_free for each allocated chunk. > > [That's not to say I don't see memory usage growing when I reload a > capture file, but I'm not convinced this is the source.] Attached a small patch which replace gmemchunk with se_alloc (I didn't change cf name and header file on purpose but a proper patch should). The drawback is that if DEBUG_USE_CANARIES is defined in epan/emem.c (the default) the virtual size is a lot bigger. There's still leaks though. > > > 2)COPY_ADDRESS is still misused in a lot of place it g_malloc address > > space > > but many don't free it. > > There is (also) an SE_COPY_ADDRESS; is there any reason not to make > all COPY_ADDRESS calls seasonal? It makes sense for some but a lot of them are in taps code with a live time between ep and se. Some leaks are on every access cf. dissectors/packet-jxta.c Didier
=== modified file 'file.c'
--- file.c 2007-07-19 22:04:10 +0000
+++ file.c 2007-07-19 23:50:31 +0000
@@ -75,6 +75,7 @@
#include <epan/dissectors/packet-data.h>
#include <epan/dissectors/packet-ber.h>
#include <epan/timestamp.h>
+#include <epan/emem.h>
#include "file_util.h"
@@ -256,11 +257,7 @@
nstime_set_unset(&first_ts);
nstime_set_unset(&prev_dis_ts);
- cf->plist_chunk = g_mem_chunk_new("frame_data_chunk",
- sizeof(frame_data),
- FRAME_DATA_CHUNK_SIZE * sizeof(frame_data),
- G_ALLOC_AND_FREE);
- g_assert(cf->plist_chunk);
+ cf->plist_chunk = NULL;
/* change the time formats now, as we might have a new precision */
cf_change_time_formats(cf);
@@ -308,10 +305,8 @@
/* ...which means we have nothing to save. */
cf->user_saved = FALSE;
- if (cf->plist_chunk != NULL) {
- g_mem_chunk_destroy(cf->plist_chunk);
- cf->plist_chunk = NULL;
- }
+ cf->plist_chunk = NULL;
+
if (cf->rfcode != NULL) {
dfilter_free(cf->rfcode);
cf->rfcode = NULL;
@@ -1063,8 +1058,11 @@
int row = -1;
/* Allocate the next list entry, and add it to the list. */
- fdata = g_mem_chunk_alloc(cf->plist_chunk);
-
+ if (cf->plist_chunk)
+ fdata = cf->plist_chunk;
+ else
+ cf->plist_chunk = fdata = se_alloc(sizeof (frame_data));
+
fdata->num = 0;
fdata->next = NULL;
fdata->prev = NULL;
@@ -1108,16 +1106,7 @@
cf->f_datalen = offset + phdr->caplen;
fdata->num = cf->count;
row = add_packet_to_packet_list(fdata, cf, dfcode, pseudo_header, buf, TRUE);
- } 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...
-
- ...but, at least in one test I did, where I just made the chunk
- a G_ALLOC_ONLY chunk and read in a huge capture file, it didn't
- seem to save a noticeable amount of time or space. */
- g_mem_chunk_free(cf->plist_chunk, fdata);
+ cf->plist_chunk = NULL;
}
return row;
- Follow-Ups:
- Re: [Wireshark-dev] Memory leak
- From: Didier
- Re: [Wireshark-dev] Memory leak
- References:
- [Wireshark-dev] Memory leak
- From: Didier
- Re: [Wireshark-dev] Memory leak
- From: Jeff Morriss
- [Wireshark-dev] Memory leak
- Prev by Date: [Wireshark-dev] building a custom dissector on linux
- Next by Date: Re: [Wireshark-dev] building a custom dissector on linux
- Previous by thread: Re: [Wireshark-dev] Memory leak
- Next by thread: Re: [Wireshark-dev] Memory leak
- Index(es):