Author: mturk
Date: Mon Sep  4 00:15:58 2006
New Revision: 439960

URL: http://svn.apache.org/viewvc?view=rev&rev=439960
Log:
The JNIEnv used in function call could not be
used in callback, because a callback might be
called by the different thread, thus making
core dump. Until we can use apr_threadkey_private
make a less optimized call to get JNIEnv before
doing JNI callback.

Modified:
    tomcat/connectors/trunk/jni/native/include/tcn.h
    tomcat/connectors/trunk/jni/native/include/tcn_api.h
    tomcat/connectors/trunk/jni/native/src/jnilib.c
    tomcat/connectors/trunk/jni/native/src/pool.c
    tomcat/connectors/trunk/jni/native/src/proc.c
    tomcat/connectors/trunk/jni/native/src/ssl.c
    tomcat/connectors/trunk/jni/native/src/sslutils.c

Modified: tomcat/connectors/trunk/jni/native/include/tcn.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/include/tcn.h?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/include/tcn.h (original)
+++ tomcat/connectors/trunk/jni/native/include/tcn.h Mon Sep  4 00:15:58 2006
@@ -231,7 +231,6 @@
 #define TCN_MAX_METHODS 8
 
 typedef struct {
-    JNIEnv      *env;
     jobject     obj;
     jmethodID   mid[TCN_MAX_METHODS];
     void        *opaque;

Modified: tomcat/connectors/trunk/jni/native/include/tcn_api.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/include/tcn_api.h?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/include/tcn_api.h (original)
+++ tomcat/connectors/trunk/jni/native/include/tcn_api.h Mon Sep  4 00:15:58 
2006
@@ -155,6 +155,10 @@
  */
 TCN_DECLARE(JavaVM *) tcn_get_java_vm(void);
 
+/* Get current thread JNIEnv
+ */
+TCN_DECLARE(jint) tcn_get_java_env(JNIEnv **);
+
 #ifdef __cplusplus
 }
 #endif

Modified: tomcat/connectors/trunk/jni/native/src/jnilib.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/jnilib.c?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/jnilib.c (original)
+++ tomcat/connectors/trunk/jni/native/src/jnilib.c Mon Sep  4 00:15:58 2006
@@ -458,3 +458,12 @@
 {
     return tcn_global_vm;
 }
+
+TCN_DECLARE(jint) tcn_get_java_env(JNIEnv **env)
+{
+    if ((*tcn_global_vm)->GetEnv(tcn_global_vm, (void **)env,
+                                 JNI_VERSION_1_4)) {
+        return JNI_ERR;
+    }
+    return JNI_OK;
+}

Modified: tomcat/connectors/trunk/jni/native/src/pool.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/pool.c?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/pool.c (original)
+++ tomcat/connectors/trunk/jni/native/src/pool.c Mon Sep  4 00:15:58 2006
@@ -29,10 +29,12 @@
     tcn_callback_t *cb = (tcn_callback_t *)data;
 
     if (data) {
-        if (!TCN_IS_NULL(cb->env, cb->obj)) {
-            rv = (*(cb->env))->CallIntMethod(cb->env, cb->obj, cb->mid[0],
-                                             NULL);
-            TCN_UNLOAD_CLASS(cb->env, cb->obj);
+        JNIEnv *env;
+        tcn_get_java_env(&env);
+        if (!TCN_IS_NULL(env, cb->obj)) {
+            rv = (*(env))->CallIntMethod(env, cb->obj, cb->mid[0],
+                                         NULL);
+            TCN_UNLOAD_CLASS(env, cb->obj);
         }
         free(cb);
     }
@@ -113,7 +115,6 @@
        return 0;
     }
     cls = (*e)->GetObjectClass(e, obj);
-    cb->env    = e;
     cb->obj    = (*e)->NewGlobalRef(e, obj);
     cb->mid[0] = (*e)->GetMethodID(e, cls, "callback", "()I");
 
