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.
This commit is contained in:
Emmanuele Bassi 2009-05-29 12:40:23 +01:00
parent 3248bb1b75
commit b4861cbd21
2 changed files with 28 additions and 10 deletions

View File

@ -3,15 +3,19 @@
/*** END file-header ***/ /*** END file-header ***/
/*** BEGIN file-production ***/ /*** BEGIN file-production ***/
/* enumerations from "@filename@" */ /* enumerations from "@filename@" */
#include "@filename@" #include "@filename@"
/*** END file-production ***/ /*** END file-production ***/
/*** BEGIN value-header ***/ /*** BEGIN value-header ***/
GType GType
@enum_name@_get_type(void) { @enum_name@_get_type (void)
static GType etype = 0; {
if (G_UNLIKELY (!etype)) 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[] = { static const G@Type@Value values[] = {
/*** END value-header ***/ /*** END value-header ***/
@ -23,8 +27,14 @@ GType
/*** BEGIN value-tail ***/ /*** BEGIN value-tail ***/
{ 0, NULL, NULL } { 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 ***/ /*** END value-tail ***/

View File

@ -4,16 +4,19 @@
/*** END file-header ***/ /*** END file-header ***/
/*** BEGIN file-production ***/ /*** BEGIN file-production ***/
/* enumerations from "@filename@" */ /* enumerations from "@filename@" */
#include "@filename@" #include "@filename@"
/*** END file-production ***/ /*** END file-production ***/
/*** BEGIN value-header ***/ /*** BEGIN value-header ***/
GType GType
@enum_name@_get_type(void) { @enum_name@_get_type (void)
static GType etype = 0; {
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[] = { static const G@Type@Value values[] = {
/*** END value-header ***/ /*** END value-header ***/
@ -25,9 +28,14 @@ GType
/*** BEGIN value-tail ***/ /*** BEGIN value-tail ***/
{ 0, NULL, NULL } { 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 ***/ /*** END value-tail ***/