Java monitors are reentrant, so our mutexes should be as well (i.e. calling
a synchronized method from within another, both on the same object, should
not deadlock).

Reported-by: Tomek Grabiec <tgrab...@gmail.com>
Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 include/vm/object.h |    2 ++
 vm/jato.c           |    2 ++
 vm/object.c         |   26 ++++++++++++++++++++++----
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/include/vm/object.h b/include/vm/object.h
index ead13b5..878270c 100644
--- a/include/vm/object.h
+++ b/include/vm/object.h
@@ -22,6 +22,8 @@ struct vm_object {
        uint8_t fields[];
 };
 
+int init_vm_objects(void);
+
 struct vm_object *vm_object_alloc(struct vm_class *class);
 struct vm_object *vm_object_alloc_native_array(int type, int count);
 struct vm_object *vm_object_alloc_multi_array(struct vm_class *class,
diff --git a/vm/jato.c b/vm/jato.c
index 492550c..b2031c1 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -335,6 +335,8 @@ main(int argc, char *argv[])
        if (!classname)
                usage(stderr, EXIT_FAILURE);
 
+       init_vm_objects();
+
        jit_text_init();
 
        if (perf_enabled)
diff --git a/vm/object.c b/vm/object.c
index 48a3419..50c6d40 100644
--- a/vm/object.c
+++ b/vm/object.c
@@ -17,6 +17,24 @@
 #include <vm/types.h>
 #include <vm/utf8.h>
 
+static pthread_mutexattr_t obj_mutexattr;
+
+int init_vm_objects(void)
+{
+       int err;
+
+       err = pthread_mutexattr_init(&obj_mutexattr);
+       if (err)
+               return -err;
+
+       err = pthread_mutexattr_settype(&obj_mutexattr,
+               PTHREAD_MUTEX_RECURSIVE);
+       if (err)
+               return -err;
+
+       return 0;
+}
+
 struct vm_object *vm_object_alloc(struct vm_class *class)
 {
        struct vm_object *res;
@@ -32,7 +50,7 @@ struct vm_object *vm_object_alloc(struct vm_class *class)
 
        res->class = class;
 
-       if (pthread_mutex_init(&res->mutex, NULL))
+       if (pthread_mutex_init(&res->mutex, &obj_mutexattr))
                NOT_IMPLEMENTED;
 
        return res;
@@ -91,7 +109,7 @@ struct vm_object *vm_object_alloc_native_array(int type, int 
count)
 
        res->array_length = count;
 
-       if (pthread_mutex_init(&res->mutex, NULL))
+       if (pthread_mutex_init(&res->mutex, &obj_mutexattr))
                NOT_IMPLEMENTED;
 
        return res;
@@ -113,7 +131,7 @@ struct vm_object *vm_object_alloc_multi_array(struct 
vm_class *class,
                return NULL;
        }
 
-       if (pthread_mutex_init(&res->mutex, NULL))
+       if (pthread_mutex_init(&res->mutex, &obj_mutexattr))
                NOT_IMPLEMENTED;
 
        res->array_length = counts[0];
@@ -152,7 +170,7 @@ struct vm_object *vm_object_alloc_array(struct vm_class 
*class, int count)
                return NULL;
        }
 
-       if (pthread_mutex_init(&res->mutex, NULL))
+       if (pthread_mutex_init(&res->mutex, &obj_mutexattr))
                NOT_IMPLEMENTED;
 
        res->array_length = count;
-- 
1.6.0.4


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to