summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2012-01-30 14:18:22 +0100
committerVincent Untz <vuntz@gnome.org>2012-01-30 15:05:41 +0100
commit0dde8be271f19cfc2368aaf59f25a48f5ee51f08 (patch)
treee5dc0663a6696749d1a3c80218be2238c6fb00c9
parent0e17e7b82ff81d678dee17ad44f472672fb41327 (diff)
downloadlibwnck-0dde8be271f19cfc2368aaf59f25a48f5ee51f08.tar.gz
core: Use a destroy notify in hash tables to unref when removing item
We were manually unreferencing objects from hash tables when remove them, instead of using an automatic, and therefore safer, mechanism.
-rw-r--r--libwnck/application.c44
-rw-r--r--libwnck/class-group.c38
-rw-r--r--libwnck/window.c18
3 files changed, 41 insertions, 59 deletions
diff --git a/libwnck/application.c b/libwnck/application.c
index 9171549..edd32e6 100644
--- a/libwnck/application.c
+++ b/libwnck/application.c
@@ -99,6 +99,16 @@ static void wnck_application_finalize (GObject *object);
static guint signals[LAST_SIGNAL] = { 0 };
+void
+_wnck_application_shutdown_all (void)
+{
+ if (app_hash != NULL)
+ {
+ g_hash_table_destroy (app_hash);
+ app_hash = NULL;
+ }
+}
+
static void
wnck_application_init (WnckApplication *application)
{
@@ -522,7 +532,8 @@ _wnck_application_create (Window xwindow,
Screen *xscreen;
if (app_hash == NULL)
- app_hash = g_hash_table_new (_wnck_xid_hash, _wnck_xid_equal);
+ app_hash = g_hash_table_new_full (_wnck_xid_hash, _wnck_xid_equal,
+ NULL, g_object_unref);
g_return_val_if_fail (g_hash_table_lookup (app_hash, &xwindow) == NULL,
NULL);
@@ -566,14 +577,15 @@ _wnck_application_create (Window xwindow,
void
_wnck_application_destroy (WnckApplication *application)
{
- g_return_if_fail (wnck_application_get (application->priv->xwindow) == application);
+ Window xwindow = application->priv->xwindow;
- g_hash_table_remove (app_hash, &application->priv->xwindow);
+ g_return_if_fail (wnck_application_get (xwindow) == application);
- g_return_if_fail (wnck_application_get (application->priv->xwindow) == NULL);
+ g_hash_table_remove (app_hash, &xwindow);
- /* remove hash's ref on the application */
- g_object_unref (G_OBJECT (application));
+ /* Removing from hash also removes the only ref WnckApplication had */
+
+ g_return_if_fail (wnck_application_get (xwindow) == NULL);
}
static void
@@ -677,26 +689,6 @@ _wnck_application_process_property_notify (WnckApplication *app,
}
static void
-_wnck_app_iter_destroy_application (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- g_object_unref (WNCK_APPLICATION (value));
-}
-
-void
-_wnck_application_shutdown_all (void)
-{
- if (app_hash != NULL)
- {
- g_hash_table_foreach (app_hash, _wnck_app_iter_destroy_application, NULL);
- g_hash_table_destroy (app_hash);
- app_hash = NULL;
- }
-}
-
-
-static void
emit_name_changed (WnckApplication *app)
{
g_signal_emit (G_OBJECT (app),
diff --git a/libwnck/class-group.c b/libwnck/class-group.c
index 56e48d2..6676d49 100644
--- a/libwnck/class-group.c
+++ b/libwnck/class-group.c
@@ -80,6 +80,16 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
+void
+_wnck_class_group_shutdown_all (void)
+{
+ if (class_group_hash != NULL)
+ {
+ g_hash_table_destroy (class_group_hash);
+ class_group_hash = NULL;
+ }
+}
+
static void
wnck_class_group_class_init (WnckClassGroupClass *class)
{
@@ -200,7 +210,8 @@ _wnck_class_group_create (const char *res_class)
WnckClassGroup *class_group;
if (class_group_hash == NULL)
- class_group_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ class_group_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ NULL, g_object_unref);
g_return_val_if_fail (g_hash_table_lookup (class_group_hash, res_class ? res_class : "") == NULL,
NULL);
@@ -229,11 +240,7 @@ _wnck_class_group_destroy (WnckClassGroup *class_group)
g_hash_table_remove (class_group_hash, class_group->priv->res_class);
- g_free (class_group->priv->res_class);
- class_group->priv->res_class = NULL;
-
- /* remove hash's ref on the class group */
- g_object_unref (class_group);
+ /* Removing from hash also removes the only ref WnckClassGroup had */
}
static const char *
@@ -636,22 +643,3 @@ wnck_class_group_get_mini_icon (WnckClassGroup *class_group)
return class_group->priv->mini_icon;
}
-
-static void
-_wnck_class_iter_destroy_class_group (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- g_object_unref (WNCK_CLASS_GROUP (value));
-}
-
-void
-_wnck_class_group_shutdown_all (void)
-{
- if (class_group_hash != NULL)
- {
- g_hash_table_foreach (class_group_hash, _wnck_class_iter_destroy_class_group, NULL);
- g_hash_table_destroy (class_group_hash);
- class_group_hash = NULL;
- }
-}
diff --git a/libwnck/window.c b/libwnck/window.c
index 3c6584b..8d77a50 100644
--- a/libwnck/window.c
+++ b/libwnck/window.c
@@ -455,6 +455,8 @@ wnck_window_finalize (GObject *object)
g_free (window->priv->res_name);
window->priv->res_name = NULL;
+ window->priv->xwindow = None;
+
G_OBJECT_CLASS (wnck_window_parent_class)->finalize (object);
}
@@ -504,7 +506,8 @@ _wnck_window_create (Window xwindow,
Screen *xscreen;
if (window_hash == NULL)
- window_hash = g_hash_table_new (_wnck_xid_hash, _wnck_xid_equal);
+ window_hash = g_hash_table_new_full (_wnck_xid_hash, _wnck_xid_equal,
+ NULL, g_object_unref);
g_return_val_if_fail (g_hash_table_lookup (window_hash, &xwindow) == NULL,
NULL);
@@ -574,18 +577,17 @@ _wnck_window_create (Window xwindow,
void
_wnck_window_destroy (WnckWindow *window)
{
- g_return_if_fail (WNCK_IS_WINDOW (window));
+ Window xwindow = window->priv->xwindow;
- g_return_if_fail (wnck_window_get (window->priv->xwindow) == window);
+ g_return_if_fail (WNCK_IS_WINDOW (window));
- g_hash_table_remove (window_hash, &window->priv->xwindow);
+ g_return_if_fail (wnck_window_get (xwindow) == window);
- g_return_if_fail (wnck_window_get (window->priv->xwindow) == NULL);
+ g_hash_table_remove (window_hash, &xwindow);
- window->priv->xwindow = None;
+ /* Removing from hash also removes the only ref WnckWindow had */
- /* remove hash's ref on the window */
- g_object_unref (G_OBJECT (window));
+ g_return_if_fail (wnck_window_get (xwindow) == NULL);
}
void