[libpeas] Use dispose() instead of finalize() to unref extension instances.



commit f3f6b4e120de36e16f9729d12fee9e8567bdd2ae
Author: Steve Frécinaux <code istique net>
Date:   Tue Jan 18 16:15:33 2011 +0100

    Use dispose() instead of finalize() to unref extension instances.
    
    This fixes refcount issues with non-native extensions, which prevented
    objects which had extensions attached to ever get finalized.
    
    The window example in peas-demo was also amended to use dispose()
    instead of finalize() to do all the unrefs.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=639597

 loaders/c/peas-extension-c.c           |   11 +++++++----
 loaders/python/peas-extension-python.c |    7 ++++---
 loaders/seed/peas-extension-seed.c     |   14 ++++++++++----
 peas-demo/peas-demo-window.c           |   19 ++++++++++++++-----
 4 files changed, 35 insertions(+), 16 deletions(-)
---
diff --git a/loaders/c/peas-extension-c.c b/loaders/c/peas-extension-c.c
index 3cc8ab9..9202054 100644
--- a/loaders/c/peas-extension-c.c
+++ b/loaders/c/peas-extension-c.c
@@ -51,14 +51,17 @@ peas_extension_c_call (PeasExtension *exten,
 }
 
 static void
-peas_extension_c_finalize (GObject *object)
+peas_extension_c_dispose (GObject *object)
 {
   PeasExtensionC *cexten = PEAS_EXTENSION_C (object);
   
   if (cexten->instance)
-    g_object_unref (cexten->instance);
+    {
+      g_object_unref (cexten->instance);
+      cexten->instance = NULL;
+    }
 
-  G_OBJECT_CLASS (peas_extension_c_parent_class)->finalize (object);
+  G_OBJECT_CLASS (peas_extension_c_parent_class)->dispose (object);
 }
 
 static void
@@ -67,7 +70,7 @@ peas_extension_c_class_init (PeasExtensionCClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   PeasExtensionClass *extension_class = PEAS_EXTENSION_CLASS (klass);
 
-  object_class->finalize = peas_extension_c_finalize;
+  object_class->dispose = peas_extension_c_dispose;
 
   extension_class->call = peas_extension_c_call;
 }
diff --git a/loaders/python/peas-extension-python.c b/loaders/python/peas-extension-python.c
index 3ae10b5..daa0097 100644
--- a/loaders/python/peas-extension-python.c
+++ b/loaders/python/peas-extension-python.c
@@ -59,16 +59,17 @@ peas_extension_python_call (PeasExtension *exten,
 }
 
 static void
-peas_extension_python_finalize (GObject *object)
+peas_extension_python_dispose (GObject *object)
 {
   PeasExtensionPython *pyexten = PEAS_EXTENSION_PYTHON (object);
 
   if (pyexten->instance)
     {
       Py_DECREF (pyexten->instance);
+      pyexten->instance = NULL;
     }
 
-  G_OBJECT_CLASS (peas_extension_python_parent_class)->finalize (object);
+  G_OBJECT_CLASS (peas_extension_python_parent_class)->dispose (object);
 }
 
 static void
@@ -77,7 +78,7 @@ peas_extension_python_class_init (PeasExtensionPythonClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   PeasExtensionClass *extension_class = PEAS_EXTENSION_CLASS (klass);
 
-  object_class->finalize = peas_extension_python_finalize;
+  object_class->dispose = peas_extension_python_dispose;
 
   extension_class->call = peas_extension_python_call;
 }
diff --git a/loaders/seed/peas-extension-seed.c b/loaders/seed/peas-extension-seed.c
index cbe0a51..8306248 100644
--- a/loaders/seed/peas-extension-seed.c
+++ b/loaders/seed/peas-extension-seed.c
@@ -80,12 +80,18 @@ peas_extension_seed_constructed (GObject *object)
 }
 
 static void
-peas_extension_seed_finalize (GObject *object)
+peas_extension_seed_dispose (GObject *object)
 {
   PeasExtensionSeed *sexten = PEAS_EXTENSION_SEED (object);
 
-  seed_value_unprotect (sexten->js_context, sexten->js_object);
-  seed_context_unref (sexten->js_context);
+  if (sexten->js_object != NULL)
+    {
+      seed_value_unprotect (sexten->js_context, sexten->js_object);
+      seed_context_unref (sexten->js_context);
+
+      sexten->js_object = NULL;
+      sexten->js_context = NULL;
+    }
 }
 
 static SeedValue
@@ -379,7 +385,7 @@ peas_extension_seed_class_init (PeasExtensionSeedClass *klass)
 
   object_class->set_property = peas_extension_seed_set_property;
   object_class->constructed = peas_extension_seed_constructed;
-  object_class->finalize = peas_extension_seed_finalize;
+  object_class->dispose = peas_extension_seed_dispose;
 
   extension_class->call = peas_extension_seed_call;
 
diff --git a/peas-demo/peas-demo-window.c b/peas-demo/peas-demo-window.c
index 097a81b..01d32ca 100644
--- a/peas-demo/peas-demo-window.c
+++ b/peas-demo/peas-demo-window.c
@@ -83,14 +83,23 @@ demo_window_init (DemoWindow *dw)
 }
 
 static void
-demo_window_finalize (GObject *object)
+demo_window_dispose (GObject *object)
 {
   DemoWindow *dw = DEMO_WINDOW (object);
 
-  g_object_unref (dw->exten_set);
-  g_object_unref (dw->engine);
+  if (dw->exten_set != NULL)
+    {
+      g_object_unref (dw->exten_set);
+      dw->exten_set = NULL;
+    }
 
-  G_OBJECT_CLASS (demo_window_parent_class)->finalize (object);
+  if (dw->engine != NULL)
+    {
+      g_object_unref (dw->engine);
+      dw->engine = NULL;
+    }
+
+  G_OBJECT_CLASS (demo_window_parent_class)->dispose (object);
 }
 
 static void
@@ -98,7 +107,7 @@ demo_window_class_init (DemoWindowClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  object_class->finalize = demo_window_finalize;
+  object_class->dispose = demo_window_dispose;
 
   klass->n_windows = 0;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]