+2008-07-22 Jared Moore <jaredm@svn.gnome.org>
+
+ * 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 <jaredm@svn.gnome.org>
* gobject/valaccodeclassbinding.vala:
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));
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));
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 {
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;