From: Jared Moore Date: Tue, 22 Jul 2008 01:13:35 +0000 (+0000) Subject: Added support for 'volatile' modifier in C code. X-Git-Tag: VALA_0_3_5~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3973e1fa5b052e597f2525731e4e21ec36b2cd5;p=thirdparty%2Fvala.git Added support for 'volatile' modifier in C code. 2008-07-22 Jared Moore * ccode/valaccodedeclaration.vala: * ccode/valaccodemodifiers.vala: Added support for 'volatile' modifier in C code. * gobject/valatyperegisterfunction.vala: Make *_get_type functions thread safe, fixes bug 540705. svn path=/trunk/; revision=1717 --- diff --git a/ChangeLog b/ChangeLog index 92a5612d5..2756f0513 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-07-22 Jared Moore + + * ccode/valaccodedeclaration.vala: + * ccode/valaccodemodifiers.vala: + + Added support for 'volatile' modifier in C code. + + * gobject/valatyperegisterfunction.vala: + + Make *_get_type functions thread safe, fixes bug 540705. + 2008-07-22 Jared Moore * gobject/valaccodeclassbinding.vala: diff --git a/ccode/valaccodedeclaration.vala b/ccode/valaccodedeclaration.vala index eb7ada541..7a0223bab 100644 --- a/ccode/valaccodedeclaration.vala +++ b/ccode/valaccodedeclaration.vala @@ -59,6 +59,9 @@ public class Vala.CCodeDeclaration : CCodeStatement { if ((modifiers & CCodeModifiers.STATIC) != 0) { writer.write_string ("static "); } + if ((modifiers & CCodeModifiers.VOLATILE) != 0) { + writer.write_string ("volatile "); + } if ((modifiers & CCodeModifiers.EXTERN) != 0 && !has_initializer ()) { writer.write_string ("extern "); } diff --git a/ccode/valaccodemodifiers.vala b/ccode/valaccodemodifiers.vala index 670bf4e12..90f6809c8 100644 --- a/ccode/valaccodemodifiers.vala +++ b/ccode/valaccodemodifiers.vala @@ -29,5 +29,6 @@ public enum Vala.CCodeModifiers { STATIC = 1 << 0, REGISTER = 1 << 1, EXTERN = 1 << 2, - INLINE = 1 << 3 + INLINE = 1 << 3, + VOLATILE = 1 << 4 } diff --git a/gobject/valaclassregisterfunction.vala b/gobject/valaclassregisterfunction.vala index fa131bee6..5e97b8044 100644 --- a/gobject/valaclassregisterfunction.vala +++ b/gobject/valaclassregisterfunction.vala @@ -119,7 +119,7 @@ public class Vala.ClassRegisterFunction : TypeRegisterFunction { var iface_info_name = "%s_info".printf (iface.get_lower_case_cname (null)); var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_interface_static")); - reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (class_reference.get_lower_case_cname (null)))); + reg_call.add_argument (new CCodeIdentifier ("%s_type_id_temp".printf (class_reference.get_lower_case_cname (null)))); reg_call.add_argument (new CCodeIdentifier (iface.get_type_id ())); reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name))); frag.append (new CCodeExpressionStatement (reg_call)); diff --git a/gobject/valainterfaceregisterfunction.vala b/gobject/valainterfaceregisterfunction.vala index 3be408ceb..b56d14147 100644 --- a/gobject/valainterfaceregisterfunction.vala +++ b/gobject/valainterfaceregisterfunction.vala @@ -76,7 +76,7 @@ public class Vala.InterfaceRegisterFunction : TypeRegisterFunction { var prereq = prereq_ref.data_type; var func = new CCodeFunctionCall (new CCodeIdentifier ("g_type_interface_add_prerequisite")); - func.add_argument (new CCodeIdentifier ("%s_type_id".printf (interface_reference.get_lower_case_cname (null)))); + func.add_argument (new CCodeIdentifier ("%s_type_id_temp".printf (interface_reference.get_lower_case_cname (null)))); func.add_argument (new CCodeIdentifier (prereq.get_type_id())); frag.append (new CCodeExpressionStatement (func)); diff --git a/gobject/valatyperegisterfunction.vala b/gobject/valatyperegisterfunction.vala index 3e81a5146..7e627dd87 100644 --- a/gobject/valatyperegisterfunction.vala +++ b/gobject/valatyperegisterfunction.vala @@ -43,9 +43,9 @@ public abstract class Vala.TypeRegisterFunction : Object { string type_id_name = "%s_type_id".printf (get_type_declaration ().get_lower_case_cname (null)); var type_block = new CCodeBlock (); - var cdecl = new CCodeDeclaration ("GType"); + var cdecl = new CCodeDeclaration ("gsize"); cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (type_id_name, new CCodeConstant ("0"))); - cdecl.modifiers = CCodeModifiers.STATIC; + cdecl.modifiers = CCodeModifiers.STATIC | CCodeModifiers.VOLATILE; if (!plugin) { type_block.add_statement (cdecl); } else { @@ -110,14 +110,26 @@ public abstract class Vala.TypeRegisterFunction : Object { reg_call.add_argument (new CCodeIdentifier ("&g_define_type_fundamental_info")); } reg_call.add_argument (new CCodeConstant (get_type_flags ())); - type_init.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (type_id_name), reg_call))); + + string temp_type_id_name = "%s_type_id_temp".printf (get_type_declaration ().get_lower_case_cname (null)); + if (!plugin) { + var temp_decl = new CCodeDeclaration ("GType"); + temp_decl.add_declarator (new CCodeVariableDeclarator.with_initializer (temp_type_id_name, reg_call)); + type_init.add_statement (temp_decl); + } else { + type_init.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (type_id_name), reg_call))); + } type_init.add_statement (get_type_interface_init_statements ()); if (!plugin) { - var cond = new CCodeFunctionCall (new CCodeIdentifier ("G_UNLIKELY")); - cond.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeIdentifier (type_id_name), new CCodeConstant ("0"))); - var cif = new CCodeIfStatement (cond, type_init); + var enter = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_enter")); + enter.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name))); + var leave = new CCodeFunctionCall (new CCodeIdentifier ("g_once_init_leave")); + leave.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (type_id_name))); + leave.add_argument (new CCodeIdentifier (temp_type_id_name)); + type_init.add_statement (new CCodeExpressionStatement (leave)); + var cif = new CCodeIfStatement (enter, type_init); type_block.add_statement (cif); } else { type_block = type_init;