From b4861cbd21210b99294b93ea18bbfb4724a0aca6 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 29 May 2009 12:40:23 +0100 Subject: [PATCH] Use g_once when registering enumeration types Just like we do with GObject types and G_DEFINE_TYPE, we should use the g_once_init_enter/g_once_init_leave mechanism to make the GType registration of enumeration types thread safe. --- clutter/clutter-enum-types.c.in | 20 +++++++++++++++----- clutter/cogl/common/cogl-enum-types.c.in | 18 +++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/clutter/clutter-enum-types.c.in b/clutter/clutter-enum-types.c.in index 4107f40a0..19fb9e502 100644 --- a/clutter/clutter-enum-types.c.in +++ b/clutter/clutter-enum-types.c.in @@ -3,15 +3,19 @@ /*** END file-header ***/ /*** BEGIN file-production ***/ + /* enumerations from "@filename@" */ #include "@filename@" + /*** END file-production ***/ /*** BEGIN value-header ***/ GType -@enum_name@_get_type(void) { - static GType etype = 0; - if (G_UNLIKELY (!etype)) +@enum_name@_get_type (void) +{ + static volatile gsize g_enum_type_id__volatile = 0; + + if (g_once_init_enter (&g_enum_type_id__volatile)) { static const G@Type@Value values[] = { /*** END value-header ***/ @@ -23,8 +27,14 @@ GType /*** BEGIN value-tail ***/ { 0, NULL, NULL } }; - etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + GType g_enum_type_id; + + g_enum_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + + g_once_init_leave (&g_enum_type_id__volatile, g_enum_type_id); } - return etype; + + return g_enum_type_id__volatile; } /*** END value-tail ***/ diff --git a/clutter/cogl/common/cogl-enum-types.c.in b/clutter/cogl/common/cogl-enum-types.c.in index f2c01c78c..157180dfe 100644 --- a/clutter/cogl/common/cogl-enum-types.c.in +++ b/clutter/cogl/common/cogl-enum-types.c.in @@ -4,16 +4,19 @@ /*** END file-header ***/ /*** BEGIN file-production ***/ + /* enumerations from "@filename@" */ #include "@filename@" + /*** END file-production ***/ /*** BEGIN value-header ***/ GType -@enum_name@_get_type(void) { - static GType etype = 0; +@enum_name@_get_type (void) +{ + static volatile gsize g_enum_type_id__volatile = 0; - if (G_UNLIKELY (!etype)) + if (g_once_init_enter (&g_enum_type_id__volatile)) { static const G@Type@Value values[] = { /*** END value-header ***/ @@ -25,9 +28,14 @@ GType /*** BEGIN value-tail ***/ { 0, NULL, NULL } }; - etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + GType g_enum_type_id; + + g_enum_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + + g_once_init_leave (&g_enum_type_id__volatile, g_enum_type_id); } - return etype; + return g_enum_type_id__volatile; } /*** END value-tail ***/