Author: mturk
Date: Tue Jun 20 00:51:16 2006
New Revision: 415547

URL: http://svn.apache.org/viewvc?rev=415547&view=rev
Log:
Optimize the send/recv by not restoring the timeout
on each call.

Modified:
    tomcat/connectors/trunk/jni/native/src/network.c

Modified: tomcat/connectors/trunk/jni/native/src/network.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/network.c?rev=415547&r1=415546&r2=415547&view=diff
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/network.c (original)
+++ tomcat/connectors/trunk/jni/native/src/network.c Tue Jun 20 00:51:16 2006
@@ -1,4 +1,4 @@
-/* Copyright 2000-2005 The Apache Software Foundation
+/* Copyright 2000-2006 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 /*
  *
  * @author Mladen Turk
- * @version $Revision$, $Date$
+ * @version
  */
 
 #include "tcn.h"
@@ -507,23 +507,17 @@
 #endif
 
     if (tosend <= TCN_BUFFER_SZ) {
-        char sb[TCN_BUFFER_SZ];
-        (*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb);
+        jbyte sb[TCN_BUFFER_SZ];
+        (*e)->GetByteArrayRegion(e, buf, offset, tosend, &sb[0]);
         ss = (*s->net->send)(s->opaque, sb, &nbytes);
     }
     else {
-        jbyte *bytes;
-        apr_int32_t nb;
-        apr_socket_opt_get(s->sock, APR_SO_NONBLOCK, &nb);
-        if (nb)
-            bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
-        else
-            bytes = (*e)->GetByteArrayElements(e, buf, NULL);
-        ss = (*s->net->send)(s->opaque, (char *)(bytes + offset), &nbytes);
-        if (nb)
-            (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
-        else
-            (*e)->ReleaseByteArrayElements(e, buf, bytes, JNI_ABORT);
+        jbyte *sb = (jbyte *)malloc(nbytes);
+        if (sb == NULL)
+            return -APR_ENOMEM;
+        (*e)->GetByteArrayRegion(e, buf, offset, tosend, sb);
+        ss = (*s->net->send)(s->opaque, sb, &nbytes);
+        free(sb);
     }
     if (ss == APR_SUCCESS)
         return (jint)nbytes;
@@ -724,9 +718,10 @@
     }
     else {
         jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
-        ss = (*s->net->recv)(s->opaque, (char*)(bytes + offset), &nbytes);
-        (*e)->ReleaseByteArrayElements(e, buf, bytes,
-                                       nbytes ? 0 : JNI_ABORT);
+        if ((ss = (*s->net->recv)(s->opaque, (char*)(bytes + offset),
+                                  &nbytes)) == APR_SUCCESS)
+            (*e)->ReleaseByteArrayElements(e, buf, bytes,
+                                           nbytes ? 0 : JNI_ABORT);
     }
 #ifdef TCN_DO_STATISTICS
     if (ss == APR_SUCCESS) {
@@ -764,30 +759,27 @@
     tcn_socket_t *s = J2P(sock, tcn_socket_t *);
     apr_size_t nbytes = (apr_size_t)toread;
     apr_status_t ss;
-    apr_interval_time_t t;
 
     UNREFERENCED(o);
     TCN_ASSERT(sock != 0);
     TCN_ASSERT(s->opaque != NULL);
     TCN_ASSERT(buf != NULL);
 
-    if ((ss = (*s->net->timeout_get)(s->opaque, &t)) != APR_SUCCESS)
-        goto cleanup;
     if ((ss = (*s->net->timeout_set)(s->opaque, J2T(timeout))) != APR_SUCCESS)
         goto cleanup;
     if (toread <= TCN_BUFFER_SZ) {
-        char sb[TCN_BUFFER_SZ];
-        ss = (*s->net->recv)(s->opaque, sb, &nbytes);
-        (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, 
(jbyte*)&sb[0]);
+        jbyte sb[TCN_BUFFER_SZ];
+        if ((ss = (*s->net->recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS)
+            (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, &sb[0]);
     }
     else {
-        jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
-        ss = (*s->net->recv)(s->opaque, (char*)(bytes + offset), &nbytes);
-        (*e)->ReleaseByteArrayElements(e, buf, bytes,
-                                       nbytes ? 0 : JNI_ABORT);
+        jbyte *sb = (jbyte *)malloc(nbytes);
+        if (sb == NULL)
+            return -APR_ENOMEM;
+        if ((ss = (*s->net->recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS)
+            (*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, &sb[0]);
+        free(sb);
     }
-    /* Resore the original timeout */
-    (*s->net->timeout_set)(s->opaque, t);
 #ifdef TCN_DO_STATISTICS
     if (ss == APR_SUCCESS) {
         sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
@@ -913,7 +905,6 @@
     apr_status_t ss;
     apr_size_t nbytes = (apr_size_t)len;
     char *bytes;
-    apr_interval_time_t t;
 
     UNREFERENCED(o);
     TCN_ASSERT(sock != 0);
@@ -923,13 +914,9 @@
     bytes  = (char *)(*e)->GetDirectBufferAddress(e, buf);
     TCN_ASSERT(bytes != NULL);
 
-    if ((ss = (*s->net->timeout_get)(s->opaque, &t)) != APR_SUCCESS)
-         return -(jint)ss;
     if ((ss = (*s->net->timeout_set)(s->opaque, J2T(timeout))) != APR_SUCCESS)
          return -(jint)ss;
     ss = (*s->net->recv)(s->opaque, bytes + offset, &nbytes);
-    /* Resore the original timeout */
-    (*s->net->timeout_set)(s->opaque, t);
 #ifdef TCN_DO_STATISTICS
     if (ss == APR_SUCCESS) {
         sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
@@ -974,13 +961,9 @@
     TCN_ASSERT(s->opaque != NULL);
 
 
-    if ((ss = (*s->net->timeout_get)(s->opaque, &t)) != APR_SUCCESS)
-         return -(jint)ss;
     if ((ss = (*s->net->timeout_set)(s->opaque, J2T(timeout))) != APR_SUCCESS)
          return -(jint)ss;
     ss = (*s->net->recv)(s->opaque, s->jrbbuff + offset, &nbytes);
-    /* Resore the original timeout */
-    (*s->net->timeout_set)(s->opaque, t);
 #ifdef TCN_DO_STATISTICS
     if (ss == APR_SUCCESS) {
         sp_max_recv = TCN_MAX(sp_max_recv, nbytes);



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

Reply via email to