access datalist flags via atomic pointer access funcitons, instead of
authorTim Janik <timj@imendio.com>
Wed, 23 Nov 2005 17:54:57 +0000 (17:54 +0000)
committerTim Janik <timj@src.gnome.org>
Wed, 23 Nov 2005 17:54:57 +0000 (17:54 +0000)
Wed Nov 23 17:34:01 2005  Tim Janik  <timj@imendio.com>

        * glib/gdataset.c: access datalist flags via atomic pointer access
        funcitons, instead of acquiring the dataset lock. this is faster and
        also matches the atomic pointer readouts in gdatalistprivate.h and
        direct pointer modifications required by gobject.c.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
glib/gdataset.c

index 9f7a750031e960acdfe4ddd0b5229606d15f11cf..4e41ea2da342a0e28246f2f3e335b63ef0a7c698 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Nov 23 17:34:01 2005  Tim Janik  <timj@imendio.com>
+
+       * glib/gdataset.c: access datalist flags via atomic pointer access
+       funcitons, instead of acquiring the dataset lock. this is faster and
+       also matches the atomic pointer readouts in gdatalistprivate.h and
+       direct pointer modifications required by gobject.c.
+
 Wed Nov 23 13:35:31 2005  Tim Janik  <timj@gtk.org>
 
        * glib/gdataset.c: streamlined initialization code somewhat,
index 9f7a750031e960acdfe4ddd0b5229606d15f11cf..4e41ea2da342a0e28246f2f3e335b63ef0a7c698 100644 (file)
@@ -1,3 +1,10 @@
+Wed Nov 23 17:34:01 2005  Tim Janik  <timj@imendio.com>
+
+       * glib/gdataset.c: access datalist flags via atomic pointer access
+       funcitons, instead of acquiring the dataset lock. this is faster and
+       also matches the atomic pointer readouts in gdatalistprivate.h and
+       direct pointer modifications required by gobject.c.
+
 Wed Nov 23 13:35:31 2005  Tim Janik  <timj@gtk.org>
 
        * glib/gdataset.c: streamlined initialization code somewhat,
index 9f7a750031e960acdfe4ddd0b5229606d15f11cf..4e41ea2da342a0e28246f2f3e335b63ef0a7c698 100644 (file)
@@ -1,3 +1,10 @@
+Wed Nov 23 17:34:01 2005  Tim Janik  <timj@imendio.com>
+
+       * glib/gdataset.c: access datalist flags via atomic pointer access
+       funcitons, instead of acquiring the dataset lock. this is faster and
+       also matches the atomic pointer readouts in gdatalistprivate.h and
+       direct pointer modifications required by gobject.c.
+
 Wed Nov 23 13:35:31 2005  Tim Janik  <timj@gtk.org>
 
        * glib/gdataset.c: streamlined initialization code somewhat,
index d9ba033618d4c6af870d1ed2fe1b8a5995620069..484e4fcbdf88afa36b6a1cb4437db13813b24722 100644 (file)
@@ -525,12 +525,16 @@ void
 g_datalist_set_flags (GData **datalist,
                      guint   flags)
 {
+  gpointer oldvalue;
   g_return_if_fail (datalist != NULL);
   g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
-
-  G_LOCK (g_dataset_global);
-  *datalist = (GData*) (flags | (gsize) *datalist);
-  G_UNLOCK (g_dataset_global);
+  
+  do
+    {
+      oldvalue = g_atomic_pointer_get (datalist);
+    }
+  while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue,
+                                                 (gpointer) ((gsize) oldvalue | flags)));
 }
 
 /**
@@ -548,12 +552,16 @@ void
 g_datalist_unset_flags (GData **datalist,
                        guint   flags)
 {
+  gpointer oldvalue;
   g_return_if_fail (datalist != NULL);
   g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
-
-  G_LOCK (g_dataset_global);
-  *datalist = (GData*) (~(gsize) flags & (gsize) *datalist);
-  G_UNLOCK (g_dataset_global);
+  
+  do
+    {
+      oldvalue = g_atomic_pointer_get (datalist);
+    }
+  while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue,
+                                                 (gpointer) ((gsize) oldvalue & ~(gsize) flags)));
 }
 
 /**
@@ -569,7 +577,7 @@ guint
 g_datalist_get_flags (GData **datalist)
 {
   g_return_val_if_fail (datalist != NULL, 0);
-
+  
   return G_DATALIST_GET_FLAGS (datalist); /* atomic macro */
 }