costin 02/05/23 21:29:22 Modified: jk/native2/common jk_vm_default.c Log: Use APR to load the DLL ( rather than adding another case for hpux ). The major problem is Netware - the code in APR for dlopen is _very_ different from what we have in jk. If someone who uses that platform can check if apr dlopen works fine, we can remove the commented code. I assume the windows and standard dlopen cases are well tested, so we'll get rid of all this platform-specific code soon. Revision Changes Path 1.15 +128 -64 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.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- jk_vm_default.c 16 May 2002 23:48:27 -0000 1.14 +++ jk_vm_default.c 24 May 2002 04:29:22 -0000 1.15 @@ -85,15 +85,15 @@ #include "jk_config.h" -#if !defined(WIN32) && !defined(NETWARE) -#include <dlfcn.h> -#endif #if defined LINUX && defined APACHE2_SIGHACK #include <pthread.h> #include <signal.h> #include <bits/signum.h> #endif +#if !defined(WIN32) && !defined(NETWARE) +#include <dlfcn.h> +#endif #ifdef NETWARE #include <nwthread.h> #include <nwadv.h> @@ -101,6 +101,11 @@ #include <jni.h> +#ifdef APR_HAS_DSO +#include "apr_dso.h" +#endif + + #ifndef JNI_VERSION_1_2 #warning ------------------------------------------------------- @@ -184,72 +189,41 @@ static int jk2_vm_loadJvm(jk_env_t *env, jk_vm_t *jkvm) { - -#ifdef WIN32 - HINSTANCE hInst = LoadLibrary(jkvm->jvm_dll_path); - if(hInst) { - (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"); - - env->l->jkLog(env, env->l, JK_LOG_INFO, - "jni.loadJvmDll()\n"); - - if(jni_create_java_vm && - jni_get_default_java_vm_init_args && - jni_get_created_java_vms) { - return JK_OK; - } +#if defined(HAS_APR) && defined(APR_HAS_DSO) + apr_dso_handle_t *dsoHandle; + apr_status_t rc; + apr_pool_t *aprPool; - FreeLibrary(hInst); - } - return JK_OK; -#elif defined(NETWARE) - int javaNlmHandle = FindNLMHandle("JVM"); - if (0 == javaNlmHandle) { - /* if we didn't get a handle, try to load java and retry getting the */ - /* handle */ - spawnlp(P_NOWAIT, "JVM.NLM", NULL); - ThreadSwitchWithDelay(); - javaNlmHandle = FindNLMHandle("JVM"); - if (0 == javaNlmHandle) - printf("Error loading Java."); + aprPool= (apr_pool_t *)env->getAprPool( env ); + + if( aprPool==NULL ) + return JK_FALSE; + /* XXX How do I specify RTLD_NOW and RTLD_GLOBAL ? */ + rc=apr_dso_load( &dsoHandle, jkvm->jvm_dll_path, aprPool ); + + if(rc == APR_SUCCESS ) { + rc= apr_dso_sym( (apr_dso_handle_sym_t *)&jni_create_java_vm, dsoHandle, "JNI_CreateJavaVM"); } - 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( rc == APR_SUCCESS ) { + rc=apr_dso_sym( (apr_dso_handle_sym_t *)&jni_get_default_java_vm_init_args, dsoHandle, + "JNI_GetDefaultJavaVMInitArgs"); } - if(jni_create_java_vm && - jni_get_default_java_vm_init_args && - jni_get_created_java_vms) { - return JK_OK; + + if( rc == APR_SUCCESS ) { + rc=apr_dso_sym( (apr_dso_handle_sym_t *)&jni_get_created_java_vms, + dsoHandle, "JNI_GetCreatedJavaVMs"); } - return JK_OK; -#else - void *handle; - handle = dlopen(jkvm->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL); - - if(handle == NULL ) { - env->l->jkLog(env, env->l, JK_LOG_EMERG, + + if( rc!= APR_SUCCESS ) { + char buf[256]; + env->l->jkLog(env, env->l, JK_LOG_ERROR, "Can't load native library %s : %s\n", jkvm->jvm_dll_path, - dlerror()); + apr_dso_error(dsoHandle, buf, 256)); return JK_ERR; } - - jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM"); - jni_get_default_java_vm_init_args = - dlsym(handle, "JNI_GetDefaultJavaVMInitArgs"); - jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs"); - + if(jni_create_java_vm == NULL || jni_get_default_java_vm_init_args == NULL || jni_get_created_java_vms == NULL ) @@ -257,15 +231,105 @@ env->l->jkLog(env, env->l, JK_LOG_EMERG, "jni.loadJvm() Can't resolve symbols %s\n", jkvm->jvm_dll_path ); - dlclose(handle); + apr_dso_unload( dsoHandle); return JK_ERR; } + + if( jkvm->mbean->debug > 0 ) + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jni.loadJvm() %s symbols resolved\n", + jkvm->jvm_dll_path); + + return JK_OK; +#else + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "Can't load jvm, no apr support %s\n"); + + return JK_ERR; +#endif + +/* #ifdef WIN32 */ +/* HINSTANCE hInst = LoadLibrary(jkvm->jvm_dll_path); */ +/* if(hInst) { */ +/* (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"); */ + +/* env->l->jkLog(env, env->l, JK_LOG_INFO, */ +/* "jni.loadJvmDll()\n"); */ + +/* if(jni_create_java_vm && */ +/* jni_get_default_java_vm_init_args && */ +/* jni_get_created_java_vms) { */ +/* return JK_OK; */ +/* } */ + +/* FreeLibrary(hInst); */ +/* } */ +/* return JK_OK; */ +/* #elif defined(NETWARE) */ +/* int javaNlmHandle = FindNLMHandle("JVM"); */ +/* if (0 == javaNlmHandle) { */ + /* if we didn't get a handle, try to load java and retry getting the */ + /* handle */ +/* spawnlp(P_NOWAIT, "JVM.NLM", NULL); */ +/* ThreadSwitchWithDelay(); */ +/* javaNlmHandle = FindNLMHandle("JVM"); */ +/* if (0 == javaNlmHandle) */ +/* printf("Error loading Java."); */ + +/* } */ +/* 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 && */ +/* jni_get_created_java_vms) { */ +/* return JK_OK; */ +/* } */ +/* return JK_OK; */ +/* #else */ +/* void *handle; */ +/* handle = dlopen(jkvm->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL); */ + +/* if(handle == NULL ) { */ +/* env->l->jkLog(env, env->l, JK_LOG_EMERG, */ +/* "Can't load native library %s : %s\n", jkvm->jvm_dll_path, */ +/* dlerror()); */ +/* return JK_ERR; */ +/* } */ + +/* jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM"); */ +/* jni_get_default_java_vm_init_args = */ +/* dlsym(handle, "JNI_GetDefaultJavaVMInitArgs"); */ +/* jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs"); */ + +/* if(jni_create_java_vm == NULL || */ +/* jni_get_default_java_vm_init_args == NULL || */ +/* jni_get_created_java_vms == NULL ) */ +/* { */ +/* env->l->jkLog(env, env->l, JK_LOG_EMERG, */ +/* "jni.loadJvm() Can't resolve symbols %s\n", */ +/* jkvm->jvm_dll_path ); */ +/* dlclose(handle); */ +/* return JK_ERR; */ +/* } */ /* env->l->jkLog(env, env->l, JK_LOG_INFO, */ /* "jni.loadJvm() %s symbols resolved\n", jkvm->jvm_dll_path); */ - return JK_OK; -#endif +/* return JK_OK; */ +/* #endif */ + }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>