diff options
author | Dan Winship <danw@gnome.org> | 2012-09-03 08:33:13 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2012-09-03 08:33:13 -0400 |
commit | 3389e6b686d4aad739780927b4db333e7d8af0c0 (patch) | |
tree | a5f6717b41d14aa9872149bc128092703d6c4fcb | |
parent | 27f34bc1a3cf658929735108d927b710a24592f1 (diff) | |
download | glib-3389e6b686d4aad739780927b4db333e7d8af0c0.tar.gz |
gio stuffwip/free
-rw-r--r-- | gio/gcancellable.c | 9 | ||||
-rw-r--r-- | gio/gdbusprivate.c | 8 | ||||
-rw-r--r-- | gio/gdbusprivate.h | 2 | ||||
-rw-r--r-- | gio/gio.c | 29 | ||||
-rw-r--r-- | gio/giomodule.c | 30 | ||||
-rw-r--r-- | gio/gioprivate.h | 13 | ||||
-rw-r--r-- | gio/gioscheduler.c | 4 | ||||
-rw-r--r-- | gio/glocalfile.c | 9 | ||||
-rw-r--r-- | gio/gproxyresolver.c | 10 | ||||
-rw-r--r-- | gio/gresolver.c | 8 | ||||
-rw-r--r-- | gio/gsocketconnection.c | 8 | ||||
-rw-r--r-- | glib/glib-init.c | 1 | ||||
-rw-r--r-- | glib/glib-init.h | 1 | ||||
-rw-r--r-- | glib/gthread-posix.c | 2 | ||||
-rw-r--r-- | glib/gthreadpool.c | 33 |
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); @@ -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); } |