mturk       2005/06/15 07:43:13

  Modified:    jni/native/src network.c
  Log:
  Use stack buffer for small (< 8K) byte arrays.
  
  Revision  Changes    Path
  1.26      +43 -26    jakarta-tomcat-connectors/jni/native/src/network.c
  
  Index: network.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/network.c,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- network.c 10 Jun 2005 07:06:10 -0000      1.25
  +++ network.c 15 Jun 2005 14:43:12 -0000      1.26
  @@ -27,7 +27,6 @@
   
   #ifdef TCN_DO_STATISTICS
   #include "apr_atomic.h"
  -
   static volatile apr_uint32_t sp_created  = 0;
   static volatile apr_uint32_t sp_closed   = 0;
   static volatile apr_uint32_t sp_cleared  = 0;
  @@ -272,23 +271,30 @@
   {
       apr_socket_t *s = J2P(sock, apr_socket_t *);
       apr_size_t nbytes = (apr_size_t)tosend;
  -    jbyte *bytes;
  -    apr_int32_t nb;
       apr_status_t ss;
   
       UNREFERENCED(o);
       TCN_ASSERT(sock != 0);
  -    apr_socket_opt_get(s, APR_SO_NONBLOCK, &nb);
  -    if (nb)
  -         bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
  -    else
  -         bytes = (*e)->GetByteArrayElements(e, buf, NULL);
  -    ss = apr_socket_send(s, bytes + offset, &nbytes);
  -
  -    if (nb)
  -        (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
  -    else
  -        (*e)->ReleaseByteArrayElements(e, buf, bytes, JNI_ABORT);
  +    if (tosend <= TCN_BUFFER_SZ) {
  +        char sb[TCN_BUFFER_SZ];
  +        (*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb);
  +        ss = apr_socket_send(s, sb, &nbytes);
  +    }
  +    else {
  +        jbyte *bytes;
  +        apr_int32_t nb;
  +        apr_socket_opt_get(s, APR_SO_NONBLOCK, &nb);
  +        if (nb)
  +            bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
  +        else
  +            bytes = (*e)->GetByteArrayElements(e, buf, NULL);
  +        ss = apr_socket_send(s, bytes + offset, &nbytes);
  +
  +        if (nb)
  +            (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
  +        else
  +            (*e)->ReleaseByteArrayElements(e, buf, bytes, JNI_ABORT);
  +    }
       if (ss == APR_SUCCESS)
           return (jint)nbytes;
       else {
  @@ -393,16 +399,21 @@
   {
       apr_socket_t *s = J2P(sock, apr_socket_t *);
       apr_size_t nbytes = (apr_size_t)toread;
  -    jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
       apr_status_t ss;
   
       UNREFERENCED(o);
       TCN_ASSERT(sock != 0);
  -    TCN_ASSERT(bytes != NULL);
  -    ss = apr_socket_recv(s, bytes + offset, &nbytes);
  -
  -    (*e)->ReleaseByteArrayElements(e, buf, bytes,
  -                                   nbytes ? 0 : JNI_ABORT);
  +    if (toread <= TCN_BUFFER_SZ) {
  +        char sb[TCN_BUFFER_SZ];
  +        if ((ss = apr_socket_recv(s, sb, &nbytes)) == APR_SUCCESS)
  +            (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
  +    }
  +    else {
  +        jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
  +        ss = apr_socket_recv(s, bytes + offset, &nbytes);
  +        (*e)->ReleaseByteArrayElements(e, buf, bytes,
  +                                       nbytes ? 0 : JNI_ABORT);
  +    }
       if (ss == APR_SUCCESS)
           return (jint)nbytes;
       else {
  @@ -417,25 +428,31 @@
   {
       apr_socket_t *s = J2P(sock, apr_socket_t *);
       apr_size_t nbytes = (apr_size_t)toread;
  -    jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
       apr_status_t ss;
       apr_interval_time_t t;
   
       UNREFERENCED(o);
       TCN_ASSERT(sock != 0);
       TCN_ASSERT(buf != NULL);
  -    TCN_ASSERT(bytes != NULL);
   
       if ((ss = apr_socket_timeout_get(s, &t)) != APR_SUCCESS)
           goto cleanup;
       if ((ss = apr_socket_timeout_set(s, J2T(timeout))) != APR_SUCCESS)
           goto cleanup;
  -    ss = apr_socket_recv(s, bytes + offset, &nbytes);
  +    if (toread <= TCN_BUFFER_SZ) {
  +        char sb[TCN_BUFFER_SZ];
  +        ss = apr_socket_recv(s, sb, &nbytes);
  +        (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
  +    }
  +    else {
  +        jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
  +        ss = apr_socket_recv(s, bytes + offset, &nbytes);
  +        (*e)->ReleaseByteArrayElements(e, buf, bytes,
  +                                       nbytes ? 0 : JNI_ABORT);
  +    }
       /* Resore the original timeout */
       apr_socket_timeout_set(s, t);
   cleanup:
  -    (*e)->ReleaseByteArrayElements(e, buf, bytes,
  -                                   nbytes ? 0 : JNI_ABORT);
       if (ss == APR_SUCCESS)
           return (jint)nbytes;
       else {
  
  
  

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

Reply via email to