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:
parent
3248bb1b75
commit
b4861cbd21
@ -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 ***/
|
||||||
|
@ -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 ***/
|
||||||
|
Loading…
Reference in New Issue
Block a user