nacho 2002/06/11 14:19:31 Modified: jk/native2/common jk_vm_default.c Log: The patch deals with unnecesary calls to the AttachCurrentThread if the GetEnv returns valid environment. The second part of patch uses WIN32 registry to guess the correct jvm.dll like Java does itself. Submitted by Mladen Turk. Revision Changes Path 1.18 +66 -4 jakarta-tomcat-connectors/jk/native2/common/jk_vm_default.c Index: jk_vm_default.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_vm_default.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- jk_vm_default.c 10 Jun 2002 21:55:06 -0000 1.17 +++ jk_vm_default.c 11 Jun 2002 21:19:31 -0000 1.18 @@ -351,10 +351,22 @@ #endif err= (*jvm)->GetEnv( jvm, (void **)&rc, JNI_VERSION_1_2 ); - if( ( err != 0 ) && - ( err != JNI_EDETACHED) ) { - env->l->jkLog(env, env->l, JK_LOG_INFO, + /* If the current thread is allready attached to the VM return the + appropriate interface. There is no need to call the AttachCurrentThread. + */ + if( err == 0) { + if( jkvm->mbean->debug > 0 ) + env->l->jkLog(env, env->l, JK_LOG_INFO, "vm.attach() allready attached\n"); + return rc; + } + /* The error code is either JNI_OK (allready attached) or JNI_EDETACHED. + Othere possibility is that specified version is not supported, + and the returned err in that case is JNI_EVERSION. + */ + if( err != JNI_EDETACHED) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, "vm.attach() GetEnv failed %d\n", err); + return NULL; } err = (*jvm)->AttachCurrentThread(jvm, @@ -406,6 +418,56 @@ /* Some guessing - to spare the user ( who might know less than we do ). */ +#ifdef WIN32 +/* On WIN32 use the Registry couse Java itself relies on that. +*/ +#define JAVASOFT_REGKEY "SOFTWARE\\JavaSoft\\Java Runtime Environment\\" + +static char* jk2_vm_guessJvmDll(jk_env_t *env, jk_map_t *props, + jk_vm_t *jkvm) +{ + HKEY hkjs; + static char jvm[MAX_PATH+1]; + char reg[MAX_PATH+1]; + char *cver; + jk_pool_t *p=props->pool; + unsigned int err, klen = MAX_PATH; + + strcpy(reg, JAVASOFT_REGKEY); + cver = ®[sizeof(JAVASOFT_REGKEY)-1]; + if( (err=RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg, + 0, KEY_READ, &hkjs) ) != ERROR_SUCCESS) { + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jni.guessJvmDll() failed to open Registry key\n"); + return NULL; + } + if( (err=RegQueryValueEx(hkjs, "CurrentVersion", NULL, NULL, + (unsigned char *)cver, &klen) ) != ERROR_SUCCESS) { + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jni.guessJvmDll() failed obtaining Current Version\n"); + RegCloseKey(hkjs); + return NULL; + } + RegCloseKey(hkjs); + if( (err=RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg, + 0, KEY_READ, &hkjs) ) != ERROR_SUCCESS) { + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jni.guessJvmDll() failed to open Registry key\n"); + return NULL; + } + klen = MAX_PATH; + if( (err=RegQueryValueEx(hkjs, "RuntimeLib", NULL, NULL, + (unsigned char *)jvm, &klen) ) != ERROR_SUCCESS) { + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jni.guessJvmDll() failed obtaining Runtime Library\n"); + RegCloseKey(hkjs); + return NULL; + } + RegCloseKey(hkjs); + + return jvm; +} +#else static char* jk2_vm_guessJvmDll(jk_env_t *env, jk_map_t *props, jk_vm_t *jkvm) { @@ -435,7 +497,7 @@ return NULL; } - +#endif static int jk2_vm_initVM(jk_env_t *env, jk_vm_t *jkvm) {
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>