[Xfce4-commits] [apps/xfdashboard] 01/02: Hardening creation of singleton except window tracker related ones as they are too dynamic.

noreply at xfce.org noreply at xfce.org
Fri Feb 9 10:19:56 CET 2018


This is an automated email from the git hooks/post-receive script.

n   o   m   a   d       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository apps/xfdashboard.

commit 11886db92b89f2e34adc18293e46eeb9d2d2ce4f
Author: Stephan Haller <nomad at froevel.de>
Date:   Fri Feb 9 10:16:41 2018 +0100

    Hardening creation of singleton except window tracker related ones as they are too dynamic.
---
 libxfdashboard/application-database.c | 50 +++++++++++++++++++++++++++-------
 libxfdashboard/application-tracker.c  | 45 +++++++++++++++++++++++++------
 libxfdashboard/bindings-pool.c        | 47 +++++++++++++++++++++++++++-----
 libxfdashboard/focus-manager.c        | 51 ++++++++++++++++++++++++++++-------
 libxfdashboard/plugins-manager.c      | 50 +++++++++++++++++++++++++++-------
 libxfdashboard/search-manager.c       | 50 +++++++++++++++++++++++++++-------
 libxfdashboard/view-manager.c         | 50 +++++++++++++++++++++++++++-------
 7 files changed, 283 insertions(+), 60 deletions(-)

diff --git a/libxfdashboard/application-database.c b/libxfdashboard/application-database.c
index 22bbc4b..f8530f7 100644
--- a/libxfdashboard/application-database.c
+++ b/libxfdashboard/application-database.c
@@ -1236,11 +1236,33 @@ static void _xfdashboard_application_database_check_search_path_duplicate(gpoint
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_application_database_constructor(GType inType,
+																guint inNumberConstructParams,
+																GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_application_database)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_application_database_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_application_database=XFDASHBOARD_APPLICATION_DATABASE(object);
+g_message("%s: Created singleton for application database %p", __func__, _xfdashboard_application_database);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_application_database));
+g_message("%s: Increased reference counter to %u for singleton of application database %p", __func__, G_OBJECT(_xfdashboard_application_database)->ref_count, _xfdashboard_application_database);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_application_database_dispose(GObject *inObject)
 {
-	XfdashboardApplicationDatabase							*self=XFDASHBOARD_APPLICATION_DATABASE(inObject);
-	XfdashboardApplicationDatabasePrivate					*priv=self->priv;
+	XfdashboardApplicationDatabase			*self=XFDASHBOARD_APPLICATION_DATABASE(inObject);
+	XfdashboardApplicationDatabasePrivate	*priv=self->priv;
 
 	/* Release allocated resources */
 	_xfdashboard_application_database_clean(self);
@@ -1251,14 +1273,23 @@ static void _xfdashboard_application_database_dispose(GObject *inObject)
 		priv->searchPaths=NULL;
 	}
 
-	/* Unset singleton */
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_application_database_parent_class)->dispose(inObject);
+g_message("%s: Decreased reference counter to %u for singleton of application database %p", __func__, G_OBJECT(_xfdashboard_application_database)->ref_count, _xfdashboard_application_database);
+}
+
+/* Finalize this object */
+static void _xfdashboard_application_database_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
 	if(G_LIKELY(G_OBJECT(_xfdashboard_application_database)==inObject))
 	{
+g_message("%s: Finally unset application database %p", __func__, _xfdashboard_application_database);
 		_xfdashboard_application_database=NULL;
 	}
 
 	/* Call parent's class dispose method */
-	G_OBJECT_CLASS(xfdashboard_application_database_parent_class)->dispose(inObject);
+	G_OBJECT_CLASS(xfdashboard_application_database_parent_class)->finalize(inObject);
 }
 
 /* Set/get properties */
