jk_jni_worker.c

来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 1,268 行 · 第 1/3 页

C
1,268
字号
        p->tomcat_classpath = jk_pool_strdup(&p->p, str_config);    }    if(!p->tomcat_classpath) {        jk_log(l, JK_LOG_EMERG, "Fail-> no classpath\n");        return JK_FALSE;    }    if(jk_get_worker_bridge_type(props, p->name, (unsigned int *)&btype)) {    	p->bridge_type = btype;    }	    if(jk_get_worker_jvm_path(props, p->name, &str_config)) {        p->jvm_dll_path  = jk_pool_strdup(&p->p, str_config);    }    if(!p->jvm_dll_path || !jk_file_exists(p->jvm_dll_path)) {        jk_log(l, JK_LOG_EMERG, "Fail-> no jvm_dll_path\n");        return JK_FALSE;    }    if(jk_get_worker_cmd_line(props, p->name, &str_config)) {        p->tomcat_cmd_line  = jk_pool_strdup(&p->p, str_config);    }    if(jk_get_worker_stdout(props, p->name, &str_config)) {        p->stdout_name  = jk_pool_strdup(&p->p, str_config);    }    if(jk_get_worker_stderr(props, p->name, &str_config)) {        p->stderr_name  = jk_pool_strdup(&p->p, str_config);    }    if(jk_get_worker_sysprops(props, p->name, &str_config)) {        p->sysprops  = jk_parse_sysprops(&p->p, str_config);    }#ifdef JNI_VERSION_1_2    if(jk_get_worker_str_prop(props, p->name, "java2opts", &str_config)) {    	/* jk_log(l, JK_LOG_DEBUG, "Got opts: %s\n", str_config); */	    p->java2opts = jk_parse_sysprops(&p->p, str_config);    }    if(jk_get_worker_int_prop(props, p->name, "java2lax", &mem_config)) {        p->java2lax = mem_config ? JK_TRUE : JK_FALSE;    }#endif    if(jk_get_worker_libpath(props, p->name, &str_config)) {        jk_append_libpath(&p->p, str_config);    }    if(!load_jvm_dll(p, l)) {	    jk_log(l, JK_LOG_EMERG, "Fail-> can't load jvm dll\n");	    /* [V] no detach needed here */	    return JK_FALSE;    }    if(!open_jvm(p, &env, l)) {	    jk_log(l, JK_LOG_EMERG, "Fail-> can't open jvm\n");	    /* [V] no detach needed here */	    return JK_FALSE;    }    if(!get_bridge_object(p, env, l)) {        jk_log(l, JK_LOG_EMERG, "Fail-> can't get bridge object\n");        /* [V] the detach here may segfault on 1.1 JVM... */        detach_from_jvm(p, l);        return JK_FALSE;    }    if(!get_method_ids(p, env, l)) {        jk_log(l, JK_LOG_EMERG, "Fail-> can't get method ids\n");        /* [V] the detach here may segfault on 1.1 JVM... */        detach_from_jvm(p, l);        return JK_FALSE;    }    p->was_verified = JK_TRUE;    p->tmp_env = env;    jk_log(l, JK_LOG_DEBUG,            "Done validate\n");    return JK_TRUE;}static int JK_METHOD init(jk_worker_t *pThis,                          jk_map_t *props,                          jk_worker_env_t *we,                          jk_logger_t *l){    jni_worker_t *p;    JNIEnv *env;    jk_log(l, JK_LOG_DEBUG, "Into init\n");    if(! pThis || ! pThis->worker_private) {	    jk_log(l, JK_LOG_EMERG, "In init, assert failed - invalid parameters\n");	    return JK_FALSE;    }    p = pThis->worker_private;    if(p->was_initialized) {	    jk_log(l, JK_LOG_DEBUG, "init, done (been here!)\n");        return JK_TRUE;    }    if(!p->jvm ||       !p->jk_java_bridge_object ||       !p->jk_service_method     ||       !p->jk_startup_method     ||       !p->jk_shutdown_method) {	    jk_log(l, JK_LOG_EMERG, "Fail-> worker not set completely\n");	    return JK_FALSE;    }    /* [V] init is called from the same thread that called validate */    /* there is no need to attach to the JVM, just get the env */    /* if(env = attach_to_jvm(p,l)) { */    if((env = p->tmp_env)) {        jstring cmd_line = (jstring)NULL;        jstring stdout_name = (jstring)NULL;        jstring stderr_name = (jstring)NULL;        jint rc = 0;		/* AS400/BS2000 need EBCDIC to ASCII conversion for JNI */		        if(p->tomcat_cmd_line) {            cmd_line = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->tomcat_cmd_line));        }        if(p->stdout_name) {            stdout_name = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->stdout_name));        }        if(p->stderr_name) {            stderr_name = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->stderr_name));        }	    jk_log(l, JK_LOG_DEBUG, "In init, calling Tomcat to intialize itself...\n");        rc = (*env)->CallIntMethod(env,                                   p->jk_java_bridge_object,                                   p->jk_startup_method,                                   cmd_line,                                   stdout_name,                                   stderr_name);        detach_from_jvm(p, l); 	    if(rc) {	        p->was_initialized = JK_TRUE;	        jk_log(l, JK_LOG_DEBUG,                    "In init, Tomcat initialized OK, done\n");	        return JK_TRUE;	    } else {	        jk_log(l, JK_LOG_EMERG,                    "Fail-> could not initialize Tomcat\n");	        return JK_FALSE;	    }    } else {	    jk_log(l, JK_LOG_ERROR,                "In init, FIXME: init didn't gen env from validate!\n");	    return JK_FALSE;    }}static int JK_METHOD get_endpoint(jk_worker_t *pThis,                                  jk_endpoint_t **pend,                                  jk_logger_t *l){    /* [V] This slow, needs replacement */    jni_endpoint_t *p = (jni_endpoint_t *)malloc(sizeof(jni_endpoint_t));    jk_log(l, JK_LOG_DEBUG,            "Into get_endpoint\n");    if(!pThis || ! pThis->worker_private || !pend) {	    jk_log(l, JK_LOG_EMERG,                "In get_endpoint, assert failed - invalid parameters\n");	    return JK_FALSE;    }    if(p) {        p->attached = JK_FALSE;        p->env = NULL;        p->worker = pThis->worker_private;        p->endpoint.endpoint_private = p;        p->endpoint.service = service;        p->endpoint.done = done;        *pend = &p->endpoint;	        return JK_TRUE;    } else {	    jk_log(l, JK_LOG_ERROR, "In get_endpoint, could not allocate endpoint\n");	    return JK_FALSE;    }}static int JK_METHOD destroy(jk_worker_t **pThis,                             jk_logger_t *l){    jni_worker_t *p;    JNIEnv *env;    jk_log(l, JK_LOG_DEBUG,            "Into destroy\n");    if(!pThis || !*pThis || ! (*pThis)->worker_private) {	    jk_log(l, JK_LOG_EMERG, "In destroy, assert failed - invalid parameters\n");	    return JK_FALSE;    }    p = (*pThis)->worker_private;    if(!p->jvm) {	    jk_log(l, JK_LOG_DEBUG, "In destroy, JVM not intantiated\n");	    return JK_FALSE;    }    if(!p->jk_java_bridge_object || ! p->jk_shutdown_method) {        jk_log(l, JK_LOG_DEBUG, "In destroy, Tomcat not intantiated\n");	    return JK_FALSE;    }    if((env = attach_to_jvm(p,l))) {	    jk_log(l, JK_LOG_DEBUG,                "In destroy, shutting down Tomcat...\n");        (*env)->CallVoidMethod(env,                               p->jk_java_bridge_object,                               p->jk_shutdown_method);        detach_from_jvm(p, l);    }    jk_close_pool(&p->p);    free(p);    jk_log(l, JK_LOG_DEBUG, "Done destroy\n");    return JK_TRUE;}int JK_METHOD jni_worker_factory(jk_worker_t **w,                                 const char *name,                                 jk_logger_t *l){    jni_worker_t *private_data;    jk_log(l, JK_LOG_DEBUG, "Into jni_worker_factory\n");    if(!name || !w) {	    jk_log(l, JK_LOG_EMERG,                "In jni_worker_factory, assert failed - invalid parameters\n");	    return JK_FALSE;    }    if(the_singleton_jni_worker) {	    jk_log(l, JK_LOG_DEBUG,                "In jni_worker_factory, instance already created\n");        *w = the_singleton_jni_worker;	    return JK_TRUE;    }    private_data = (jni_worker_t *)malloc(sizeof(jni_worker_t ));    if(!private_data) {	    jk_log(l, JK_LOG_ERROR,                "In jni_worker_factory, memory allocation error\n");	    return JK_FALSE;    }    jk_open_pool(&private_data->p,	             private_data->buf,                 sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);    private_data->name = jk_pool_strdup(&private_data->p, name);    if(!private_data->name) {        jk_log(l, JK_LOG_ERROR,                "In jni_worker_factory, memory allocation error\n");	    jk_close_pool(&private_data->p);        free(private_data);        return JK_FALSE;    }    private_data->was_verified          = JK_FALSE;    private_data->was_initialized       = JK_FALSE;    private_data->jvm                   = NULL;    private_data->tmp_env               = NULL;    private_data->jk_java_bridge_object = (jobject)NULL;    private_data->jk_java_bridge_class  = (jclass)NULL;    private_data->jk_startup_method     = (jmethodID)NULL;    private_data->jk_service_method     = (jmethodID)NULL;    private_data->jk_shutdown_method    = (jmethodID)NULL;    private_data->tomcat_cmd_line       = NULL;    private_data->tomcat_classpath      = NULL;    private_data->bridge_type      		= TC33_BRIDGE_TYPE;    private_data->jvm_dll_path          = NULL;    private_data->tomcat_ms             = 0;    private_data->tomcat_mx             = 0;    private_data->sysprops              = NULL;#ifdef JNI_VERSION_1_2    private_data->java2opts             = NULL;    private_data->java2lax              = JK_TRUE;#endif    private_data->stdout_name           = NULL;    private_data->stderr_name           = NULL;    private_data->worker.worker_private = private_data;    private_data->worker.validate       = validate;    private_data->worker.init           = init;    private_data->worker.get_endpoint   = get_endpoint;    private_data->worker.destroy        = destroy;    *w = &private_data->worker;    the_singleton_jni_worker = &private_data->worker;    jk_log(l, JK_LOG_DEBUG, "Done jni_worker_factory\n");    return JK_TRUE;}static int load_jvm_dll(jni_worker_t *p,                        jk_logger_t *l){#ifdef WIN32    HINSTANCE hInst = LoadLibrary(p->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");        jk_log(l, JK_LOG_DEBUG,                "Loaded all JNI procs\n");        if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) {            return JK_TRUE;        }        FreeLibrary(hInst);    }#elif defined(NETWARE) && !defined(__NOVELL_LIBC__)    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_TRUE;    }#elif defined(AS400)    jk_log(l, JK_LOG_DEBUG,           "Direct reference to JNI entry points (no SRVPGM)\n");    jni_create_java_vm = &JNI_CreateJavaVM;    jni_get_default_java_vm_init_args = &JNI_GetDefaultJavaVMInitArgs;    jni_get_created_java_vms = &JNI_GetCreatedJavaVMs;#else    void *handle;    jk_log(l, JK_LOG_DEBUG,            "Into load_jvm_dll, load %s\n", p->jvm_dll_path);    handle = dlopen(p->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL);    if(!handle) {        jk_log(l, JK_LOG_EMERG,                "Can't load native library %s : %s\n", p->jvm_dll_path,               dlerror());    } else {        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 && 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;        }	    jk_log(l, JK_LOG_EMERG,                "Can't resolve JNI_CreateJavaVM or JNI_GetDefaultJavaVMInitArgs\n");        dlclose(handle);    }#endif    return JK_FALSE;}static int open_jvm(jni_worker_t *p,                    JNIEnv **env,                    jk_logger_t *l){#ifdef JNI_VERSION_1_2    int jvm_version = detect_jvm_version(l);    switch(jvm_version) {	    case JNI_VERSION_1_1:	        return open_jvm1(p, env, l);        case JNI_VERSION_1_2:	        return open_jvm2(p, env, l);	    default:            return JK_FALSE;    }#else    /* [V] Make sure this is _really_ visible */    #warning -------------------------------------------------------    #warning NO JAVA 2 HEADERS! SUPPORT FOR JAVA 2 FEATURES DISABLED    #warning -------------------------------------------------------    return open_jvm1(p, env, l);#endif}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?