]> Pileus Git - grits/commitdiff
Cleanup memory on exit
authorAndy Spencer <andy753421@gmail.com>
Mon, 25 Jan 2010 21:52:24 +0000 (21:52 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 25 Jan 2010 21:58:05 +0000 (21:58 +0000)
src/gis-opengl.c
src/gis-plugin.c
src/gis-plugin.h
src/gis-prefs.c
src/gis_test.c
src/plugins/bmng.c
src/plugins/srtm.c

index bb05d68fe17b5f2ba3029fa37ce7d52de135830e..bf6086204778f1977cf9177f5a5c980f058f25c8 100644 (file)
@@ -663,10 +663,6 @@ static void gis_opengl_dispose(GObject *_self)
                g_source_remove(self->sm_source[1]);
                self->sm_source[1] = 0;
        }
                g_source_remove(self->sm_source[1]);
                self->sm_source[1] = 0;
        }
-       if (self->sphere) {
-               roam_sphere_free(self->sphere);
-               self->sphere = NULL;
-       }
        /* TODO: Cleanup/free objects tree */
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }
        /* TODO: Cleanup/free objects tree */
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }
@@ -674,6 +670,7 @@ static void gis_opengl_finalize(GObject *_self)
 {
        g_debug("GisViewer: finalize");
        GisOpenGL *self = GIS_OPENGL(_self);
 {
        g_debug("GisViewer: finalize");
        GisOpenGL *self = GIS_OPENGL(_self);
+       roam_sphere_free(self->sphere);
        g_mutex_free(self->sphere_lock);
        G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self);
 }
        g_mutex_free(self->sphere_lock);
        G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self);
 }
@@ -681,7 +678,7 @@ static void gis_opengl_class_init(GisOpenGLClass *klass)
 {
        g_debug("GisOpenGL: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 {
        g_debug("GisOpenGL: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
-       gobject_class->dispose     = gis_opengl_dispose;
+       gobject_class->dispose = gis_opengl_dispose;
 
        GisViewerClass *viewer_class = GIS_VIEWER_CLASS(klass);
        viewer_class->center_position   = gis_opengl_center_position;
 
        GisViewerClass *viewer_class = GIS_VIEWER_CLASS(klass);
        viewer_class->center_position   = gis_opengl_center_position;
index 66c3d1fcd1e47ccbfb92c406d95ded1cbd074233..ca009c98751b0955e25896d267feea018ea2e4ee 100644 (file)
@@ -70,21 +70,22 @@ GisPlugins *gis_plugins_new(gchar *dir)
        GisPlugins *plugins = g_new0(GisPlugins, 1);
        if (dir)
                plugins->dir = g_strdup(dir);
        GisPlugins *plugins = g_new0(GisPlugins, 1);
        if (dir)
                plugins->dir = g_strdup(dir);
-       plugins->plugins = g_ptr_array_new();
        return plugins;
 }
 
 void gis_plugins_free(GisPlugins *self)
 {
        g_debug("GisPlugins: free");
        return plugins;
 }
 
 void gis_plugins_free(GisPlugins *self)
 {
        g_debug("GisPlugins: free");
-       for (int i = 0; i < self->plugins->len; i++) {
-               GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+       for (GList *cur = self->plugins; cur; cur = cur->next) {
+               GisPluginStore *store = cur->data;
+               g_debug("GisPlugin: freeing %s refs=%d->%d", store->name,
+                       G_OBJECT(store->plugin)->ref_count,
+                       G_OBJECT(store->plugin)->ref_count-1);
                g_object_unref(store->plugin);
                g_free(store->name);
                g_free(store);
                g_object_unref(store->plugin);
                g_free(store->name);
                g_free(store);
-               g_ptr_array_remove_index(self->plugins, i);
        }
        }
-       g_ptr_array_free(self->plugins, TRUE);
+       g_list_free(self->plugins);
        if (self->dir)
                g_free(self->dir);
        g_free(self);
        if (self->dir)
                g_free(self->dir);
        g_free(self);
@@ -151,20 +152,20 @@ GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
        GisPluginStore *store = g_new0(GisPluginStore, 1);
        store->name = g_strdup(name);
        store->plugin = constructor(viewer, prefs);
        GisPluginStore *store = g_new0(GisPluginStore, 1);
        store->name = g_strdup(name);
        store->plugin = constructor(viewer, prefs);
-       g_ptr_array_add(self->plugins, store);
+       self->plugins = g_list_prepend(self->plugins, store);
        return store->plugin;
 }
 
 gboolean gis_plugins_unload(GisPlugins *self, const char *name)
 {
        g_debug("GisPlugins: unload %s", name);
        return store->plugin;
 }
 
 gboolean gis_plugins_unload(GisPlugins *self, const char *name)
 {
        g_debug("GisPlugins: unload %s", name);
-       for (int i = 0; i < self->plugins->len; i++) {
-               GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+       for (GList *cur = self->plugins; cur; cur = cur->next) {
+               GisPluginStore *store = cur->data;
                if (g_str_equal(store->name, name)) {
                        g_object_unref(store->plugin);
                        g_free(store->name);
                        g_free(store);
                if (g_str_equal(store->name, name)) {
                        g_object_unref(store->plugin);
                        g_free(store->name);
                        g_free(store);
-                       g_ptr_array_remove_index(self->plugins, i);
+                       self->plugins = g_list_delete_link(self->plugins, cur);
                }
        }
        return FALSE;
                }
        }
        return FALSE;
@@ -176,8 +177,8 @@ void gis_plugins_foreach(GisPlugins *self, GCallback _callback, gpointer user_da
                return;
        typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
        CBFunc callback = (CBFunc)_callback;
                return;
        typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
        CBFunc callback = (CBFunc)_callback;
-       for (int i = 0; i < self->plugins->len; i++) {
-               GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+       for (GList *cur = self->plugins; cur; cur = cur->next) {
+               GisPluginStore *store = cur->data;
                callback(store->plugin, store->name, user_data);
        }
 }
                callback(store->plugin, store->name, user_data);
        }
 }
index 7ba3ae8979bf7a32e1b6b8fdaffc1ac5760e5c04..ae166b8d599f61b7046acbace8a4a774a2c0622f 100644 (file)
@@ -49,8 +49,8 @@ GtkWidget *gis_plugin_get_config(GisPlugin *self);
 #include "gis-prefs.h"
 
 struct _GisPlugins {
 #include "gis-prefs.h"
 
 struct _GisPlugins {
-       gchar     *dir;
-       GPtrArray *plugins;
+       gchar *dir;
+       GList *plugins;
 };
 
 typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisPrefs *prefs);
 };
 
 typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisPrefs *prefs);