@@ -1291,7 +1322,9 @@ static void xfdashboard_application_database_class_init(XfdashboardApplicationDa
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_application_database_constructor;
 	gobjectClass->dispose=_xfdashboard_application_database_dispose;
+	gobjectClass->finalize=_xfdashboard_application_database_finalize;
 	gobjectClass->get_property=_xfdashboard_application_database_get_property;
 
 	/* Set up private structure */
@@ -1405,13 +1438,10 @@ static void xfdashboard_application_database_init(XfdashboardApplicationDatabase
 /* Get single instance of application */
 XfdashboardApplicationDatabase* xfdashboard_application_database_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_application_database==NULL))
-	{
-		_xfdashboard_application_database=g_object_new(XFDASHBOARD_TYPE_APPLICATION_DATABASE, NULL);
-	}
-		else g_object_ref(_xfdashboard_application_database);
+	GObject									*singleton;
 
-	return(_xfdashboard_application_database);
+	singleton=g_object_new(XFDASHBOARD_TYPE_APPLICATION_DATABASE, NULL);
+	return(XFDASHBOARD_APPLICATION_DATABASE(singleton));
 }
 
 /* Determine if menu and applications has been loaded successfully */
diff --git a/libxfdashboard/application-tracker.c b/libxfdashboard/application-tracker.c
index af0e31d..af1eef0 100644
--- a/libxfdashboard/application-tracker.c
+++ b/libxfdashboard/application-tracker.c
@@ -931,6 +931,28 @@ static void _xfdashboard_application_tracker_on_active_window_changed(Xfdashboar
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_application_tracker_constructor(GType inType,
+																guint inNumberConstructParams,
+																GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_application_tracker)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_application_tracker_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_application_tracker=XFDASHBOARD_APPLICATION_TRACKER(object);
+g_message("%s: Created singleton for application tracker %p", __func__, _xfdashboard_application_tracker);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_application_tracker));
+g_message("%s: Increased reference counter to %u for singleton of application tracker %p", __func__, G_OBJECT(_xfdashboard_application_tracker)->ref_count, _xfdashboard_application_tracker);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_application_tracker_dispose(GObject *inObject)
 {
@@ -957,14 +979,22 @@ static void _xfdashboard_application_tracker_dispose(GObject *inObject)
 		priv->appDatabase=NULL;
 	}
 
-	/* Unset singleton */
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_application_tracker_parent_class)->dispose(inObject);
+}
+
+/* Finalize this object */
+static void _xfdashboard_application_tracker_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
 	if(G_LIKELY(G_OBJECT(_xfdashboard_application_tracker)==inObject))
 	{
+g_message("%s: Finally unset application tracker %p", __func__, _xfdashboard_application_tracker);
 		_xfdashboard_application_tracker=NULL;
 	}
 
 	/* Call parent's class dispose method */
-	G_OBJECT_CLASS(xfdashboard_application_tracker_parent_class)->dispose(inObject);
+	G_OBJECT_CLASS(xfdashboard_application_tracker_parent_class)->finalize(inObject);
 }
 
 /* Class initialization
@@ -976,7 +1006,9 @@ static void xfdashboard_application_tracker_class_init(XfdashboardApplicationTra
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_application_tracker_constructor;
 	gobjectClass->dispose=_xfdashboard_application_tracker_dispose;
+	gobjectClass->finalize=_xfdashboard_application_tracker_finalize;
 
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardApplicationTrackerPrivate));
@@ -1036,13 +1068,10 @@ static void xfdashboard_application_tracker_init(XfdashboardApplicationTracker *
 /* Get single instance of application */
 XfdashboardApplicationTracker* xfdashboard_application_tracker_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_application_tracker==NULL))
-	{
-		_xfdashboard_application_tracker=g_object_new(XFDASHBOARD_TYPE_APPLICATION_TRACKER, NULL);
-	}
-		else g_object_ref(_xfdashboard_application_tracker);
+	GObject									*singleton;
 
-	return(_xfdashboard_application_tracker);
+	singleton=g_object_new(XFDASHBOARD_TYPE_APPLICATION_TRACKER, NULL);
+	return(XFDASHBOARD_APPLICATION_TRACKER(singleton));
 }
 
 /* Get running state of application */
