]> Pileus Git - grits/commitdiff
Fix a variety of memory leaks
authorAndy Spencer <andy753421@gmail.com>
Wed, 26 Dec 2012 08:40:06 +0000 (08:40 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 26 Dec 2012 08:40:55 +0000 (08:40 +0000)
src/grits-opengl.c
src/gtkgl.c
src/objects/grits-tile.c
src/plugins/elev.c
src/plugins/env.c
src/plugins/map.c
src/plugins/sat.c
src/plugins/test.c

index 14515ae3a760a230967fb1db472e56040d18008c..709e6ed80976b2d8be22bcf20537f31511651e54 100644 (file)
@@ -587,9 +587,9 @@ static void _objects_free(gpointer value, gpointer _)
 {
        struct RenderLevel *level = value;
        if (level->sorted.next)
 {
        struct RenderLevel *level = value;
        if (level->sorted.next)
-               g_list_free(level->sorted.next);
+               g_list_free_full(level->sorted.next, g_object_unref);
        if (level->unsorted.next)
        if (level->unsorted.next)
-               g_list_free(level->unsorted.next);
+               g_list_free_full(level->unsorted.next, g_object_unref);
        g_free(level);
 }
 
        g_free(level);
 }
 
@@ -657,6 +657,15 @@ static void grits_opengl_init(GritsOpenGL *opengl)
 static void grits_opengl_dispose(GObject *_opengl)
 {
        g_debug("GritsOpenGL: dispose");
 static void grits_opengl_dispose(GObject *_opengl)
 {
        g_debug("GritsOpenGL: dispose");
+       GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
+       if (opengl->objects) {
+               GQueue *objects = opengl->objects;;
+               opengl->objects = NULL;
+               g_mutex_lock(&opengl->objects_lock);
+               g_queue_foreach(objects, _objects_free, NULL);
+               g_queue_free(objects);
+               g_mutex_unlock(&opengl->objects_lock);
+       }
        G_OBJECT_CLASS(grits_opengl_parent_class)->dispose(_opengl);
 }
 static void grits_opengl_finalize(GObject *_opengl)
        G_OBJECT_CLASS(grits_opengl_parent_class)->dispose(_opengl);
 }
 static void grits_opengl_finalize(GObject *_opengl)
@@ -664,10 +673,9 @@ static void grits_opengl_finalize(GObject *_opengl)
        g_debug("GritsOpenGL: finalize");
        GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
        roam_sphere_free(opengl->sphere);
        g_debug("GritsOpenGL: finalize");
        GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
        roam_sphere_free(opengl->sphere);
-       g_queue_foreach(opengl->objects, _objects_free, NULL);
-       g_queue_free(opengl->objects);
        g_mutex_clear(&opengl->objects_lock);
        g_mutex_clear(&opengl->sphere_lock);
        g_mutex_clear(&opengl->objects_lock);
        g_mutex_clear(&opengl->sphere_lock);
+       gtk_gl_disable(GTK_WIDGET(opengl));
        G_OBJECT_CLASS(grits_opengl_parent_class)->finalize(_opengl);
 }
 static void grits_opengl_class_init(GritsOpenGLClass *klass)
        G_OBJECT_CLASS(grits_opengl_parent_class)->finalize(_opengl);
 }
 static void grits_opengl_class_init(GritsOpenGLClass *klass)
index af2c62bac5f888263fee7a61ee90e9189f50f2ad..8808ed585b1066d8be602faa6680fef7cd3b8db5 100644 (file)
@@ -112,6 +112,8 @@ void gtk_gl_enable(GtkWidget *widget)
        GdkVisual   *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
        GdkColormap *cmap   = gdk_colormap_new(visual, FALSE);
        gtk_widget_set_colormap(widget, cmap);
        GdkVisual   *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
        GdkColormap *cmap   = gdk_colormap_new(visual, FALSE);
        gtk_widget_set_colormap(widget, cmap);
+       g_object_unref(cmap);
+       XFree(xvinfo);
 
        /* Disable GTK double buffering */
        gtk_widget_set_double_buffered(widget, FALSE);
 
        /* Disable GTK double buffering */
        gtk_widget_set_double_buffered(widget, FALSE);
index b566e33496b6ae1b0f4ce4d177d9d2bfcc65bcc8..6ea70f88cbf052e38073b8087e3ea300c7f19c79 100644 (file)
@@ -39,7 +39,7 @@
 #include "gtkgl.h"
 #include "grits-tile.h"
 
 #include "gtkgl.h"
 #include "grits-tile.h"
 
