]> Pileus Git - grits/commitdiff
Add grits_object_destroy functions and fix memory leaks
authorAndy Spencer <andy753421@gmail.com>
Mon, 11 Feb 2013 06:12:15 +0000 (06:12 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 11 Feb 2013 06:24:56 +0000 (06:24 +0000)
src/objects/grits-object.c
src/objects/grits-object.h
src/plugins/elev.c
src/plugins/env.c
src/plugins/map.c
src/plugins/sat.c
src/plugins/test.c

index 2812b9e3d647e72a9919b77936e3e4849237b367..55f39754d498cf7d4f93c0ca8116d06d376effdb 100644 (file)
@@ -172,6 +172,13 @@ void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor)
        object->cursor = gdk_cursor_new(cursor);
 }
 
+void grits_object_destroy(GritsObject *object)
+{
+       if (object->viewer)
+               grits_viewer_remove(object->viewer, object);
+       g_object_unref(object);
+}
+
 /* Event handling */
 void grits_object_pick(GritsObject *object, GritsOpenGL *opengl)
 {
index 728ac720d9165bd2658ca2121091e8751906d04a..2c11cd3ba1751d9d64a35ef42ad0e4eaa4d18e7d 100644 (file)
@@ -101,6 +101,30 @@ void grits_object_queue_draw(GritsObject *object);
  */
 void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor);
 
+/**
+ * grits_object_destroy:
+ * @object: The #GritsObject to destroy
+ *
+ * Removes the widget from it's current viewer (if it has one) and decrements
+ * it's reference count.
+ */
+void grits_object_destroy(GritsObject *object);
+
+/**
+ * grits_object_destroy_pointer:
+ * @object: The pointer to the #GritsObject to destroy
+ *
+ * This functions the same as grits_object_destroy, except that the location of
+ * the object is set to null before proceeding.
+ */
+#define grits_object_destroy_pointer(object) ({           \
+       if (*object) {                                    \
+               GritsObject *tmp = GRITS_OBJECT(*object); \
+               *object = NULL;                           \
+               grits_object_destroy(tmp);                \
+       }                                                 \
+})
+
 /**
  * grits_object_center:
  * @object: The #GritsObject to get the center of
index 3634df61f640929d800ab566a92a4483a370fc42..f360451205ec29fa936d388347117bd9488d2071 100644 (file)
@@ -272,8 +272,7 @@ static void grits_plugin_elev_dispose(GObject *gobject)
                if (LOAD_BIL)
                        grits_viewer_clear_height_func(viewer);
                if (LOAD_TEX)
-                       grits_viewer_remove(viewer, GRITS_OBJECT(elev->tiles));
-               g_object_unref(elev->tiles);
+                       grits_object_destroy_pointer(&elev->tiles);
                g_object_unref(viewer);
        }
        G_OBJECT_CLASS(grits_plugin_elev_parent_class)->dispose(gobject);
index 658881d3f5749cbe691c8e130cf050ea65e37f5a..717e9d71ed288317a485ab1cf36db82d876621a7 100644 (file)
@@ -375,8 +375,7 @@ static void grits_plugin_env_dispose(GObject *gobject)
        /* Drop references */
        if (env->viewer) {
                for (GList *cur = env->refs; cur; cur = cur->next)
-                       grits_viewer_remove(env->viewer, cur->data);
-               g_list_free_full(env->refs, g_object_unref);
+                       grits_object_destroy_pointer(&cur->data);
                g_object_unref(env->viewer);
                g_object_unref(env->prefs);
                glDeleteTextures(1, &env->tex);
index 23e8b248fa5729b473bb87229a7286da1a725e3e..b9a549521618d81f8cb62ab98c84033484a4f91a 100644 (file)
@@ -194,8 +194,7 @@ static void grits_plugin_map_dispose(GObject *gobject)
                //grits_http_abort(map->wms->http);
                g_thread_pool_free(map->threads, TRUE, TRUE);
                map->viewer = NULL;
-               grits_viewer_remove(viewer, GRITS_OBJECT(map->tiles));
-               g_object_unref(map->tiles);
+               grits_object_destroy_pointer(&map->tiles);
                g_object_unref(viewer);
        }
        G_OBJECT_CLASS(grits_plugin_map_parent_class)->dispose(gobject);
index bf3b598166fc20418d6dbf82136ebdc0deda0acc..a57277da1bd63c734a21650f0db9fa6177c0e203 100644 (file)
@@ -173,8 +173,7 @@ static void grits_plugin_sat_dispose(GObject *gobject)
                grits_http_abort(sat->wms->http);
                g_thread_pool_free(sat->threads, TRUE, TRUE);
                sat->viewer = NULL;
-               grits_viewer_remove(viewer, GRITS_OBJECT(sat->tiles));
-               g_object_unref(sat->tiles);
+               grits_object_destroy_pointer(&sat->tiles);
                g_object_unref(viewer);
        }
        G_OBJECT_CLASS(grits_plugin_sat_parent_class)->dispose(gobject);
index 2c3e52f97718e704bc935a74438957086cdb7a80..8d12dc1172faec9fe1736cc3b919af511077c821 100644 (file)
@@ -177,12 +177,9 @@ static void grits_plugin_test_dispose(GObject *_test)
        if (test->viewer) {
                GritsViewer *viewer = test->viewer;
                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(test->marker);
-               g_object_unref(test->poly);
-               g_object_unref(test->line);
+               grits_object_destroy_pointer(&test->marker);
+               grits_object_destroy_pointer(&test->poly);
+               grits_object_destroy_pointer(&test->line);
                g_object_unref(viewer);
        }
        G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);