[glib] GStaticPrivate: implement via GPrivate



commit 9bb5a55bda83c58ddbd0381693d98c7a2f701d01
Author: Ryan Lortie <desrt desrt ca>
Date:   Tue Oct 11 23:13:22 2011 -0400

    GStaticPrivate: implement via GPrivate
    
    Thanks to the modifications in 3d4846d92309d001697c2827660fa41b5c63dbc4,
    GStaticPrivate is not so directly tied in with GThread anymore.  It is
    now a simple matter to cut it out completely by using a GPrivate to
    store the GArray instead of storing it in the GThread.

 glib/deprecated/gthread-deprecated.c |   49 +++++++++++++++------------------
 glib/gthread.c                       |    4 ---
 glib/gthreadprivate.h                |    2 -
 3 files changed, 22 insertions(+), 33 deletions(-)
---
diff --git a/glib/deprecated/gthread-deprecated.c b/glib/deprecated/gthread-deprecated.c
index 95e6d8e..209d776 100644
--- a/glib/deprecated/gthread-deprecated.c
+++ b/glib/deprecated/gthread-deprecated.c
@@ -1221,6 +1221,24 @@ struct _GStaticPrivateNode
   GStaticPrivate *owner;
 };
 
+void
+g_static_private_cleanup (gpointer data)
+{
+  GArray *array = data;
+  guint i;
+
+  for (i = 0; i < array->len; i++ )
+    {
+      GStaticPrivateNode *node = &g_array_index (array, GStaticPrivateNode, i);
+      if (node->destroy)
+        node->destroy (node->data);
+    }
+
+  g_array_free (array, TRUE);
+}
+
+GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup);
+
 /**
  * GStaticPrivate:
  *
@@ -1292,10 +1310,10 @@ g_static_private_init (GStaticPrivate *private_key)
 gpointer
 g_static_private_get (GStaticPrivate *private_key)
 {
-  GRealThread *self = (GRealThread*) g_thread_self ();
   GArray *array;
   gpointer ret = NULL;
-  array = self->private_data;
+
+  array = g_private_get (&static_private_private);
 
   if (array && private_key->index != 0 && private_key->index <= array->len)
     {
@@ -1347,7 +1365,6 @@ g_static_private_set (GStaticPrivate *private_key,
                       gpointer        data,
                       GDestroyNotify  notify)
 {
-  GRealThread *self = (GRealThread*) g_thread_self ();
   GArray *array;
   static guint next_index = 0;
   GStaticPrivateNode *node;
@@ -1371,11 +1388,11 @@ g_static_private_set (GStaticPrivate *private_key,
       G_UNLOCK (g_thread);
     }
 
-  array = self->private_data;
+  array = g_private_get (&static_private_private);
   if (!array)
     {
       array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode));
-      self->private_data = array;
+      g_private_set (&static_private_private, array);
     }
   if (private_key->index > array->len)
     g_array_set_size (array, private_key->index);
@@ -1421,28 +1438,6 @@ g_static_private_free (GStaticPrivate *private_key)
   G_UNLOCK (g_thread);
 }
 
-void
-g_static_private_cleanup (GRealThread *thread)
-{
-  GArray *array;
-
-  array = thread->private_data;
-  thread->private_data = NULL;
-
-  if (array)
-    {
-      guint i;
-
-      for (i = 0; i < array->len; i++ )
-        {
-          GStaticPrivateNode *node = &g_array_index (array, GStaticPrivateNode, i);
-          if (node->destroy)
-            node->destroy (node->data);
-        }
-      g_array_free (array, TRUE);
-    }
-}
-
 /* GMutex {{{1 ------------------------------------------------------ */
 
 /**
diff --git a/glib/gthread.c b/glib/gthread.c
index dcb0add..57c1f02 100644
--- a/glib/gthread.c
+++ b/glib/gthread.c
@@ -673,8 +673,6 @@ g_thread_cleanup (gpointer data)
     {
       GRealThread* thread = data;
 
-      g_static_private_cleanup (thread);
-
       /* We only free the thread structure if it isn't joinable.
        * If it is, the structure is freed in g_thread_join()
        */
@@ -818,7 +816,6 @@ g_thread_new_internal (const gchar  *name,
   result->thread.joinable = joinable;
   result->thread.func = func;
   result->thread.data = data;
-  result->private_data = NULL;
   result->enumerable = enumerable;
   result->name = name;
   G_LOCK (g_thread_new);
@@ -941,7 +938,6 @@ g_thread_self (void)
       thread->thread.joinable = FALSE; /* This is a safe guess */
       thread->thread.func = NULL;
       thread->thread.data = NULL;
-      thread->private_data = NULL;
       thread->enumerable = FALSE;
 
       g_system_thread_self (&thread->system_thread);
diff --git a/glib/gthreadprivate.h b/glib/gthreadprivate.h
index 49eea35..1dafdac 100644
--- a/glib/gthreadprivate.h
+++ b/glib/gthreadprivate.h
@@ -64,7 +64,6 @@ typedef struct _GRealThread GRealThread;
 struct  _GRealThread
 {
   GThread thread;
-  GArray *private_data;
   GRealThread *next;
   const gchar *name;
   gboolean enumerable;
@@ -75,7 +74,6 @@ struct  _GRealThread
 G_GNUC_INTERNAL extern GSystemThread zero_thread;
 G_GNUC_INTERNAL extern GMutex g_once_mutex;
 
-G_GNUC_INTERNAL void g_static_private_cleanup   (GRealThread *thread);
 G_GNUC_INTERNAL void g_enumerable_thread_add    (GRealThread *thread);
 G_GNUC_INTERNAL void g_enumerable_thread_remove (GRealThread *thread);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]