diff --git a/libxfdashboard/bindings-pool.c b/libxfdashboard/bindings-pool.c
index 14bcb02..70e49d9 100644
--- a/libxfdashboard/bindings-pool.c
+++ b/libxfdashboard/bindings-pool.c
@@ -941,6 +941,28 @@ static gboolean _xfdashboard_bindings_pool_load_bindings_from_file(XfdashboardBi
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_bindings_pool_constructor(GType inType,
+														guint inNumberConstructParams,
+														GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_bindings_pool)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_bindings_pool_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_bindings_pool=XFDASHBOARD_BINDINGS_POOL(object);
+g_message("%s: Created singleton for bindings pool %p", __func__, _xfdashboard_bindings_pool);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_bindings_pool));
+g_message("%s: Increased reference counter to %u for singleton of bindings pool %p", __func__, G_OBJECT(_xfdashboard_bindings_pool)->ref_count, _xfdashboard_bindings_pool);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_bindings_pool_dispose(GObject *inObject)
 {
@@ -958,6 +980,20 @@ static void _xfdashboard_bindings_pool_dispose(GObject *inObject)
 	G_OBJECT_CLASS(xfdashboard_bindings_pool_parent_class)->dispose(inObject);
 }
 
+/* Finalize this object */
+static void _xfdashboard_bindings_pool_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
+	if(G_LIKELY(G_OBJECT(_xfdashboard_bindings_pool)==inObject))
+	{
+g_message("%s: Finally unset bindings pool %p", __func__, _xfdashboard_bindings_pool);
+		_xfdashboard_bindings_pool=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_bindings_pool_parent_class)->finalize(inObject);
+}
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
@@ -967,7 +1003,9 @@ static void xfdashboard_bindings_pool_class_init(XfdashboardBindingsPoolClass *k
 	GObjectClass					*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_bindings_pool_constructor;
 	gobjectClass->dispose=_xfdashboard_bindings_pool_dispose;
+	gobjectClass->finalize=_xfdashboard_bindings_pool_finalize;
 
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardBindingsPoolPrivate));
@@ -998,13 +1036,10 @@ GQuark xfdashboard_bindings_pool_error_quark(void)
 /* Get single instance of manager */
 XfdashboardBindingsPool* xfdashboard_bindings_pool_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_bindings_pool==NULL))
-	{
-		_xfdashboard_bindings_pool=g_object_new(XFDASHBOARD_TYPE_BINDINGS_POOL, NULL);
-	}
-		else g_object_ref(_xfdashboard_bindings_pool);
+	GObject									*singleton;
 
-	return(_xfdashboard_bindings_pool);
+	singleton=g_object_new(XFDASHBOARD_TYPE_BINDINGS_POOL, NULL);
+	return(XFDASHBOARD_BINDINGS_POOL(singleton));
 }
 
 /* Load bindings from configuration file */
diff --git a/libxfdashboard/focus-manager.c b/libxfdashboard/focus-manager.c
index 5ac2bd6..e99a4b9 100644
--- a/libxfdashboard/focus-manager.c
+++ b/libxfdashboard/focus-manager.c
@@ -327,6 +327,28 @@ static gboolean _xfdashboard_focus_manager_move_focus_previous(XfdashboardFocusM
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_focus_manager_constructor(GType inType,
+														guint inNumberConstructParams,
+														GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_focus_manager)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_focus_manager_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_focus_manager=XFDASHBOARD_FOCUS_MANAGER(object);
+g_message("%s: Created singleton for focus manager %p", __func__, _xfdashboard_focus_manager);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_focus_manager));
+g_message("%s: Increased reference counter to %u for singleton of focus manager %p", __func__, G_OBJECT(_xfdashboard_focus_manager)->ref_count, _xfdashboard_focus_manager);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_focus_manager_dispose_unregister_focusable(gpointer inData, gpointer inUserData)
 {
@@ -366,13 +388,25 @@ static void _xfdashboard_focus_manager_dispose(GObject *inObject)
 		priv->registeredFocusables=NULL;
 	}
 
