gobject: use g_once_init_enter_pointer for GType initializers

GType is either an integer or a pointer, so we have to use the _pointer
version here to support architectures such as Morello.

Helps: https://gitlab.gnome.org/GNOME/glib/-/issues/2842
See also: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3578
This commit is contained in:
Alex Richardson
2023-09-12 01:26:21 -07:00
committed by Philip Withnall
parent a1dfecf11f
commit 5ecd3cbe52
10 changed files with 57 additions and 47 deletions

View File

@@ -2009,8 +2009,8 @@ guint g_type_get_type_registration_serial (void);
* GType
* gtk_gadget_get_type (void)
* {
* static gsize static_g_define_type_id = 0;
* if (g_once_init_enter (&static_g_define_type_id))
* static GType static_g_define_type_id = 0;
* if (g_once_init_enter_pointer (&static_g_define_type_id))
* {
* GType g_define_type_id =
* g_type_register_static_simple (GTK_TYPE_WIDGET,
@@ -2030,7 +2030,7 @@ guint g_type_get_type_registration_serial (void);
* };
* g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
* }
* g_once_init_leave (&static_g_define_type_id, g_define_type_id);
* g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id);
* }
* return static_g_define_type_id;
* }
@@ -2265,6 +2265,16 @@ static void type_name##_class_intern_init (gpointer klass) \
}
#endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 */
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_80
#define _g_type_once_init_type GType
#define _g_type_once_init_enter g_once_init_enter_pointer
#define _g_type_once_init_leave g_once_init_leave_pointer
#else /* if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_80 */
#define _g_type_once_init_type gsize
#define _g_type_once_init_enter g_once_init_enter
#define _g_type_once_init_leave g_once_init_leave
#endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_80 */
/* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */
#define _G_DEFINE_TYPE_EXTENDED_BEGIN_PRE(TypeName, type_name, TYPE_PARENT) \
\
@@ -2286,15 +2296,15 @@ type_name##_get_instance_private (TypeName *self) \
GType \
type_name##_get_type (void) \
{ \
static gsize static_g_define_type_id = 0;
static _g_type_once_init_type static_g_define_type_id = 0;
/* Prelude goes here */
/* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */
#define _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \
if (g_once_init_enter (&static_g_define_type_id)) \
if (_g_type_once_init_enter (&static_g_define_type_id)) \
{ \
GType g_define_type_id = type_name##_get_type_once (); \
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
_g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \
} \
return static_g_define_type_id; \
} /* closes type_name##_get_type() */ \
@@ -2334,8 +2344,8 @@ static void type_name##_default_init (TypeName##Interface *klass); \
GType \
type_name##_get_type (void) \
{ \
static gsize static_g_define_type_id = 0; \
if (g_once_init_enter (&static_g_define_type_id)) \
static _g_type_once_init_type static_g_define_type_id = 0; \
if (_g_type_once_init_enter (&static_g_define_type_id)) \
{ \
GType g_define_type_id = \
g_type_register_static_simple (G_TYPE_INTERFACE, \
@@ -2351,7 +2361,7 @@ type_name##_get_type (void) \
#define _G_DEFINE_INTERFACE_EXTENDED_END() \
/* following custom code */ \
} \
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
_g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \
} \
return static_g_define_type_id; \
} /* closes type_name##_get_type() */
@@ -2460,11 +2470,11 @@ static GType type_name##_get_type_once (void); \
GType \
type_name##_get_type (void) \
{ \
static gsize static_g_define_type_id = 0; \
if (g_once_init_enter (&static_g_define_type_id)) \
static _g_type_once_init_type static_g_define_type_id = 0; \
if (_g_type_once_init_enter (&static_g_define_type_id)) \
{ \
GType g_define_type_id = type_name##_get_type_once (); \
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
_g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \
} \
return static_g_define_type_id; \
} \
@@ -2497,11 +2507,11 @@ static GType type_name##_get_type_once (void); \
GType \
type_name##_get_type (void) \
{ \
static gsize static_g_define_type_id = 0; \
if (g_once_init_enter (&static_g_define_type_id)) \
static _g_type_once_init_type static_g_define_type_id = 0; \
if (_g_type_once_init_enter (&static_g_define_type_id)) \
{ \
GType g_define_type_id = type_name##_get_type_once (); \
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
_g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \
} \
return static_g_define_type_id; \
} \
@@ -2550,11 +2560,11 @@ static GType type_name##_get_type_once (void); \
GType \
type_name##_get_type (void) \
{ \
static gsize static_g_define_type_id = 0; \
if (g_once_init_enter (&static_g_define_type_id)) \
static _g_type_once_init_type static_g_define_type_id = 0; \
if (_g_type_once_init_enter (&static_g_define_type_id)) \
{ \
GType g_define_type_id = type_name##_get_type_once (); \
g_once_init_leave (&static_g_define_type_id, g_define_type_id); \
_g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \
} \
return static_g_define_type_id; \
} \