From 20887fa14862521164a5d2242bb639be27283e5e Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Tue, 31 Jan 2006 15:46:34 +0000 Subject: [PATCH] carry out all dtalist pointer accesses atomically, some missing cases Tue Jan 31 16:45:03 2006 Tim Janik * glib/gdataset.c: carry out all dtalist pointer accesses atomically, some missing cases where pointed out by Sebastian Wilhelmi. --- ChangeLog | 5 +++++ ChangeLog.pre-2-10 | 5 +++++ ChangeLog.pre-2-12 | 5 +++++ glib/gdataset.c | 19 +++++++++++-------- glib/gdatasetprivate.h | 2 +- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index d702de9..8d0b29c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Jan 31 16:45:03 2006 Tim Janik + + * glib/gdataset.c: carry out all dtalist pointer accesses atomically, + some missing cases where pointed out by Sebastian Wilhelmi. + Tue Jan 31 12:33:48 2006 Tim Janik * configure.in: generate build/win32/vs8/Makefile, to fix build breakage. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d702de9..8d0b29c 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Tue Jan 31 16:45:03 2006 Tim Janik + + * glib/gdataset.c: carry out all dtalist pointer accesses atomically, + some missing cases where pointed out by Sebastian Wilhelmi. + Tue Jan 31 12:33:48 2006 Tim Janik * configure.in: generate build/win32/vs8/Makefile, to fix build breakage. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index d702de9..8d0b29c 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,8 @@ +Tue Jan 31 16:45:03 2006 Tim Janik + + * glib/gdataset.c: carry out all dtalist pointer accesses atomically, + some missing cases where pointed out by Sebastian Wilhelmi. + Tue Jan 31 12:33:48 2006 Tim Janik * configure.in: generate build/win32/vs8/Makefile, to fix build breakage. diff --git a/glib/gdataset.c b/glib/gdataset.c index 484e4fc..c9864fb 100644 --- a/glib/gdataset.c +++ b/glib/gdataset.c @@ -42,15 +42,18 @@ /* --- defines --- */ #define G_QUARK_BLOCK_SIZE (512) -/* datalist pointer modifications have to be done with the g_dataset_global mutex held */ +/* datalist pointer accesses vae to be carried out atomically */ #define G_DATALIST_GET_POINTER(datalist) \ - ((GData*) ((gsize) *(datalist) & ~(gsize) G_DATALIST_FLAGS_MASK)) -#define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \ - *(datalist) = (GData*) (G_DATALIST_GET_FLAGS (datalist) | \ - (gsize) pointer); \ + ((GData*) ((gsize) g_atomic_pointer_get ((gpointer*) datalist) & ~(gsize) G_DATALIST_FLAGS_MASK)) + +#define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \ + gpointer _oldv, _newv; \ + do { \ + _oldv = g_atomic_pointer_get (datalist); \ + _newv = (gpointer) (((gsize) _oldv & G_DATALIST_FLAGS_MASK) | (gsize) pointer); \ + } while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, _oldv, _newv)); \ } G_STMT_END - /* --- structures --- */ typedef struct _GDataset GDataset; struct _GData @@ -501,8 +504,8 @@ void g_datalist_init (GData **datalist) { g_return_if_fail (datalist != NULL); - - *datalist = NULL; + + g_atomic_pointer_set ((gpointer*) datalist, NULL); } /** diff --git a/glib/gdatasetprivate.h b/glib/gdatasetprivate.h index 5da9026..9397c60 100644 --- a/glib/gdatasetprivate.h +++ b/glib/gdatasetprivate.h @@ -36,7 +36,7 @@ G_BEGIN_DECLS * barriers to take effect without acquiring the global dataset mutex. */ #define G_DATALIST_GET_FLAGS(datalist) \ - ((gsize) g_atomic_pointer_get ((gpointer *)(datalist)) & G_DATALIST_FLAGS_MASK) + ((gsize) g_atomic_pointer_get ((gpointer*) datalist) & G_DATALIST_FLAGS_MASK) G_END_DECLS -- 2.7.4