Author: mturk
Date: Wed Mar 22 23:56:28 2006
New Revision: 388091

URL: http://svn.apache.org/viewcvs?rev=388091&view=rev
Log:
Use array region routines instead copying entire
poller result set array. It can save few CPU cycles.

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

Modified: tomcat/connectors/trunk/jni/native/src/poll.c
URL: 
http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jni/native/src/poll.c?rev=388091&r1=388090&r2=388091&view=diff
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/poll.c (original)
+++ tomcat/connectors/trunk/jni/native/src/poll.c Wed Mar 22 23:56:28 2006
@@ -37,6 +37,7 @@
     apr_int32_t   nelts;
     apr_int32_t   nalloc;
     apr_pollset_t *pollset;
+    jlong         *set;
     apr_pollfd_t  *socket_set;
     apr_interval_time_t *socket_ttl;
     apr_interval_time_t max_ttl;
@@ -119,6 +120,7 @@
     }
     tps = apr_pcalloc(p, sizeof(tcn_pollset_t));
     tps->pollset = pollset;
+    tps->set        = apr_palloc(p, size * sizeof(jlong) * 2);
     tps->socket_set = apr_palloc(p, size * sizeof(apr_pollfd_t));
     tps->socket_ttl = apr_palloc(p, size * sizeof(apr_interval_time_t));
     tps->nelts  = 0;
@@ -237,7 +239,7 @@
                                      jboolean remove)
 {
     const apr_pollfd_t *fd = NULL;
-    tcn_pollset_t *p = J2P(pollset,  tcn_pollset_t *);    
+    tcn_pollset_t *p = J2P(pollset,  tcn_pollset_t *);
     apr_int32_t  i, num = 0;
     apr_status_t rv = APR_SUCCESS;
 
@@ -258,19 +260,18 @@
         num = (apr_int32_t)(-rv);
     }
     if (num > 0) {
-        jlong *pset = (*e)->GetLongArrayElements(e, set, NULL);
 #ifdef TCN_DO_STATISTICS
          p->sp_polled += num;
          p->sp_max_polled = TCN_MAX(p->sp_max_polled, num);
 #endif
         for (i = 0; i < num; i++) {
-            pset[i*2+0] = (jlong)(fd->rtnevents);
-            pset[i*2+1] = P2J(fd->client_data);
+            p->set[i*2+0] = (jlong)(fd->rtnevents);
+            p->set[i*2+1] = P2J(fd->client_data);
             if (remove)
                 do_remove(p, fd);
             fd ++;
         }
-        (*e)->ReleaseLongArrayElements(e, set, pset, 0);
+        (*e)->SetLongArrayRegion(e, set, 0, num * 2, p->set);
     }
 
     return (jint)num;
@@ -280,7 +281,6 @@
                                          jlongArray set, jboolean remove)
 {
     tcn_pollset_t *p = J2P(pollset,  tcn_pollset_t *);
-    jlong *pset = (*e)->GetLongArrayElements(e, set, NULL);
     apr_int32_t  i = 0, num = 0;
     apr_time_t now = apr_time_now();
     apr_pollfd_t fd;
@@ -293,7 +293,7 @@
         for (i = 0; i < p->nelts; i++) {
             if ((now - p->socket_ttl[i]) > p->max_ttl) {
                 fd = p->socket_set[i];
-                pset[num++] = P2J(fd.client_data);
+                p->set[num++] = P2J(fd.client_data);
             }
         }
         if (remove && num) {
@@ -304,15 +304,13 @@
 #endif
             for (i = 0; i < num; i++) {
                 fd.desc_type = APR_POLL_SOCKET;
-                fd.desc.s = (J2P(pset[i], tcn_socket_t *))->sock;
+                fd.desc.s = (J2P(p->set[i], tcn_socket_t *))->sock;
                 do_remove(p, &fd);
             }
         }
     }
     if (num)
-        (*e)->ReleaseLongArrayElements(e, set, pset, 0);
-    else
-        (*e)->ReleaseLongArrayElements(e, set, pset, JNI_ABORT);
+        (*e)->SetLongArrayRegion(e, set, 0, num, p->set);
     return (jint)num;
 }
 
@@ -335,7 +333,6 @@
                                         jlongArray set)
 {
     tcn_pollset_t *p = J2P(pollset,  tcn_pollset_t *);
-    jlong *pset = (*e)->GetLongArrayElements(e, set, NULL);
     apr_int32_t  i = 0;
     apr_pollfd_t fd;
 
@@ -345,12 +342,10 @@
     for (i = 0; i < p->nelts; i++) {
         p->socket_set[i].rtnevents = APR_POLLHUP | APR_POLLIN;
         fd = p->socket_set[i];
-        pset[i*2+0] = (jlong)(fd.rtnevents);
-        pset[i*2+1] = P2J(fd.client_data);
+        p->set[i*2+0] = (jlong)(fd.rtnevents);
+        p->set[i*2+1] = P2J(fd.client_data);
     }
     if (p->nelts)
-        (*e)->ReleaseLongArrayElements(e, set, pset, 0);
-    else
-        (*e)->ReleaseLongArrayElements(e, set, pset, JNI_ABORT);
+        (*e)->SetLongArrayRegion(e, set, 0, p->nelts * 2, p->set);
     return (jint)p->nelts;
 }



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

Reply via email to