index 9659a6e8b143d4e7c5eb24cd2eb08963dcff10a9..6a2bd7d498c642cd4475a072b9971892eabc3921 100644 (file)
@@ -57,7 +57,7 @@ GisPrefs *gis_prefs_new(const gchar *config, const gchar *defaults)
                g_free(tmp);
        }
        if (error) {
                g_free(tmp);
        }
        if (error) {
-               g_warning("GisPrefs: new - Unable to load key file `%s': %s",
+               g_debug("GisPrefs: new - Unable to load key file `%s': %s",
                        self->key_path, error->message);
        }
        return self;
                        self->key_path, error->message);
        }
        return self;
index 646de7700e5c4291bfdbdac71ef6b96dbef5248f..4c0785a4e938b9d7e252349be00cb55ad35b6556 100644 (file)
 /*************
  * Callbacks *
  *************/
 /*************
  * Callbacks *
  *************/
-static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
+static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
+               gpointer _window)
 {
        g_debug("GisTest: on_key_press - key=%x, state=%x",
                        event->keyval, event->state);
 {
        g_debug("GisTest: on_key_press - key=%x, state=%x",
                        event->keyval, event->state);
+       GtkWidget *window = _window;
        switch (event->keyval) {
        case GDK_q:
        switch (event->keyval) {
        case GDK_q:
-               gtk_widget_destroy(widget);
+               gtk_widget_destroy(window);
                return TRUE;
        }
        return FALSE;
                return TRUE;
        }
        return FALSE;
@@ -52,7 +54,7 @@ int main(int argc, char **argv)
        gdk_threads_enter();
        GtkWidget  *window  = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
        gdk_threads_enter();
        GtkWidget  *window  = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
-       g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  NULL);
+       g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  window);
        gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(viewer));
        gtk_widget_show_all(window);
        gdk_threads_leave();
        gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(viewer));
        gtk_widget_show_all(window);
        gdk_threads_leave();
