costin 02/05/30 11:08:48 Modified: jk/native2/jni jk_jni_aprImpl.c Log: Added a flag to select the byte[] access mechanism. getArrayElements is the fastest - if pinning is supported by the VM. Aparently JDK1.4 doesn't pin, so the performance will go down. getArrayRegion works well on all VMs, so it is the default. The third option will work only on JDK1.4, with direct buffers ( it'll probably have the same performance with getArrayElements with pinning ). For this to work we need to implemnet a direct buffer version for ByteChunk and MsgAjp. Revision Changes Path 1.29 +63 -26 jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c Index: jk_jni_aprImpl.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- jk_jni_aprImpl.c 29 May 2002 17:51:23 -0000 1.28 +++ jk_jni_aprImpl.c 30 May 2002 18:08:48 -0000 1.29 @@ -100,6 +100,18 @@ static jk_workerEnv_t *workerEnv; static int jniDebug=0; +#define JK_GET_REGION 1 +#define JK_GET_BYTE_ARRAY_ELEMENTS 2 +#define JK_DIRECT_BUFFER_NIO 3 + +static int arrayAccessMethod=JK_GET_REGION; + +JNIEXPORT void JNICALL +Java_org_apache_jk_apr_AprImpl_setArrayAccessMode(JNIEnv *jniEnv, jobject _jthis, jint mode) +{ + arrayAccessMethod=mode; +} + /* -------------------- Apr initialization and pools -------------------- */ JNIEXPORT jint JNICALL @@ -527,26 +539,27 @@ return JK_ERR; } - nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, data, &iscopy); - - if( iscopy ) - env->l->jkLog(env, env->l, JK_LOG_INFO, - "aprImpl.jkInvoke() get java bytes iscopy %d\n", iscopy); - - if(nbuf==NULL) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "jkInvoke() NullPointerException 2\n"); - return -1; - } - - if( raw==0 ) { - ep->reply->reset(env, ep->reply); + if( arrayAccessMethod == JK_GET_BYTE_ARRAY_ELEMENTS ) { + nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, data, &iscopy); + if( iscopy ) + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.jkInvoke() get java bytes iscopy %d\n", iscopy); + + if(nbuf==NULL) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "jkInvoke() NullPointerException 2\n"); + return -1; + } + if( raw==0 ) { + ep->reply->reset(env, ep->reply); + } + + oldBuf=ep->reply->buf; + ep->reply->buf = nbuf; + } else if ( arrayAccessMethod == JK_GET_REGION ) { + (*jniEnv)->GetByteArrayRegion( jniEnv, data, off, len, ep->reply->buf ); } - - // memcpy( ep->reply->buf, nbuf , len ); - oldBuf=ep->reply->buf; - ep->reply->buf = nbuf; - + if( raw == 0 ) { rc=ep->reply->checkHeader( env, ep->reply, ep ); @@ -565,9 +578,10 @@ return JK_ERR; } - env->l->jkLog(env, env->l, JK_LOG_DEBUG, - "jkInvoke() component dispatch %d %d %p\n", rc, code, bean->invoke); - + if( bean->debug > 0 ) + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jkInvoke() component dispatch %d %d %p\n", rc, code, bean->invoke); + if( bean->invoke != NULL ) { rc=bean->invoke( env, bean, ep, code, ep->reply, raw ); } else { @@ -575,12 +589,35 @@ locate a handler. Deprecated, use the invoke() method ! */ rc=workerEnv->dispatch( env, workerEnv, target, ep, code, ep->reply ); } - /* XXX Copy back the response, if any */ - - (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); - ep->reply->buf=oldBuf; + /* Copy back the response, if any */ + if( arrayAccessMethod == JK_GET_BYTE_ARRAY_ELEMENTS ) { + if( rc == JK_INVOKE_WITH_RESPONSE ) { + (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, JNI_ABORT ); + rc=JK_OK; + } else { + (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); + } + ep->reply->buf=oldBuf; + } else if ( arrayAccessMethod == JK_GET_REGION ) { + if( rc == JK_INVOKE_WITH_RESPONSE ) { + /* env->l->jkLog(env, env->l, JK_LOG_INFO, */ + /* "jkInvoke() release %d %d %p\n", */ + /* ep->reply->pos, ep->reply->len , ep->reply->buf ); */ + (*jniEnv)->SetByteArrayRegion( jniEnv, data, 0, ep->reply->len + 4 , ep->reply->buf ); + rc=JK_OK; + } + } + + if( (*jniEnv)->ExceptionCheck( jniEnv ) ) { + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jkInvoke() component dispatch %d %d %p\n", rc, code, bean->invoke); + (*jniEnv)->ExceptionDescribe( jniEnv ); + /* Not needed if Describe is used. + (*jniEnv)->ExceptionClear( jniEnv ) */ + } + /* env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() done\n"); */ return rc;
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>