From: Andy Spencer Date: Mon, 25 Jan 2010 21:52:24 +0000 (+0000) Subject: Cleanup memory on exit X-Git-Tag: v0.4~121 X-Git-Url: http://pileus.org/git/?p=grits;a=commitdiff_plain;h=4d15133ec35119c875d132d48d6944661b4621ff Cleanup memory on exit --- diff --git a/src/gis-opengl.c b/src/gis-opengl.c index bb05d68..bf60862 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -663,10 +663,6 @@ static void gis_opengl_dispose(GObject *_self) 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); } @@ -674,6 +670,7 @@ static void gis_opengl_finalize(GObject *_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); } @@ -681,7 +678,7 @@ static void gis_opengl_class_init(GisOpenGLClass *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; diff --git a/src/gis-plugin.c b/src/gis-plugin.c index 66c3d1f..ca009c9 100644 --- a/src/gis-plugin.c +++ b/src/gis-plugin.c @@ -70,21 +70,22 @@ GisPlugins *gis_plugins_new(gchar *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"); - 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_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); @@ -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); - 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); - 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); - g_ptr_array_remove_index(self->plugins, i); + self->plugins = g_list_delete_link(self->plugins, cur); } } 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; - 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); } } diff --git a/src/gis-plugin.h b/src/gis-plugin.h index 7ba3ae8..ae166b8 100644 --- a/src/gis-plugin.h +++ b/src/gis-plugin.h @@ -49,8 +49,8 @@ GtkWidget *gis_plugin_get_config(GisPlugin *self); #include "gis-prefs.h" struct _GisPlugins { - gchar *dir; - GPtrArray *plugins; + gchar *dir; + GList *plugins; }; typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisPrefs *prefs); diff --git a/src/gis-prefs.c b/src/gis-prefs.c index 9659a6e..6a2bd7d 100644 --- a/src/gis-prefs.c +++ b/src/gis-prefs.c @@ -57,7 +57,7 @@ GisPrefs *gis_prefs_new(const gchar *config, const gchar *defaults) 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; diff --git a/src/gis_test.c b/src/gis_test.c index 646de77..4c0785a 100644 --- a/src/gis_test.c +++ b/src/gis_test.c @@ -24,13 +24,15 @@ /************* * 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); + GtkWidget *window = _window; switch (event->keyval) { case GDK_q: - gtk_widget_destroy(widget); + gtk_widget_destroy(window); 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); - 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(); @@ -64,9 +66,8 @@ int main(int argc, char **argv) gdk_threads_enter(); gtk_main(); - g_object_unref(prefs); - g_object_unref(viewer); gis_plugins_free(plugins); + g_object_unref(prefs); gdk_threads_leave(); return 0; } diff --git a/src/plugins/bmng.c b/src/plugins/bmng.c index 648b9ba..e8ec502 100644 --- a/src/plugins/bmng.c +++ b/src/plugins/bmng.c @@ -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); - self->viewer = viewer; + self->viewer = g_object_ref(viewer); /* 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_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) diff --git a/src/plugins/srtm.c b/src/plugins/srtm.c index 4e1126a..6e07a80 100644 --- a/src/plugins/srtm.c +++ b/src/plugins/srtm.c @@ -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); - self->viewer = viewer; + self->viewer = g_object_ref(viewer); /* 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_signal_handler_disconnect(self->viewer, self->sigid); 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)