[glib/wip/free: 6/6] gio stuff
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/free: 6/6] gio stuff
- Date: Thu, 31 Oct 2013 15:34:06 +0000 (UTC)
commit 3389e6b686d4aad739780927b4db333e7d8af0c0
Author: Dan Winship <danw gnome org>
Date: Mon Sep 3 08:33:13 2012 -0400
gio stuff
gio/gcancellable.c | 9 +++------
gio/gdbusprivate.c | 8 +-------
gio/gdbusprivate.h | 2 +-
gio/gio.c | 29 ++++++++++++++++++-----------
gio/giomodule.c | 30 +++++++++++++++++-------------
gio/gioprivate.h | 13 ++++++-------
gio/gioscheduler.c | 4 ++--
gio/glocalfile.c | 9 +++------
gio/gproxyresolver.c | 10 ----------
gio/gresolver.c | 8 ++------
gio/gsocketconnection.c | 8 ++------
glib/glib-init.c | 1 +
glib/glib-init.h | 1 +
glib/gthread-posix.c | 2 +-
glib/gthreadpool.c | 33 ++++++++++++++++++++++++++-------
15 files changed, 84 insertions(+), 83 deletions(-)
---
diff --git a/gio/gcancellable.c b/gio/gcancellable.c
index a1b153b..b800c40 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 886a98c..5409ff3 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 912c8f9..28448e4 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 c4eff03..f8d8cf7 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 37a64e3..1b2cd64 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 490568c..917ca23 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 c90934e..c437280 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 faa0654..1e7bee6 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 d4ca7b3..e13ca35 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 0eaba57..4ab9df9 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 f9bf5c8..dc994d4 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);
}
/**
diff --git a/glib/glib-init.c b/glib/glib-init.c
index d5d8123..169993a 100644
--- a/glib/glib-init.c
+++ b/glib/glib-init.c
@@ -246,6 +246,7 @@ glib_cleanup (void)
g_main_cleanup ();
g_quark_cleanup ();
g_rand_cleanup ();
+ g_thread_pool_cleanup ();
g_time_zone_cleanup ();
g_utils_cleanup ();
g_variant_type_info_cleanup ();
diff --git a/glib/glib-init.h b/glib/glib-init.h
index bcf23bd..4887421 100644
--- a/glib/glib-init.h
+++ b/glib/glib-init.h
@@ -49,6 +49,7 @@ G_GNUC_INTERNAL void g_slice_cleanup (void);
G_GNUC_INTERNAL void g_system_thread_cleanup (void);
G_GNUC_INTERNAL void g_test_cleanup (void);
G_GNUC_INTERNAL void g_threading_cleanup (void);
+G_GNUC_INTERNAL void g_thread_pool_cleanup (void);
G_GNUC_INTERNAL void g_time_zone_cleanup (void);
G_GNUC_INTERNAL void g_utils_cleanup (void);
G_GNUC_INTERNAL void g_variant_type_info_cleanup (void);
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
index bd48c6b..ed7f7fd 100644
--- a/glib/gthread-posix.c
+++ b/glib/gthread-posix.c
@@ -72,7 +72,7 @@ static void
g_thread_abort (gint status,
const gchar *function)
{
- fprintf (stderr, "GLib (gthread-posix.c): Unexpected error from C library during '%s': %s. Aborting.\n",
+ g_warning (stderr, "GLib (gthread-posix.c): Unexpected error from C library during '%s': %s. Aborting.\n",
function, strerror (status));
abort ();
}
diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c
index 0836ff8..a6d147d 100644
--- a/glib/gthreadpool.c
+++ b/glib/gthreadpool.c
@@ -126,6 +126,26 @@ static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool *poo
static GRealThreadPool* g_thread_pool_wait_for_new_pool (void);
static gpointer g_thread_pool_wait_for_new_task (GRealThreadPool *pool);
+static gint
+g_thread_pool_sort_func (gconstpointer a,
+ gconstpointer b,
+ gpointer user_data)
+{
+ GRealThreadPool *pool = user_data;
+
+ /* Sentinels used by g_thread_pool_wakeup_and_stop_all() */
+ if (a == GUINT_TO_POINTER (1))
+ {
+ if (b == GUINT_TO_POINTER (1))
+ return 0;
+ return -1;
+ }
+ else if (b == GUINT_TO_POINTER (1))
+ return -1;
+
+ return pool->sort_func (a, b, pool->sort_user_data);
+}
+
static void
g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
gpointer data)
@@ -133,8 +153,8 @@ g_thread_pool_queue_push_unlocked (GRealThreadPool *pool,
if (pool->sort_func)
g_async_queue_push_sorted_unlocked (pool->queue,
data,
- pool->sort_func,
- pool->sort_user_data);
+ g_thread_pool_sort_func,
+ pool);
else
g_async_queue_push_unlocked (pool->queue, data);
}
@@ -951,8 +971,8 @@ g_thread_pool_set_sort_function (GThreadPool *pool,
if (func)
g_async_queue_sort_unlocked (real->queue,
- real->sort_func,
- real->sort_user_data);
+ g_thread_pool_sort_func,
+ real);
g_async_queue_unlock (real->queue);
}
@@ -1031,9 +1051,8 @@ g_thread_pool_cleanup (void)
* of shutting down to execute their last instructions... ICK!
*/
g_thread_pool_set_max_unused_threads (0);
- while (alive_threads)
- g_thread_yield ();
- g_usleep (10000);
+ while (alive_threads > 0)
+ g_usleep (10000);
g_clear_pointer (&unused_thread_queue, g_async_queue_unref);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]