@@ -175,8 +176,11 @@
     tcn_callback_t *cb = (tcn_callback_t *)data;
 
     if (data) {
-        if (!TCN_IS_NULL(cb->env, cb->obj)) {
-            TCN_UNLOAD_CLASS(cb->env, cb->obj);
+        JNIEnv *env;
+        tcn_get_java_env(&env);
+        
+        if (!TCN_IS_NULL(env, cb->obj)) {
+            TCN_UNLOAD_CLASS(env, cb->obj);
         }
         free(cb);
     }
@@ -199,8 +203,9 @@
             apr_pool_cleanup_run(p, old, generic_pool_data_cleanup);
     }
     if (data) {
+        JNIEnv *e;        
         tcn_callback_t *cb = (tcn_callback_t *)malloc(sizeof(tcn_callback_t));
-        cb->env = e;
+        tcn_get_java_env(&e);
         cb->obj = (*e)->NewGlobalRef(e, data);
         if ((rv = apr_pool_userdata_set(cb, J2S(key), 
generic_pool_data_cleanup,
                                         p)) != APR_SUCCESS) {

Modified: tomcat/connectors/trunk/jni/native/src/proc.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/proc.c?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/proc.c (original)
+++ tomcat/connectors/trunk/jni/native/src/proc.c Mon Sep  4 00:15:58 2006
@@ -34,10 +34,12 @@
     apr_pool_userdata_get(&data, ERRFN_USERDATA_KEY, pool);
     cb = (tcn_callback_t *)data;
     if (cb) {
-        if (!TCN_IS_NULL(cb->env, cb->obj)) {
-            (*(cb->env))->CallVoidMethod(cb->env, cb->obj, cb->mid[0],
+        JNIEnv *env;
+        tcn_get_java_env(&env);
+        if (!TCN_IS_NULL(env, cb->obj)) {
+            (*(env))->CallVoidMethod(env, cb->obj, cb->mid[0],
                                 P2J(pool), (jint)err,
-                                (*(cb->env))->NewStringUTF(cb->env, 
description),
+                                (*(env))->NewStringUTF(env, description),
                                 NULL);
         }
     }
@@ -48,8 +50,9 @@
     tcn_callback_t *cb = (tcn_callback_t *)data;
 
     if (data) {
-        if (!TCN_IS_NULL(cb->env, cb->obj)) {
-            TCN_UNLOAD_CLASS(cb->env, cb->obj);
+        JNIEnv *env;
+        if (!TCN_IS_NULL(env, cb->obj)) {
+            TCN_UNLOAD_CLASS(env, cb->obj);
         }
         free(cb);
     }
@@ -384,7 +387,6 @@
        return;
     }
     cls = (*e)->GetObjectClass(e, obj);
-    cb->env    = e;
     cb->obj    = (*e)->NewGlobalRef(e, obj);
     cb->mid[0] = (*e)->GetMethodID(e, cls, "callback", 
"(JILjava/lang/String;)V");
 

Modified: tomcat/connectors/trunk/jni/native/src/ssl.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/ssl.c?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/ssl.c (original)
+++ tomcat/connectors/trunk/jni/native/src/ssl.c Mon Sep  4 00:15:58 2006
@@ -111,7 +111,9 @@
     ssl_initialized = 0;
 
     if (tcn_password_callback.cb.obj) {
-        TCN_UNLOAD_CLASS(tcn_password_callback.cb.env,
+        JNIEnv *env;
+        tcn_get_java_env(&env);
+        TCN_UNLOAD_CLASS(env,
                          tcn_password_callback.cb.obj);
     }
 
@@ -488,7 +490,6 @@
     }
     TCN_FREE_CSTRING(file);
 }
-
 /* OpenSSL Java Stream BIO */
 
 typedef struct  {
@@ -560,8 +561,10 @@
     if (bi->ptr != NULL) {
         BIO_JAVA *j = (BIO_JAVA *)bi->ptr;
         if (bi->init) {
+            JNIEnv   *e = NULL;
             bi->init = 0;
-            TCN_UNLOAD_CLASS(j->cb.env, j->cb.obj);
+            tcn_get_java_env(&e);            
+            TCN_UNLOAD_CLASS(e, j->cb.obj);
         }
         OPENSSL_free(bi->ptr);
     }
@@ -574,8 +577,9 @@
     jint ret = 0;
     if (b->init && in != NULL) {
         BIO_JAVA *j = (BIO_JAVA *)b->ptr;
-        JNIEnv   *e = j->cb.env;
+        JNIEnv   *e = NULL;
         jbyteArray jb = (*e)->NewByteArray(e, inl);
+        tcn_get_java_env(&e);
         if (!(*e)->ExceptionOccurred(e)) {
             (*e)->SetByteArrayRegion(e, jb, 0, inl, (jbyte *)in);
             ret = (*e)->CallIntMethod(e, j->cb.obj,
@@ -592,8 +596,9 @@
     jint ret = 0;
     if (b->init && out != NULL) {
         BIO_JAVA *j = (BIO_JAVA *)b->ptr;
-        JNIEnv   *e = j->cb.env;
+        JNIEnv   *e = NULL;
         jbyteArray jb = (*e)->NewByteArray(e, outl);
+        tcn_get_java_env(&e);
         if (!(*e)->ExceptionOccurred(e)) {
             ret = (*e)->CallIntMethod(e, j->cb.obj,
                                       j->cb.mid[1], jb);
@@ -613,7 +618,8 @@
     int ret = 0;
     if (b->init && in != NULL) {
         BIO_JAVA *j = (BIO_JAVA *)b->ptr;
-        JNIEnv   *e = j->cb.env;
+        JNIEnv   *e = NULL;
+        tcn_get_java_env(&e);        
         ret = (*e)->CallIntMethod(e, j->cb.obj,
                                   j->cb.mid[2],
                                   tcn_new_string(e, in));
@@ -626,8 +632,9 @@
     int ret = 0;
     if (b->init && out != NULL) {
         BIO_JAVA *j = (BIO_JAVA *)b->ptr;
-        JNIEnv   *e = j->cb.env;
+        JNIEnv   *e = NULL;
         jobject  o;
+        tcn_get_java_env(&e);
         if ((o = (*e)->CallObjectMethod(e, j->cb.obj,
                             j->cb.mid[3], (jint)(outl - 1)))) {
             TCN_ALLOC_CSTRING(o);
@@ -693,7 +700,6 @@
     }
 
     cls = (*e)->GetObjectClass(e, callback);
-    j->cb.env    = e;
     j->cb.mid[0] = (*e)->GetMethodID(e, cls, "write", "([B)I");
     j->cb.mid[1] = (*e)->GetMethodID(e, cls, "read",  "([B)I");
     j->cb.mid[2] = (*e)->GetMethodID(e, cls, "puts",  "(Ljava/lang/String;)I");
@@ -723,11 +729,10 @@
 
     UNREFERENCED(o);
     if (tcn_password_callback.cb.obj) {
-        TCN_UNLOAD_CLASS(tcn_password_callback.cb.env,
+        TCN_UNLOAD_CLASS(e,
                          tcn_password_callback.cb.obj);
     }
     cls = (*e)->GetObjectClass(e, callback);
-    tcn_password_callback.cb.env    = e;
     tcn_password_callback.cb.mid[0] = (*e)->GetMethodID(e, cls, "callback",
                            "(Ljava/lang/String;)Ljava/lang/String;");
     /* TODO: Check if method id is valid */

Modified: tomcat/connectors/trunk/jni/native/src/sslutils.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/sslutils.c?view=diff&rev=439960&r1=439959&r2=439960
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/sslutils.c (original)
+++ tomcat/connectors/trunk/jni/native/src/sslutils.c Mon Sep  4 00:15:58 2006
@@ -77,10 +77,11 @@
 {
     int rv = 0;
     data->password[0] = '\0';
-    if (data->cb.env && data->cb.obj) {
-        JNIEnv *e = data->cb.env;
+    if (data->cb.obj) {
+        JNIEnv *e;
         jobject  o;
         jstring  prompt = AJP_TO_JSTRING(data->prompt);
+        tcn_get_java_env(&e);
         if ((o = (*e)->CallObjectMethod(e, data->cb.obj,
                             data->cb.mid[0], prompt))) {
             TCN_ALLOC_CSTRING(o);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to