From: Sergey Bugaev Date: Fri, 18 Apr 2025 10:43:00 +0000 (+0300) Subject: codegen: Use g_once_init_{enter,leave}_pointer when targetting glib >= 2.80 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=092cdc5494107d28a45c5aa5ceafd6e85e16941b;p=thirdparty%2Fvala.git codegen: Use g_once_init_{enter,leave}_pointer when targetting glib >= 2.80 See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3577 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 0c4c20358..5bdd88c69 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -4511,10 +4511,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { push_function (fun); - var once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); - if (context.require_glib_version (2, 68)) { + CCodeFunctionCall once_enter_call; + if (context.require_glib_version (2, 80)) { + once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter_pointer")); + once_enter_call.add_argument (new CCodeConstant ("re")); + } else if (context.require_glib_version (2, 68)) { + once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); once_enter_call.add_argument (new CCodeConstant ("(gsize*) re")); } else { + once_enter_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); once_enter_call.add_argument (new CCodeConstant ("(volatile gsize*) re")); } ccode.open_if (once_enter_call); @@ -4526,13 +4531,20 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { regex_new_call.add_argument (new CCodeConstant ("NULL")); ccode.add_assignment (new CCodeIdentifier ("GRegex* val"), regex_new_call); - var once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); - if (context.require_glib_version (2, 68)) { + CCodeFunctionCall once_leave_call; + if (context.require_glib_version (2, 80)) { + once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave_pointer")); + once_leave_call.add_argument (new CCodeConstant ("re")); + once_leave_call.add_argument (new CCodeConstant ("val")); + } else if (context.require_glib_version (2, 68)) { + once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); once_leave_call.add_argument (new CCodeConstant ("(gsize*) re")); + once_leave_call.add_argument (new CCodeConstant ("(gsize) val")); } else { + once_leave_call = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); once_leave_call.add_argument (new CCodeConstant ("(volatile gsize*) re")); + once_leave_call.add_argument (new CCodeConstant ("(gsize) val")); } - once_leave_call.add_argument (new CCodeConstant ("(gsize) val")); ccode.add_expression (once_leave_call); ccode.close (); diff --git a/codegen/valatyperegisterfunction.vala b/codegen/valatyperegisterfunction.vala index bea70762e..a40dc2270 100644 --- a/codegen/valatyperegisterfunction.vala +++ b/codegen/valatyperegisterfunction.vala @@ -55,7 +55,11 @@ public abstract class Vala.TypeRegisterFunction { var type_once_block = new CCodeBlock (); CCodeDeclaration cdecl; if (!plugin) { - cdecl = new CCodeDeclaration ("gsize"); + if (context.require_glib_version (2, 80)) { + cdecl = new CCodeDeclaration ("GType"); + } else { + cdecl = new CCodeDeclaration ("gsize"); + } cdecl.add_declarator (new CCodeVariableDeclarator (type_id_name + "__once", new CCodeConstant ("0"))); if (context.require_glib_version (2, 68)) { cdecl.modifiers = CCodeModifiers.STATIC; @@ -287,10 +291,20 @@ public abstract class Vala.TypeRegisterFunction { if (!plugin) { // the condition that guards the type initialisation - var enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); + CCodeFunctionCall enter; + if (context.require_glib_version (2, 80)) { + enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter_pointer")); + } else { + enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); + } enter.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name + "__once"))); - var leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); + CCodeFunctionCall leave; + if (context.require_glib_version (2, 80)) { + leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave_pointer")); + } else { + leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); + } leave.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name + "__once"))); leave.add_argument (new CCodeIdentifier (type_id_name)); once_call_block.add_statement (new CCodeExpressionStatement (leave)); diff --git a/tests/glib/conditional-glib-api.vala b/tests/glib/conditional-glib-api.vala index 3c63e506b..63758f9c7 100644 --- a/tests/glib/conditional-glib-api.vala +++ b/tests/glib/conditional-glib-api.vala @@ -33,6 +33,7 @@ void use_g_memdup2 () { // glib 2.68 drop volatile // glib 2.74 G_TYPE_FLAG_NONE +// glib 2.80 g_once_init_{enter,leave}_pointer [SingleInstance] class FooVolatile : Object { }