[libpeas] Use dispose() instead of finalize() to unref extension instances.
- From: Steve Frécinaux <sfre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libpeas] Use dispose() instead of finalize() to unref extension instances.
- Date: Thu, 20 Jan 2011 16:14:06 +0000 (UTC)
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]