GStaticPrivate: implement via GPrivate
authorRyan Lortie <desrt@desrt.ca>
Wed, 12 Oct 2011 03:13:22 +0000 (23:13 -0400)
committerRyan Lortie <desrt@desrt.ca>
Wed, 12 Oct 2011 04:17:49 +0000 (00:17 -0400)
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
glib/gthread.c
glib/gthreadprivate.h

index 95e6d8e..209d776 100644 (file)
@@ -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 ------------------------------------------------------ */
 
 /**
index dcb0add..57c1f02 100644 (file)
@@ -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);
index 49eea35..1dafdac 100644 (file)
@@ -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);