-	/* Unset singleton */
-	if(G_LIKELY(G_OBJECT(_xfdashboard_focus_manager)==inObject)) _xfdashboard_focus_manager=NULL;
-
 	/* Call parent's class dispose method */
 	G_OBJECT_CLASS(xfdashboard_focus_manager_parent_class)->dispose(inObject);
 }
 
+/* Finalize this object */
+static void _xfdashboard_focus_manager_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
+	if(G_LIKELY(G_OBJECT(_xfdashboard_focus_manager)==inObject))
+	{
+g_message("%s: Finally unset focus manager %p", __func__, _xfdashboard_focus_manager);
+		_xfdashboard_focus_manager=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_focus_manager_parent_class)->finalize(inObject);
+}
+
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
@@ -382,7 +416,9 @@ static void xfdashboard_focus_manager_class_init(XfdashboardFocusManagerClass *k
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_focus_manager_constructor;
 	gobjectClass->dispose=_xfdashboard_focus_manager_dispose;
+	gobjectClass->finalize=_xfdashboard_focus_manager_finalize;
 
 	klass->focus_move_first=_xfdashboard_focus_manager_move_focus_first;
 	klass->focus_move_last=_xfdashboard_focus_manager_move_focus_last;
@@ -506,13 +542,10 @@ static void xfdashboard_focus_manager_init(XfdashboardFocusManager *self)
 /* Get single instance of manager */
 XfdashboardFocusManager* xfdashboard_focus_manager_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_focus_manager==NULL))
-	{
-		_xfdashboard_focus_manager=g_object_new(XFDASHBOARD_TYPE_FOCUS_MANAGER, NULL);
-	}
-		else g_object_ref(_xfdashboard_focus_manager);
+	GObject									*singleton;
 
-	return(_xfdashboard_focus_manager);
+	singleton=g_object_new(XFDASHBOARD_TYPE_FOCUS_MANAGER, NULL);
+	return(XFDASHBOARD_FOCUS_MANAGER(singleton));
 }
 
 /* Register a focusable actor */
diff --git a/libxfdashboard/plugins-manager.c b/libxfdashboard/plugins-manager.c
index a2f54fb..e8725c9 100644
--- a/libxfdashboard/plugins-manager.c
+++ b/libxfdashboard/plugins-manager.c
@@ -504,6 +504,28 @@ static void _xfdashboard_plugins_manager_on_application_initialized(XfdashboardP
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_plugins_manager_constructor(GType inType,
+															guint inNumberConstructParams,
+															GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_plugins_manager)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_plugins_manager_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_plugins_manager=XFDASHBOARD_PLUGINS_MANAGER(object);
+g_message("%s: Created singleton for plugins manager %p", __func__, _xfdashboard_plugins_manager);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_plugins_manager));
+g_message("%s: Increased reference counter to %u for singleton of plugins manager %p", __func__, G_OBJECT(_xfdashboard_plugins_manager)->ref_count, _xfdashboard_plugins_manager);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_plugins_manager_dispose_remove_plugin(gpointer inData)
 {
@@ -549,13 +571,24 @@ static void _xfdashboard_plugins_manager_dispose(GObject *inObject)
 		priv->searchPaths=NULL;
 	}
 
-	/* Unset singleton */
-	if(G_LIKELY(G_OBJECT(_xfdashboard_plugins_manager)==inObject)) _xfdashboard_plugins_manager=NULL;
-
 	/* Call parent's class dispose method */
 	G_OBJECT_CLASS(xfdashboard_plugins_manager_parent_class)->dispose(inObject);
 }
 
