[glib/wip/free: 6/6] gio stuff



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]