summaryrefslogtreecommitdiff
path: root/gio
diff options
context:
space:
mode:
Diffstat (limited to 'gio')
-rw-r--r--gio/gcancellable.c9
-rw-r--r--gio/gdbusprivate.c8
-rw-r--r--gio/gdbusprivate.h2
-rw-r--r--gio/gio.c29
-rw-r--r--gio/giomodule.c30
-rw-r--r--gio/gioprivate.h13
-rw-r--r--gio/gioscheduler.c4
-rw-r--r--gio/glocalfile.c9
-rw-r--r--gio/gproxyresolver.c10
-rw-r--r--gio/gresolver.c8
-rw-r--r--gio/gsocketconnection.c8
11 files changed, 55 insertions, 75 deletions
diff --git a/gio/gcancellable.c b/gio/gcancellable.c
index a1b153b45..b800c4096 100644
--- a/gio/gcancellable.c
+++ b/gio/gcancellable.c
@@ -759,11 +759,8 @@ g_cancellable_source_new (GCancellable *cancellable)
}
void
-_g_cancellable_deinit (void)
+g_cancellable_cleanup (void)
{
- if (cancellable_cond != NULL)
- {
- g_cond_free (cancellable_cond);
- cancellable_cond = NULL;
- }
+ g_cond_clear (&cancellable_cond);
+ g_mutex_clear (&cancellable_mutex);
}
diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c
index 886a98c05..5409ff398 100644
--- a/gio/gdbusprivate.c
+++ b/gio/gdbusprivate.c
@@ -1958,14 +1958,8 @@ _g_dbus_initialize (void)
}
void
-_g_dbus_deinitialize (void)
+g_dbus_cleanup (void)
{
- if (shared_thread_data)
- {
- g_assert_cmpint (shared_thread_data->num_users, ==, 1); /* if not, there's a leak */
- _g_dbus_shared_thread_unref ();
- }
-
_g_dbus_connection_deinit ();
_g_dbus_error_deinit ();
diff --git a/gio/gdbusprivate.h b/gio/gdbusprivate.h
index 912c8f93f..28448e4f1 100644
--- a/gio/gdbusprivate.h
+++ b/gio/gdbusprivate.h
@@ -84,7 +84,7 @@ void _g_dbus_worker_close (GDBusWorker *worker,
/* ---------------------------------------------------------------------------------------------------- */
void _g_dbus_initialize (void);
-void _g_dbus_deinitialize (void);
+void _g_dbus_cleanup (void);
gboolean _g_dbus_debug_authentication (void);
gboolean _g_dbus_debug_transport (void);
gboolean _g_dbus_debug_message (void);
diff --git a/gio/gio.c b/gio/gio.c
index c4eff03d9..f8d8cf7b0 100644
--- a/gio/gio.c
+++ b/gio/gio.c
@@ -20,18 +20,25 @@
#include "gio.h"
-#include "gdbusprivate.h"
+#include "glib/gconstructor.h"
#include "gioprivate.h"
-void
-g_io_deinit (void)
+#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
+#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS (gio_dtor)
+#endif
+G_DEFINE_DESTRUCTOR (gio_dtor)
+
+static void
+gio_dtor (void)
{
- _g_dbus_deinitialize ();
- _g_local_file_deinit ();
- _g_socket_connection_factory_deinit ();
- _g_io_module_deinit ();
- _g_cancellable_deinit ();
- _g_io_scheduler_deinit ();
- _g_proxy_resolver_deinit ();
- _g_resolver_deinit ();
+ if (G_LIKELY (!g_mem_do_cleanup))
+ return;
+
+ g_cancellable_cleanup ();
+ g_dbus_cleanup ();
+ g_io_module_cleanup ();
+ g_io_scheduler_cleanup ();
+ g_local_file_cleanup ();
+ g_resolver_cleanup ();
+ g_socket_connection_factory_cleanup ();
}
diff --git a/gio/giomodule.c b/gio/giomodule.c
index 37a64e347..1b2cd645a 100644
--- a/gio/giomodule.c
+++ b/gio/giomodule.c
@@ -628,8 +628,8 @@ g_io_modules_load_all_in_directory (const char *dirname)
return g_io_modules_load_all_in_directory_with_scope (dirname, NULL);
}
-GRecMutex default_modules_lock;
-GHashTable *default_modules;
+static GRecMutex default_modules_lock;
+static GHashTable *default_modules;
static gpointer
try_implementation (GIOExtension *extension,
@@ -704,7 +704,8 @@ _g_io_module_get_default (const gchar *extension_point,
}
else
{
- default_modules = g_hash_table_new (g_str_hash, g_str_equal);
+ default_modules = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
}
_g_io_modules_ensure_loaded ();
@@ -956,16 +957,6 @@ _g_io_modules_ensure_loaded (void)
G_UNLOCK (loaded_dirs);
}
-void
-_g_io_module_deinit (void)
-{
- if (extension_points != NULL)
- {
- g_hash_table_unref (extension_points);
- extension_points = NULL;
- }
-}
-
static void
g_io_extension_point_free (GIOExtensionPoint *ep)
{
@@ -1284,3 +1275,16 @@ g_io_extension_get_priority (GIOExtension *extension)
{
return extension->priority;
}
+
+void
+g_io_module_cleanup (void)
+{
+ g_clear_pointer (&extension_points, g_hash_table_unref);
+ g_mutex_clear (&G_LOCK_NAME (extension_points));
+
+ g_clear_pointer (&default_modules, g_hash_table_unref);
+ g_rec_mutex_clear (&default_modules_lock);
+
+ g_mutex_clear (&G_LOCK_NAME (registered_extensions));
+ g_mutex_clear (&G_LOCK_NAME (loaded_dirs));
+}
diff --git a/gio/gioprivate.h b/gio/gioprivate.h
index 490568c26..917ca23a4 100644
--- a/gio/gioprivate.h
+++ b/gio/gioprivate.h
@@ -25,13 +25,12 @@
G_BEGIN_DECLS
-G_GNUC_INTERNAL void _g_cancellable_deinit (void);
-G_GNUC_INTERNAL void _g_io_module_deinit (void);
-G_GNUC_INTERNAL void _g_io_scheduler_deinit (void);
-G_GNUC_INTERNAL void _g_local_file_deinit (void);
-G_GNUC_INTERNAL void _g_proxy_resolver_deinit (void);
-G_GNUC_INTERNAL void _g_resolver_deinit (void);
-G_GNUC_INTERNAL void _g_socket_connection_factory_deinit (void);
+G_GNUC_INTERNAL void g_cancellable_cleanup (void);
+G_GNUC_INTERNAL void g_io_module_cleanup (void);
+G_GNUC_INTERNAL void g_io_scheduler_cleanup (void);
+G_GNUC_INTERNAL void g_local_file_cleanup (void);
+G_GNUC_INTERNAL void g_resolver_cleanup (void);
+G_GNUC_INTERNAL void g_socket_connection_factory_cleanup (void);
G_END_DECLS
diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c
index c90934e13..c43728042 100644
--- a/gio/gioscheduler.c
+++ b/gio/gioscheduler.c
@@ -392,11 +392,11 @@ g_io_scheduler_job_send_to_mainloop_async (GIOSchedulerJob *job,
}
void
-_g_io_scheduler_deinit (void)
+g_io_scheduler_cleanup (void)
{
if (job_thread_pool)
{
- g_thread_pool_free (job_thread_pool, FALSE, FALSE);
+ g_thread_pool_free (job_thread_pool, FALSE, TRUE);
job_thread_pool = NULL;
}
}
diff --git a/gio/glocalfile.c b/gio/glocalfile.c
index faa065412..1e7bee618 100644
--- a/gio/glocalfile.c
+++ b/gio/glocalfile.c
@@ -182,13 +182,10 @@ g_local_file_class_init (GLocalFileClass *klass)
}
void
-_g_local_file_deinit (void)
+g_local_file_cleanup (void)
{
- if (local_writable_attributes != NULL)
- {
- g_file_attribute_info_list_unref (local_writable_attributes);
- local_writable_attributes = NULL;
- }
+ g_clear_pointer (&local_writable_attributes,
+ g_file_attribute_info_list_unref);
}
static void
diff --git a/gio/gproxyresolver.c b/gio/gproxyresolver.c
index d4ca7b322..e13ca352a 100644
--- a/gio/gproxyresolver.c
+++ b/gio/gproxyresolver.c
@@ -196,13 +196,3 @@ g_proxy_resolver_lookup_finish (GProxyResolver *resolver,
return (* iface->lookup_finish) (resolver, result, error);
}
-
-void
-_g_proxy_resolver_deinit (void)
-{
- if (default_proxy_resolver)
- {
- g_object_unref (default_proxy_resolver);
- default_proxy_resolver = NULL;
- }
-}
diff --git a/gio/gresolver.c b/gio/gresolver.c
index 0eaba5777..4ab9df948 100644
--- a/gio/gresolver.c
+++ b/gio/gresolver.c
@@ -1426,11 +1426,7 @@ _g_resolver_records_from_DnsQuery (const gchar *rrname,
#endif
void
-_g_resolver_deinit (void)
+g_resolver_cleanup (void)
{
- if (default_resolver)
- {
- g_object_unref (default_resolver);
- default_resolver = NULL;
- }
+ g_clear_object (&default_resolver);
}
diff --git a/gio/gsocketconnection.c b/gio/gsocketconnection.c
index f9bf5c892..dc994d4e6 100644
--- a/gio/gsocketconnection.c
+++ b/gio/gsocketconnection.c
@@ -557,13 +557,9 @@ static GHashTable *connection_factories = NULL;
G_LOCK_DEFINE_STATIC(connection_factories);
void
-_g_socket_connection_factory_deinit (void)
+g_socket_connection_factory_cleanup (void)
{
- if (connection_factories != NULL)
- {
- g_hash_table_unref (connection_factories);
- connection_factories = NULL;
- }
+ g_clear_pointer (&connection_factories, g_hash_table_unref);
}
/**