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]