From 3bdefad44a91b43bef41db401a2956616c88a871 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Tue, 10 Jul 2007 10:33:03 +0000 Subject: [PATCH] use g_once_init_enter/g_once_init_leave to guard critical initialization Tue Jul 10 12:31:50 2007 Tim Janik * gtype.h: use g_once_init_enter/g_once_init_leave to guard critical initialization section of *_get_type implementations in G_DEFINE_TYPE, bug #65041. svn path=/trunk/; revision=5618 --- gobject/ChangeLog | 6 ++++++ gobject/gtype.h | 13 +++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/gobject/ChangeLog b/gobject/ChangeLog index b611887..a016232 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,9 @@ +Tue Jul 10 12:31:50 2007 Tim Janik + + * gtype.h: use g_once_init_enter/g_once_init_leave to guard critical + initialization section of *_get_type implementations in G_DEFINE_TYPE, + bug #65041. + Fri Jun 29 2007 Matthias Clasen * === Released 2.13.6 === diff --git a/gobject/gtype.h b/gobject/gtype.h index 10ca7ee..5fa9860 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -368,23 +368,24 @@ static void type_name##_class_intern_init (gpointer klass) \ GType \ type_name##_get_type (void) \ { \ - static GType g_define_type_id = 0; \ - if (G_UNLIKELY (g_define_type_id == 0)) \ + static volatile gsize g_define_type_id__volatile = 0; \ + if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ - g_define_type_id = \ + GType g_define_type_id = \ g_type_register_static_simple (TYPE_PARENT, \ g_intern_static_string (#TypeName), \ sizeof (TypeName##Class), \ - (GClassInitFunc)type_name##_class_intern_init, \ + (GClassInitFunc) type_name##_class_intern_init, \ sizeof (TypeName), \ - (GInstanceInitFunc)type_name##_init, \ + (GInstanceInitFunc) type_name##_init, \ (GTypeFlags) flags); \ { /* custom code follows */ #define _G_DEFINE_TYPE_EXTENDED_END() \ /* following custom code */ \ } \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ } \ - return g_define_type_id; \ + return g_define_type_id__volatile; \ } /* closes type_name##_get_type() */ -- 2.7.4