From 2027d87b5b16035302c2be3fd9abb788a50d4ecd Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Wed, 23 Nov 2005 17:54:57 +0000 Subject: [PATCH] access datalist flags via atomic pointer access funcitons, instead of Wed Nov 23 17:34:01 2005 Tim Janik * 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 | 7 +++++++ ChangeLog.pre-2-10 | 7 +++++++ ChangeLog.pre-2-12 | 7 +++++++ glib/gdataset.c | 26 +++++++++++++++++--------- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9f7a7500..4e41ea2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Nov 23 17:34:01 2005 Tim Janik + + * 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 * glib/gdataset.c: streamlined initialization code somewhat, diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 9f7a7500..4e41ea2d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +Wed Nov 23 17:34:01 2005 Tim Janik + + * 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 * glib/gdataset.c: streamlined initialization code somewhat, diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 9f7a7500..4e41ea2d 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,10 @@ +Wed Nov 23 17:34:01 2005 Tim Janik + + * 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 * glib/gdataset.c: streamlined initialization code somewhat, diff --git a/glib/gdataset.c b/glib/gdataset.c index d9ba0336..484e4fcb 100644 --- a/glib/gdataset.c +++ b/glib/gdataset.c @@ -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 */ } -- 2.34.1