-guint  grits_tile_mask = 0;
+static guint  grits_tile_mask = 0;
 
 gchar *grits_tile_path_table[2][2] = {
        {"00.", "01."},
 
 gchar *grits_tile_path_table[2][2] = {
        {"00.", "01."},
@@ -364,6 +364,7 @@ static guint _grits_tile_load_mask(void)
 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+       g_free(bytes);
        return tex;
 }
 
        return tex;
 }
 
index 92d8dd140d7419509b10e2ed43d04876ea23cfad..d359d1dd17923bec94906008829e40a7fed43ed6 100644 (file)
@@ -286,7 +286,6 @@ GritsPluginElev *grits_plugin_elev_new(GritsViewer *viewer)
        elev->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
        elev->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
-       _load_tile(elev->tiles, elev);
        _update_tiles(NULL, elev);
 
        /* Connect signals */
        _update_tiles(NULL, elev);
 
        /* Connect signals */
@@ -340,6 +339,8 @@ static void grits_plugin_elev_dispose(GObject *gobject)
                        grits_viewer_clear_height_func(viewer);
                if (LOAD_TEX)
                        grits_viewer_remove(viewer, GRITS_OBJECT(elev->tiles));
                        grits_viewer_clear_height_func(viewer);
                if (LOAD_TEX)
                        grits_viewer_remove(viewer, GRITS_OBJECT(elev->tiles));
+               else
+                       g_object_unref(elev->tiles);
                soup_session_abort(elev->wms->http->soup);
                g_thread_pool_free(elev->threads, TRUE, TRUE);
                while (gtk_events_pending())
                soup_session_abort(elev->wms->http->soup);
                g_thread_pool_free(elev->threads, TRUE, TRUE);
                while (gtk_events_pending())
index 8b16466e22a4d5894c81bcecf0996fd1ee92d1dd..d833b43c5afdbeb37c6cf931a5278ea8666d99a7 100644 (file)
@@ -378,6 +378,7 @@ static void grits_plugin_env_dispose(GObject *gobject)
                        grits_viewer_remove(env->viewer, cur->data);
                g_list_free(env->refs);
                g_object_unref(env->viewer);
                        grits_viewer_remove(env->viewer, cur->data);
                g_list_free(env->refs);
                g_object_unref(env->viewer);
+               g_object_unref(env->prefs);
                glDeleteTextures(1, &env->tex);
                env->viewer = NULL;
        }
                glDeleteTextures(1, &env->tex);
                env->viewer = NULL;
        }
index 72fb320e0bd9ae287f59a0eee289489af82a55a2..c57bae88610e4b8becbd6582bf3129c2c082d0d5 100644 (file)
@@ -189,7 +189,6 @@ GritsPluginMap *grits_plugin_map_new(GritsViewer *viewer)
        map->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
        map->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
-       _load_tile(map->tiles, map);
        _update_tiles(NULL, map);
 
        /* Connect signals */
        _update_tiles(NULL, map);
 
        /* Connect signals */
index c96ecc43b5906f0d0df2cd4f94d9e28dc46edcd9..9b10a2df70b6df34c630c3018bec566d4ff5db8a 100644 (file)
@@ -173,7 +173,6 @@ GritsPluginSat *grits_plugin_sat_new(GritsViewer *viewer)
        sat->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
        sat->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
-       _load_tile(sat->tiles, sat);
        _update_tiles(NULL, sat);
 
        /* Connect signals */
        _update_tiles(NULL, sat);
 
        /* Connect signals */
index a463d3a6551661925e24adc182fc418f7965fe0d..8a7e8a6588c39877bb4605ae46985f883384f3c1 100644 (file)
@@ -175,11 +175,12 @@ static void grits_plugin_test_dispose(GObject *_test)
        g_debug("GritsPluginTest: dispose");
        GritsPluginTest *test = GRITS_PLUGIN_TEST(_test);
        if (test->viewer) {
        g_debug("GritsPluginTest: dispose");
        GritsPluginTest *test = GRITS_PLUGIN_TEST(_test);
        if (test->viewer) {
-               grits_viewer_remove(test->viewer, GRITS_OBJECT(test->marker));
-               grits_viewer_remove(test->viewer, GRITS_OBJECT(test->poly));
-               grits_viewer_remove(test->viewer, GRITS_OBJECT(test->line));
-               g_object_unref(test->viewer);
+               GritsViewer *viewer = test->viewer;
                test->viewer = NULL;
                test->viewer = NULL;
+               grits_viewer_remove(viewer, GRITS_OBJECT(test->marker));
+               grits_viewer_remove(viewer, GRITS_OBJECT(test->poly));
+               grits_viewer_remove(viewer, GRITS_OBJECT(test->line));
+               g_object_unref(viewer);
        }
        G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);
 }
        }
        G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);
 }