Re: Re: Memleak in canvas_paint, update
"Adrian E. Feiguin" <[email protected]> Tue, 07 Dec 2004 15:57:35 -0800
| Newsgroups | gmane.comp.scigraphica.gtkextra |
|---|---|
| Message-ID | <[email protected]> |
Hi Al,
Thanks for the code! I was able to find two or three more leaks, and
I committed the changes to cvs. I'm sure that there are some leaks
related to pango, but that's probably because I'm using an old version
here. Tell me what you find. Saludos,
<ADRIAN>
Al Hooton wrote:
> Adrian,
>
>On Sun, 2004-12-05 at 12:16 -0800, Adrian E. Feiguin wrote:
>
>
>>Hi Al!
>> Thank you so much for your reports. Using Valgrind I was able to fix
>>several memory leaks, practically all. There still are a couple silly
>>initialization leaks somewhere, probably in gtk or gobject, but I'm
>>confident that not in gtkextra. At least the memory usage doesn't grow
>>with time, and it's all freed at the end. The leaks where related to
>>Pango and gtkplotbubble and gtkplotflux.
>>It's all in cvs.
>>Hopefuly you'll be able to run your code now!
>>
>>
>
>
> Man, you did fix up a good bunch of stuff, I can really see the
>improvements!
>
> Unfortunately, there is still a lot of memory getting lost in my test
>case (and the app I'm working on). With the new updates, I'm seeing
>24kB - 28kB+ leaked in every call to gtk_plot_canvas_paint() in the
>attached test program. At the average rate of two calls to
>canvas_paint() every second, I'll chew up ~90MB/hour. Definitely
>better, but obviously not tolerable for an app that will need run for
>days/weeks uninterrupted.
>
> I've spent all day today rebuilding gtkextra-2 with full
>debugging/profiling, and simplifying my test program to see if the leaks
>moved or I could find something else going on. At this point, I have a
>simpler test program that still shows these leaks, and the call stack is
>the same as my last email, starting with gtk_plot_canvas_paint() and
>working down.
>
> Just to be sure this is a real problem, and not only something on my
>end, can you build/run the attached testgtkplotcanvas.c, and confirm
>that you see it leaking as well? I did a full update from CVS this
>morning and built it from scratch to be sure everything was good, so I'm
>sure I have a clean starting point.
>
> I'm hoping you can see these leaks too. If not, please let me know, so
>we can figure out what's different between your environment and my
>environment. I realize these leaks may not be in the gtkextra code
>itself, but I'm hoping we can track them down far enough to put a
>workaround in place to avoid any problems we may find lower in the
>stack.
>
> If anybody else on the list using gtkextra-2 has a few minutes, and
>could build/run the attached test program, that would be extremely
>helpful too. Just copy the original testgtkplotcanvas.c to another
>name, drop the attached file in it's place, rebuild gtkextra-2, then run
>gtkextra/testgtkplotcanvas. Open up a terminal and run top - if it's
>leaking, you'll see the virtual memory size climbing steadily. I truly
>appreciate the help of anyone that can give this a shot and report back
>to the list. Maybe it's just something in my environment, in which
>case I'll stop bugging everybody... 8^)=
>
> Thanks again for helping me dig through this!
>
>-Al
>
>--------------
>#include <math.h>
>#include <stdio.h>
>#include <sys/types.h>
>#include <sys/time.h>
>#include <time.h>
>#include <signal.h>
>
>#include <gtk/gtk.h>
>#include <gdk/gdk.h>
>
>
>#include "gtkplot.h"
>#include "gtkplotdata.h"
>#include "gtkplotcanvas.h"
>#include "gtkplotcanvasplot.h"
>#include "gtkplotcanvasellipse.h"
>
>
>
>
>GtkWidget *canvas;
>GtkPlotCanvasChild *child = NULL;
>GtkWidget *window1;
>
>
>void
>quit ()
>{
> gtk_main_quit();
>}
>
>
>
>void
>sigStatus(int signum, siginfo_t *siginfo, void *notused)
>{
> gtk_plot_canvas_paint(GTK_PLOT_CANVAS(canvas));
>}
>
>
>
>
>int main(int argc, char *argv[]){
>
> gint page_width, page_height;
> gfloat scale = 1.;
> GtkWidget *active_plot;
>
>
> page_width = GTK_PLOT_LETTER_W * scale;
> page_height = GTK_PLOT_LETTER_H * scale;
>
> gtk_init(&argc,&argv);
>
> window1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
> gtk_widget_set_usize(window1,550,650);
>
> gtk_signal_connect (GTK_OBJECT (window1), "destroy",
> GTK_SIGNAL_FUNC (quit), NULL);
>
> canvas = gtk_plot_canvas_new(page_width, page_height, 1.);
> gtk_widget_show(canvas);
>
> gtk_container_add(GTK_CONTAINER(window1),canvas);
>
> active_plot = gtk_plot_new(NULL);
> gtk_widget_show(active_plot);
> child = gtk_plot_canvas_plot_new(GTK_PLOT(active_plot));
> gtk_plot_canvas_put_child(GTK_PLOT_CANVAS(canvas),
>child, .1, .1, .8, .65);
>
>
> /* Set up the g_timeout */
> g_timeout_add((guint) 1000, (GSourceFunc)&sigStatus, (gpointer)NULL);
>
>
> gtk_widget_show(window1);
>
> gtk_main();
>
> return(0);
>}
>
>----------------------
>
>
>
>
>------------------------------------------------------------------------
>
>#include <math.h>
>#include <stdio.h>
>#include <sys/types.h>
>#include <sys/time.h>
>#include <time.h>
>#include <signal.h>
>
>#include <gtk/gtk.h>
>#include <gdk/gdk.h>
>
>
>#include "gtkplot.h"
>#include "gtkplotdata.h"
>#include "gtkplotcanvas.h"
>#include "gtkplotcanvasplot.h"
>#include "gtkplotcanvasellipse.h"
>
>
>
>
>GtkWidget *canvas;
>GtkPlotCanvasChild *child = NULL;
>GtkWidget *window1;
>
>
>void
>quit ()
>{
> gtk_main_quit();
>}
>
>
>
>void
>sigStatus(int signum, siginfo_t *siginfo, void *notused)
>{
> gtk_plot_canvas_paint(GTK_PLOT_CANVAS(canvas));
>}
>
>
>
>
>int main(int argc, char *argv[]){
>
> gint page_width, page_height;
> gfloat scale = 1.;
> GtkWidget *active_plot;
>
>
> page_width = GTK_PLOT_LETTER_W * scale;
> page_height = GTK_PLOT_LETTER_H * scale;
>
> gtk_init(&argc,&argv);
>
> window1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
> gtk_widget_set_usize(window1,550,650);
>
> gtk_signal_connect (GTK_OBJECT (window1), "destroy",
> GTK_SIGNAL_FUNC (quit), NULL);
>
> canvas = gtk_plot_canvas_new(page_width, page_height, 1.);
> gtk_widget_show(canvas);
>
> gtk_container_add(GTK_CONTAINER(window1),canvas);
>
> active_plot = gtk_plot_new(NULL);
> gtk_widget_show(active_plot);
> child = gtk_plot_canvas_plot_new(GTK_PLOT(active_plot));
> gtk_plot_canvas_put_child(GTK_PLOT_CANVAS(canvas), child, .1, .1, .8, .65);
>
>
> /* Set up the g_timeout */
> g_timeout_add((guint) 1000, (GSourceFunc)&sigStatus, (gpointer)NULL);
>
>
> gtk_widget_show(window1);
>
> gtk_main();
>
> return(0);
>}
>
>
>
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://productguide.itmanagersjournal.com/