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]>

Reply via email to