@@ -64,9 +66,8 @@ int main(int argc, char **argv)
        gdk_threads_enter();
        gtk_main();
 
        gdk_threads_enter();
        gtk_main();
 
-       g_object_unref(prefs);
-       g_object_unref(viewer);
        gis_plugins_free(plugins);
        gis_plugins_free(plugins);
+       g_object_unref(prefs);
        gdk_threads_leave();
        return 0;
 }
        gdk_threads_leave();
        return 0;
 }
index 648b9ba620ea3d78a2efd7ceb44effc7a3e56cc3..e8ec5025995af61a186ba29ee3260198b703fcc5 100644 (file)
@@ -143,7 +143,7 @@ GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer)
 {
        g_debug("GisPluginBmng: new");
        GisPluginBmng *self = g_object_new(GIS_TYPE_PLUGIN_BMNG, NULL);
 {
        g_debug("GisPluginBmng: new");
        GisPluginBmng *self = g_object_new(GIS_TYPE_PLUGIN_BMNG, NULL);
-       self->viewer = viewer;
+       self->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
@@ -190,7 +190,11 @@ static void gis_plugin_bmng_dispose(GObject *gobject)
        g_debug("GisPluginBmng: dispose");
        GisPluginBmng *self = GIS_PLUGIN_BMNG(gobject);
        /* Drop references */
        g_debug("GisPluginBmng: dispose");
        GisPluginBmng *self = GIS_PLUGIN_BMNG(gobject);
        /* Drop references */
-       g_signal_handler_disconnect(self->viewer, self->sigid);
+       if (self->viewer) {
+               g_signal_handler_disconnect(self->viewer, self->sigid);
+               g_object_unref(self->viewer);
+               self->viewer = NULL;
+       }
        G_OBJECT_CLASS(gis_plugin_bmng_parent_class)->dispose(gobject);
 }
 static void gis_plugin_bmng_finalize(GObject *gobject)
        G_OBJECT_CLASS(gis_plugin_bmng_parent_class)->dispose(gobject);
 }
 static void gis_plugin_bmng_finalize(GObject *gobject)
index 4e1126aabf7cdd2c5cbbcdc552733d6087f1b47c..6e07a80b9a2930834b60e01562e7ce79e52c3a86 100644 (file)
@@ -254,7 +254,7 @@ GisPluginSrtm *gis_plugin_srtm_new(GisViewer *viewer)
 {
        g_debug("GisPluginSrtm: new");
        GisPluginSrtm *self = g_object_new(GIS_TYPE_PLUGIN_SRTM, NULL);
 {
        g_debug("GisPluginSrtm: new");
        GisPluginSrtm *self = g_object_new(GIS_TYPE_PLUGIN_SRTM, NULL);
-       self->viewer = viewer;
+       self->viewer = g_object_ref(viewer);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
@@ -301,9 +301,13 @@ static void gis_plugin_srtm_dispose(GObject *gobject)
        g_debug("GisPluginSrtm: dispose");
        GisPluginSrtm *self = GIS_PLUGIN_SRTM(gobject);
        /* Drop references */
        g_debug("GisPluginSrtm: dispose");
        GisPluginSrtm *self = GIS_PLUGIN_SRTM(gobject);
        /* Drop references */
-       g_signal_handler_disconnect(self->viewer, self->sigid);
        if (LOAD_BIL)
                gis_viewer_clear_height_func(self->viewer);
        if (LOAD_BIL)
                gis_viewer_clear_height_func(self->viewer);
+       if (self->viewer) {
+               g_signal_handler_disconnect(self->viewer, self->sigid);
+               g_object_unref(self->viewer);
+               self->viewer = NULL;
+       }
        G_OBJECT_CLASS(gis_plugin_srtm_parent_class)->dispose(gobject);
 }
 static void gis_plugin_srtm_finalize(GObject *gobject)
        G_OBJECT_CLASS(gis_plugin_srtm_parent_class)->dispose(gobject);
 }
 static void gis_plugin_srtm_finalize(GObject *gobject)