mmanders 01/06/19 15:57:25 Modified: src/native/jk Tag: tomcat_32 jk_jni_worker.c Log: Even though Apache is documented as only calling the module initializer function (jk_init) once, it actually calls it multiple times, at least on Windows. A couple of times it is called on the same process which causes open_jvm to fail on the second pass because the jvm was alread instantiated on the first pass. In open_jvm2, we can catch this and try to get the instatiated jvm and attach to it, preventing a hard failure (a call to jk_error_exit()) which also shuts down the webserver. Revision Changes Path No revision No revision 1.7.2.3 +28 -7 jakarta-tomcat/src/native/jk/Attic/jk_jni_worker.c Index: jk_jni_worker.c =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/native/jk/Attic/jk_jni_worker.c,v retrieving revision 1.7.2.2 retrieving revision 1.7.2.3 diff -u -r1.7.2.2 -r1.7.2.3 --- jk_jni_worker.c 2000/09/13 23:06:25 1.7.2.2 +++ jk_jni_worker.c 2001/06/19 22:57:23 1.7.2.3 @@ -57,7 +57,7 @@ * Description: In process JNI worker * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Based on: * - * Version: $Revision: 1.7.2.2 $ * + * Version: $Revision: 1.7.2.3 $ * ***************************************************************************/ #if !defined(WIN32) && !defined(NETWARE) @@ -89,6 +89,7 @@ jint (JNICALL *jni_get_default_java_vm_init_args)(void *) = NULL; jint (JNICALL *jni_create_java_vm)(JavaVM **, JNIEnv **, void *) = NULL; +jint (JNICALL *jni_get_created_java_vms)(JavaVM **, int, int *) = NULL; #define JAVA_BRIDGE_CLASS_NAME ("org/apache/tomcat/service/JNIEndpoint") @@ -688,10 +689,13 @@ (FARPROC)jni_create_java_vm = GetProcAddress(hInst, "JNI_CreateJavaVM"); + (FARPROC)jni_get_created_java_vms = + GetProcAddress(hInst, "JNI_GetCreatedJavaVMs"); + (FARPROC)jni_get_default_java_vm_init_args = GetProcAddress(hInst, "JNI_GetDefaultJavaVMInitArgs"); - if(jni_create_java_vm && jni_get_default_java_vm_init_args) { + if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { return JK_TRUE; } @@ -711,9 +715,10 @@ } if (0 != javaNlmHandle) { jni_create_java_vm = ImportSymbol(GetNLMHandle(), "JNI_CreateJavaVM"); + jni_get_created_java_vms = ImportSymbol(GetNLMHandle(), "JNI_GetCreatedJavaVMs"); jni_get_default_java_vm_init_args = ImportSymbol(GetNLMHandle(), "JNI_GetDefaultJavaVMInitArgs"); } - if(jni_create_java_vm && jni_get_default_java_vm_init_args) { + if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { return JK_TRUE; } #else @@ -729,9 +734,10 @@ dlerror()); } else { jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM"); + jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs"); jni_get_default_java_vm_init_args = dlsym(handle, "JNI_GetDefaultJavaVMInitArgs"); - if(jni_create_java_vm && jni_get_default_java_vm_init_args) { + if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { jk_log(l, JK_LOG_DEBUG, "In load_jvm_dll, symbols resolved, done\n"); return JK_TRUE; @@ -909,7 +915,7 @@ int optn = 0, err; char* tmp; - *env = NULL; + *env = penv = NULL; jk_log(l, JK_LOG_DEBUG, "Into open_jvm2\n"); @@ -970,10 +976,25 @@ } jk_log(l, JK_LOG_DEBUG, "In open_jvm2, about to create JVM...\n"); + + err=jni_create_java_vm(&(p->jvm), &penv, &vm_args); + + if (JNI_EEXIST == err) + { + int vmCount; + jk_log(l, JK_LOG_DEBUG, "JVM alread instantiated. Trying to attach instead.\n"); + + jni_get_created_java_vms(&(p->jvm), 1, &vmCount); + if (NULL != p->jvm) + penv = attach_to_jvm(p, l); - if((err=jni_create_java_vm(&(p->jvm), &penv, &vm_args)) != 0) { + if (NULL != penv) + err = 0; + } + + if(err != 0) { jk_log(l, JK_LOG_EMERG, "Fail-> could not create JVM, code: %d \n", err); - return JK_FALSE; + return JK_FALSE; } jk_log(l, JK_LOG_DEBUG, "In open_jvm2, JVM created, done\n");