summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2012-09-03 08:33:13 -0400
committerDan Winship <danw@gnome.org>2012-09-03 08:33:13 -0400
commit3389e6b686d4aad739780927b4db333e7d8af0c0 (patch)
treea5f6717b41d14aa9872149bc128092703d6c4fcb
parent27f34bc1a3cf658929735108d927b710a24592f1 (diff)
downloadglib-3389e6b686d4aad739780927b4db333e7d8af0c0.tar.gz
gio stuffwip/free
-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
-rw-r--r--glib/glib-init.c1
-rw-r--r--glib/glib-init.h1
-rw-r--r--glib/gthread-posix.c2
-rw-r--r--glib/gthreadpool.c33
15 files changed, 84 insertions, 83 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);
}
/**
diff --git a/glib/glib-init.c b/glib/glib-init.c
index d5d812362..169993a39 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 bcf23bdc0..488742190 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 bd48c6bf0..ed7f7fd12 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 0836ff874..a6d147d5c 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);
}