From: Tim Janik Date: Tue, 10 Jul 2007 10:33:03 +0000 (+0000) Subject: use g_once_init_enter/g_once_init_leave to guard critical initialization X-Git-Tag: GLIB_2_13_7~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3bdefad44a91b43bef41db401a2956616c88a871;p=platform%2Fupstream%2Fglib.git 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 --- 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() */