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