]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Use GStaticRecMutex for lock statements, patch by Philip Van Hoof, fixes
authorJuerg Billeter <j@bitron.ch>
Fri, 23 May 2008 21:41:15 +0000 (21:41 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 23 May 2008 21:41:15 +0000 (21:41 +0000)
2008-05-23  Juerg Billeter  <j@bitron.ch>

* vapi/glib-2.0.vapi:
* gobject/valaccodegenerator.vala:

Use GStaticRecMutex for lock statements,
patch by Philip Van Hoof, fixes bug 532329

svn path=/trunk/; revision=1417

ChangeLog
gobject/valaccodegenerator.vala
vapi/glib-2.0.vapi

index dbe3d3d9d064e8d7f2a9843886e71b66aeba1984..250027cf76e88955809e1ef7b65b67aaaf2913ea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-05-23  Jürg Billeter  <j@bitron.ch>
+
+       * vapi/glib-2.0.vapi:
+       * gobject/valaccodegenerator.vala: 
+
+       Use GStaticRecMutex for lock statements,
+       patch by Philip Van Hoof, fixes bug 532329
+
 2008-05-23  Jürg Billeter  <j@bitron.ch>
 
        * vapi/packages/gtk+-2.0/: fix gtk_window_get_default_size binding,
index ebf80f20397a532e0f23fa3fd20aefe758d4a95d..378071ee641e29befc0b720af4359279d57ad6f0 100644 (file)
@@ -109,7 +109,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
        public Typesymbol gstringbuilder_type;
        public Typesymbol garray_type;
        public DataType gquark_type;
-       public DataType mutex_type;
+       public Struct mutex_type;
        public Typesymbol type_module_type;
        public Interface iterable_type;
        public Interface iterator_type;
@@ -237,7 +237,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                garray_type = (Typesymbol) glib_ns.scope.lookup ("Array");
 
                gquark_type = new ValueType ((Typesymbol) glib_ns.scope.lookup ("Quark"));
-               mutex_type = new ClassInstanceType ((Class) glib_ns.scope.lookup ("Mutex"));
+               mutex_type = (Struct) glib_ns.scope.lookup ("StaticRecMutex");
                
                type_module_type = (Typesymbol) glib_ns.scope.lookup ("TypeModule");
 
@@ -456,27 +456,25 @@ public class Vala.CCodeGenerator : CodeGenerator {
        public override void visit_member (Member m) {
                /* stuff meant for all lockable members */
                if (m is Lockable && ((Lockable)m).get_lock_used ()) {
+                       CCodeExpression l = new CCodeIdentifier ("self");
+                       l = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (l, "priv"), get_symbol_lock_name (m));        
+
                        instance_priv_struct.add_field (mutex_type.get_cname (), get_symbol_lock_name (m));
-                       
-                       instance_init_fragment.append (
-                               new CCodeExpressionStatement (
-                                       new CCodeAssignment (
-                                               new CCodeMemberAccess.pointer (
-                                                       new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"),
-                                                       get_symbol_lock_name (m)),
-                                       new CCodeFunctionCall (new CCodeIdentifier (((Class)mutex_type.data_type).default_construction_method.get_cname ())))));
-                       
+
+                       var initf = new CCodeFunctionCall (
+                               new CCodeIdentifier (mutex_type.default_construction_method.get_cname ()));
+
+                       initf.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));               
+
+                       instance_init_fragment.append (new CCodeExpressionStatement (initf));
+               
                        requires_free_checked = true;
-                       var fc = new CCodeFunctionCall (new CCodeIdentifier ("VALA_FREE_CHECKED"));
-                       fc.add_argument (
-                               new CCodeMemberAccess.pointer (
-                                       new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"),
-                                       get_symbol_lock_name (m)));
-                       if (mutex_type.data_type.get_free_function () == null) {
-                               Report.error (mutex_type.data_type.source_reference, "The type `%s` doesn't contain a free function".printf (mutex_type.data_type.get_full_name ()));
-                               return;
-                       }
-                       fc.add_argument (new CCodeIdentifier (mutex_type.data_type.get_free_function ()));
+
+
+                       var fc = new CCodeFunctionCall (new CCodeIdentifier ("g_static_rec_mutex_free"));
+
+                       fc.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));
+
                        if (instance_dispose_fragment != null) {
                                instance_dispose_fragment.append (new CCodeExpressionStatement (fc));
                        }
@@ -2424,14 +2422,15 @@ public class Vala.CCodeGenerator : CodeGenerator {
                }
                l = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (l, "priv"), get_symbol_lock_name (stmt.resource.symbol_reference));
                
-               fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.data_type.scope.lookup ("lock")).get_cname ()));
-               fc.add_argument (l);
+               fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.scope.lookup ("lock")).get_cname ()));
+               fc.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));
+
                cn.append (new CCodeExpressionStatement (fc));
                
                cn.append (stmt.body.ccodenode);
                
-               fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.data_type.scope.lookup ("unlock")).get_cname ()));
-               fc.add_argument (l);
+               fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.scope.lookup ("unlock")).get_cname ()));
+               fc.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));
                cn.append (new CCodeExpressionStatement (fc));
                
                stmt.ccodenode = cn;
index 5b696b389f3a9af454ce5ef543151918c5846f2d..18dfed3f04fabde2b188dc111db08ce5854a794f 100644 (file)
@@ -1286,7 +1286,16 @@ namespace GLib {
                public bool trylock ();
                public void unlock ();
        }
-       
+
+       [CCode (destroy_function = "g_static_rec_mutex_free")]
+       public struct StaticRecMutex {
+               public StaticRecMutex ();
+               public void lock ();
+               public bool trylock ();
+               public void unlock ();
+               public void lock_full ();
+       }
+
        [CCode (free_function = "g_cond_free")]
        public class Cond {
                public Cond ();