+/* Finalize this object */
+static void _xfdashboard_plugins_manager_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
+	if(G_LIKELY(G_OBJECT(_xfdashboard_plugins_manager)==inObject))
+	{
+g_message("%s: Finally unset plugins manager %p", __func__, _xfdashboard_plugins_manager);
+		_xfdashboard_plugins_manager=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_plugins_manager_parent_class)->finalize(inObject);
+}
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
@@ -565,7 +598,9 @@ static void xfdashboard_plugins_manager_class_init(XfdashboardPluginsManagerClas
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_plugins_manager_constructor;
 	gobjectClass->dispose=_xfdashboard_plugins_manager_dispose;
+	gobjectClass->finalize=_xfdashboard_plugins_manager_finalize;
 
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardPluginsManagerPrivate));
@@ -617,13 +652,10 @@ static void xfdashboard_plugins_manager_init(XfdashboardPluginsManager *self)
  */
 XfdashboardPluginsManager* xfdashboard_plugins_manager_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_plugins_manager==NULL))
-	{
-		_xfdashboard_plugins_manager=g_object_new(XFDASHBOARD_TYPE_PLUGINS_MANAGER, NULL);
-	}
-		else g_object_ref(_xfdashboard_plugins_manager);
+	GObject									*singleton;
 
-	return(_xfdashboard_plugins_manager);
+	singleton=g_object_new(XFDASHBOARD_TYPE_PLUGINS_MANAGER, NULL);
+	return(XFDASHBOARD_PLUGINS_MANAGER(singleton));
 }
 
 /**
diff --git a/libxfdashboard/search-manager.c b/libxfdashboard/search-manager.c
index 30289f1..db1c1ac 100644
--- a/libxfdashboard/search-manager.c
+++ b/libxfdashboard/search-manager.c
@@ -157,6 +157,28 @@ static XfdashboardSearchManagerData* _xfdashboard_search_manager_entry_find_data
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_search_manager_constructor(GType inType,
+														guint inNumberConstructParams,
+														GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_search_manager)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_search_manager_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_search_manager=XFDASHBOARD_SEARCH_MANAGER(object);
+g_message("%s: Created singleton for search manager %p", __func__, _xfdashboard_search_manager);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_search_manager));
+g_message("%s: Increased reference counter to %u for singleton of search manager %p", __func__, G_OBJECT(_xfdashboard_search_manager)->ref_count, _xfdashboard_search_manager);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_search_manager_dispose_unregister_search_provider(gpointer inData, gpointer inUserData)
 {
@@ -181,13 +203,24 @@ static void _xfdashboard_search_manager_dispose(GObject *inObject)
 		priv->registeredProviders=NULL;
 	}
 
-	/* Unset singleton */
-	if(G_LIKELY(G_OBJECT(_xfdashboard_search_manager)==inObject)) _xfdashboard_search_manager=NULL;
-
 	/* Call parent's class dispose method */
 	G_OBJECT_CLASS(xfdashboard_search_manager_parent_class)->dispose(inObject);
 }
 
+/* Finalize this object */
+static void _xfdashboard_search_manager_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
+	if(G_LIKELY(G_OBJECT(_xfdashboard_search_manager)==inObject))
+	{
+g_message("%s: Finally unset search manager %p", __func__, _xfdashboard_search_manager);
+		_xfdashboard_search_manager=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_search_manager_parent_class)->finalize(inObject);
+}
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
@@ -197,7 +230,9 @@ static void xfdashboard_search_manager_class_init(XfdashboardSearchManagerClass
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_search_manager_constructor;
 	gobjectClass->dispose=_xfdashboard_search_manager_dispose;
+	gobjectClass->finalize=_xfdashboard_search_manager_finalize;
 
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardSearchManagerPrivate));
@@ -246,13 +281,10 @@ static void xfdashboard_search_manager_init(XfdashboardSearchManager *self)
 /* Get single instance of manager */
 XfdashboardSearchManager* xfdashboard_search_manager_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_search_manager==NULL))
-	{
-		_xfdashboard_search_manager=g_object_new(XFDASHBOARD_TYPE_SEARCH_MANAGER, NULL);
-	}
-		else g_object_ref(_xfdashboard_search_manager);
+	GObject									*singleton;
 
