diff --git a/src/modules/Java/jvm.c b/src/modules/Java/jvm.c index ebbe7c22dd5c9b947c27849458b55eb95eaec281..a77a258c73ce7083bf928c480ad06286200a0ef9 100644 --- a/src/modules/Java/jvm.c +++ b/src/modules/Java/jvm.c @@ -1,5 +1,5 @@ /* - * $Id: jvm.c,v 1.15 2000/04/19 16:03:34 mast Exp $ + * $Id: jvm.c,v 1.16 2000/04/19 18:17:56 marcus Exp $ * * Pike interface to Java Virtual Machine * @@ -16,7 +16,7 @@ #endif /* HAVE_CONFIG_H */ #include "global.h" -RCSID("$Id: jvm.c,v 1.15 2000/04/19 16:03:34 mast Exp $"); +RCSID("$Id: jvm.c,v 1.16 2000/04/19 18:17:56 marcus Exp $"); #include "program.h" #include "interpret.h" #include "stralloc.h" @@ -2716,8 +2716,15 @@ static void f_create(INT32 args) char *classpath = NULL; jclass cls; - if(j->jvm) - (*j->jvm)->DestroyJavaVM(j->jvm); + while(j->jvm) { + JavaVM *jvm = j->jvm; + JNIEnv *env; + j->jvm = NULL; + THREADS_ALLOW(); + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + (*jvm)->DestroyJavaVM(jvm); + THREADS_DISALLOW(); + } j->vm_args.version = 0x00010002; /* Java 1.2. */ j->vm_args.nOptions = 0; @@ -2864,10 +2871,13 @@ static void exit_jvm_struct(struct object *o) jvm_vacate_env(fp->current_object, env); } - if(j->jvm) { - (*j->jvm)->AttachCurrentThread(j->jvm, (void **)&env, NULL); - (*j->jvm)->DestroyJavaVM(j->jvm); + while(j->jvm) { + JavaVM *jvm = j->jvm; j->jvm = NULL; + THREADS_ALLOW(); + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + (*jvm)->DestroyJavaVM(jvm); + THREADS_DISALLOW(); } if(j->classpath_string) free_string(j->classpath_string);