-	return(_xfdashboard_search_manager);
+	singleton=g_object_new(XFDASHBOARD_TYPE_SEARCH_MANAGER, NULL);
+	return(XFDASHBOARD_SEARCH_MANAGER(singleton));
 }
 
 /* Register a search provider */
diff --git a/libxfdashboard/view-manager.c b/libxfdashboard/view-manager.c
index abbc99b..8bf1363 100644
--- a/libxfdashboard/view-manager.c
+++ b/libxfdashboard/view-manager.c
@@ -152,6 +152,28 @@ static XfdashboardViewManagerData* _xfdashboard_view_manager_entry_find_data_by_
 
 /* IMPLEMENTATION: GObject */
 
+/* Construct this object */
+static GObject* _xfdashboard_view_manager_constructor(GType inType,
+														guint inNumberConstructParams,
+														GObjectConstructParam *inConstructParams)
+{
+	GObject									*object;
+
+	if(!_xfdashboard_view_manager)
+	{
+		object=G_OBJECT_CLASS(xfdashboard_view_manager_parent_class)->constructor(inType, inNumberConstructParams, inConstructParams);
+		_xfdashboard_view_manager=XFDASHBOARD_VIEW_MANAGER(object);
+g_message("%s: Created singleton for view manager %p", __func__, _xfdashboard_view_manager);
+	}
+		else
+		{
+			object=g_object_ref(G_OBJECT(_xfdashboard_view_manager));
+g_message("%s: Increased reference counter to %u for singleton of view manager %p", __func__, G_OBJECT(_xfdashboard_view_manager)->ref_count, _xfdashboard_view_manager);
+		}
+
+	return(object);
+}
+
 /* Dispose this object */
 static void _xfdashboard_view_manager_dispose_unregister_view(gpointer inData, gpointer inUserData)
 {
@@ -176,13 +198,24 @@ static void _xfdashboard_view_manager_dispose(GObject *inObject)
 		priv->registeredViews=NULL;
 	}
 
-	/* Unset singleton */
-	if(G_LIKELY(G_OBJECT(_xfdashboard_view_manager)==inObject)) _xfdashboard_view_manager=NULL;
-
 	/* Call parent's class dispose method */
 	G_OBJECT_CLASS(xfdashboard_view_manager_parent_class)->dispose(inObject);
 }
 
+/* Finalize this object */
+static void _xfdashboard_view_manager_finalize(GObject *inObject)
+{
+	/* Release allocated resources finally, e.g. unset singleton */
+	if(G_LIKELY(G_OBJECT(_xfdashboard_view_manager)==inObject))
+	{
+g_message("%s: Finally unset view manager %p", __func__, _xfdashboard_view_manager);
+		_xfdashboard_view_manager=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_view_manager_parent_class)->finalize(inObject);
+}
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
@@ -192,7 +225,9 @@ static void xfdashboard_view_manager_class_init(XfdashboardViewManagerClass *kla
 	GObjectClass		*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
+	gobjectClass->constructor=_xfdashboard_view_manager_constructor;
 	gobjectClass->dispose=_xfdashboard_view_manager_dispose;
+	gobjectClass->finalize=_xfdashboard_view_manager_finalize;
 
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardViewManagerPrivate));
@@ -241,13 +276,10 @@ static void xfdashboard_view_manager_init(XfdashboardViewManager *self)
 /* Get single instance of manager */
 XfdashboardViewManager* xfdashboard_view_manager_get_default(void)
 {
-	if(G_UNLIKELY(_xfdashboard_view_manager==NULL))
-	{
-		_xfdashboard_view_manager=g_object_new(XFDASHBOARD_TYPE_VIEW_MANAGER, NULL);
-	}
-		else g_object_ref(_xfdashboard_view_manager);
+	GObject									*singleton;
 
-	return(_xfdashboard_view_manager);
+	singleton=g_object_new(XFDASHBOARD_TYPE_VIEW_MANAGER, NULL);
+	return(XFDASHBOARD_VIEW_MANAGER(singleton));
 }
 
 /* Register a view */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list