Author: mturk Date: Mon Nov 19 06:38:06 2012 New Revision: 1411077 URL: http://svn.apache.org/viewvc?rev=1411077&view=rev Log: Preformance tuning. Use APR_POLLSET_NOCOPY since we always have allocated sockets and we depend on apr-1.3.x as minimum version
Modified: tomcat/native/branches/1.1.x/native/include/tcn.h tomcat/native/branches/1.1.x/native/src/network.c tomcat/native/branches/1.1.x/native/src/poll.c Modified: tomcat/native/branches/1.1.x/native/include/tcn.h URL: http://svn.apache.org/viewvc/tomcat/native/branches/1.1.x/native/include/tcn.h?rev=1411077&r1=1411076&r2=1411077&view=diff ============================================================================== --- tomcat/native/branches/1.1.x/native/include/tcn.h (original) +++ tomcat/native/branches/1.1.x/native/include/tcn.h Mon Nov 19 06:38:06 2012 @@ -29,6 +29,7 @@ #include "apr_pools.h" #include "apr_portable.h" #include "apr_network_io.h" +#include "apr_poll.h" #include "apr_strings.h" #ifndef APR_HAS_THREADS @@ -154,6 +155,7 @@ typedef struct { tcn_nlayer_t *net; apr_time_t last_active; apr_interval_time_t timeout; + apr_pollfd_t fd; } tcn_socket_t; /* Private helper functions */ Modified: tomcat/native/branches/1.1.x/native/src/network.c URL: http://svn.apache.org/viewvc/tomcat/native/branches/1.1.x/native/src/network.c?rev=1411077&r1=1411076&r2=1411077&view=diff ============================================================================== --- tomcat/native/branches/1.1.x/native/src/network.c (original) +++ tomcat/native/branches/1.1.x/native/src/network.c Mon Nov 19 06:38:06 2012 @@ -206,8 +206,10 @@ TCN_IMPLEMENT_CALL(jlong, Socket, create a->sock = s; if (family >= 0) a->net = &apr_socket_layer; - a->opaque = s; - + a->opaque = s; + a->fd.desc_type = APR_POLL_SOCKET; + a->fd.desc.s = a->sock; + a->fd.client_data = a; return P2J(a); cleanup: if (c) @@ -367,6 +369,9 @@ TCN_IMPLEMENT_CALL(jlong, Socket, accept a->net = &apr_socket_layer; a->sock = n; a->opaque = n; + a->fd.desc_type = APR_POLL_SOCKET; + a->fd.desc.s = a->sock; + a->fd.client_data = a; } cleanup: @@ -407,6 +412,9 @@ TCN_IMPLEMENT_CALL(jlong, Socket, accept a->net = &apr_socket_layer; a->sock = n; a->opaque = n; + a->fd.desc_type = APR_POLL_SOCKET; + a->fd.desc.s = a->sock; + a->fd.client_data = a; } return P2J(a); cleanup: Modified: tomcat/native/branches/1.1.x/native/src/poll.c URL: http://svn.apache.org/viewvc/tomcat/native/branches/1.1.x/native/src/poll.c?rev=1411077&r1=1411076&r2=1411077&view=diff ============================================================================== --- tomcat/native/branches/1.1.x/native/src/poll.c (original) +++ tomcat/native/branches/1.1.x/native/src/poll.c Mon Nov 19 06:38:06 2012 @@ -21,8 +21,6 @@ */ #include "tcn.h" -#include "apr_poll.h" - #ifdef TCN_DO_STATISTICS static int sp_created = 0; @@ -39,7 +37,7 @@ typedef struct tcn_pollset { apr_int32_t nalloc; apr_pollset_t *pollset; jlong *set; - apr_pollfd_t *socket_set; + apr_pollfd_t **socket_set; apr_interval_time_t default_timeout; #ifdef TCN_DO_STATISTICS int sp_added; @@ -103,7 +101,7 @@ TCN_IMPLEMENT_CALL(jlong, Poll, create)( apr_pool_t *p = J2P(pool, apr_pool_t *); apr_pollset_t *pollset = NULL; tcn_pollset_t *tps = NULL; - apr_uint32_t f = (apr_uint32_t)flags; + apr_uint32_t f = (apr_uint32_t)flags | APR_POLLSET_NOCOPY; UNREFERENCED(o); TCN_ASSERT(pool != 0); @@ -125,7 +123,7 @@ TCN_IMPLEMENT_CALL(jlong, Poll, create)( tps->pollset = pollset; tps->set = apr_palloc(p, size * sizeof(jlong) * 2); TCN_CHECK_ALLOCATED(tps->set); - tps->socket_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); + tps->socket_set = apr_palloc(p, size * sizeof(apr_pollfd_t *)); TCN_CHECK_ALLOCATED(tps->socket_set); tps->nelts = 0; tps->nalloc = size; @@ -160,7 +158,6 @@ static apr_status_t do_add(tcn_pollset_t apr_interval_time_t socket_timeout) { apr_interval_time_t timeout = socket_timeout; - apr_pollfd_t fd; if (p->nelts == p->nalloc) { #ifdef TCN_DO_STATISTICS @@ -176,20 +173,15 @@ static apr_status_t do_add(tcn_pollset_t else s->last_active = 0; s->timeout = socket_timeout; + s->fd.reqevents = reqevents; - memset(&fd, 0, sizeof(apr_pollfd_t)); - fd.desc_type = APR_POLL_SOCKET; - fd.reqevents = reqevents; - fd.desc.s = s->sock; - fd.client_data = s; - - p->socket_set[p->nelts] = fd; + p->socket_set[p->nelts] = &s->fd; p->nelts++; #ifdef TCN_DO_STATISTICS p->sp_added++; p->sp_max_count = TCN_MAX(p->sp_max_count, p->sp_added); #endif - return (jint)apr_pollset_add(p->pollset, &fd); + return (jint)apr_pollset_add(p->pollset, &s->fd); } TCN_IMPLEMENT_CALL(jint, Poll, add)(TCN_STDARGS, jlong pollset, @@ -222,18 +214,18 @@ static apr_status_t do_remove(tcn_pollse apr_int32_t i; for (i = 0; i < p->nelts; i++) { - if (fd->desc.s == p->socket_set[i].desc.s) { + if (fd->desc.s == p->socket_set[i]->desc.s) { /* Found an instance of the fd: remove this and any other copies */ apr_int32_t dst = i; apr_int32_t old_nelts = p->nelts; - tcn_socket_t *ds = (tcn_socket_t *)p->socket_set[dst].client_data; + tcn_socket_t *ds = (tcn_socket_t *)p->socket_set[dst]->client_data; p->nelts--; #ifdef TCN_DO_STATISTICS p->sp_removed++; #endif for (i++; i < old_nelts; i++) { - tcn_socket_t *ss = (tcn_socket_t *)p->socket_set[i].client_data; - if (fd->desc.s == p->socket_set[i].desc.s) { + tcn_socket_t *ss = (tcn_socket_t *)p->socket_set[i]->client_data; + if (fd->desc.s == p->socket_set[i]->desc.s) { #ifdef TCN_DO_STATISTICS p->sp_equals++; #endif @@ -243,7 +235,7 @@ static apr_status_t do_remove(tcn_pollse p->socket_set[dst] = p->socket_set[i]; ds->last_active = ss->last_active; ds->timeout = ss->timeout; - ds = (tcn_socket_t *)p->socket_set[++dst].client_data; + ds = (tcn_socket_t *)p->socket_set[++dst]->client_data; } } break; @@ -257,8 +249,8 @@ static void update_last_active(tcn_polls apr_int32_t i; for (i = 0; i < p->nelts; i++) { - if (fd->desc.s == p->socket_set[i].desc.s) { - tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i].client_data; + if (fd->desc.s == p->socket_set[i]->desc.s) { + tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i]->client_data; /* Found an instance of the fd: update last active time */ s->last_active = t; break; @@ -272,20 +264,16 @@ TCN_IMPLEMENT_CALL(jint, Poll, remove)(T { tcn_pollset_t *p = J2P(pollset, tcn_pollset_t *); tcn_socket_t *s = J2P(socket, tcn_socket_t *); - apr_pollfd_t fd; UNREFERENCED_STDARGS; TCN_ASSERT(socket != 0); - memset(&fd, 0, sizeof(apr_pollfd_t)); - fd.desc_type = APR_POLL_SOCKET; - fd.desc.s = s->sock; - fd.reqevents = APR_POLLIN | APR_POLLOUT; + s->fd.reqevents = APR_POLLIN | APR_POLLOUT; #ifdef TCN_DO_STATISTICS p->sp_remove++; #endif - return (jint)do_remove(p, &fd); + return (jint)do_remove(p, &s->fd); } @@ -312,7 +300,7 @@ TCN_IMPLEMENT_CALL(jint, Poll, poll)(TCN /* Find the minimum timeout */ for (i = 0; i < p->nelts; i++) { apr_interval_time_t socket_timeout = 0; - tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i].client_data; + tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i]->client_data; if (s->timeout == TCN_NO_SOCKET_TIMEOUT) { socket_timeout = p->default_timeout; } @@ -381,7 +369,7 @@ TCN_IMPLEMENT_CALL(jint, Poll, maintain) tcn_pollset_t *p = J2P(pollset, tcn_pollset_t *); apr_int32_t i = 0, num = 0; apr_time_t now = apr_time_now(); - apr_pollfd_t fd; + apr_pollfd_t *fd; UNREFERENCED(o); TCN_ASSERT(pollset != 0); @@ -389,7 +377,7 @@ TCN_IMPLEMENT_CALL(jint, Poll, maintain) /* Check for timeout sockets */ for (i = 0; i < p->nelts; i++) { apr_interval_time_t timeout = 0; - tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i].client_data; + tcn_socket_t *s = (tcn_socket_t *)p->socket_set[i]->client_data; if (s->timeout == TCN_NO_SOCKET_TIMEOUT) { timeout = p->default_timeout; } @@ -404,16 +392,14 @@ TCN_IMPLEMENT_CALL(jint, Poll, maintain) } } if (remove && num) { - memset(&fd, 0, sizeof(apr_pollfd_t)); #ifdef TCN_DO_STATISTICS p->sp_maintained += num; p->sp_max_maintained = TCN_MAX(p->sp_max_maintained, num); #endif for (i = 0; i < num; i++) { - fd.desc_type = APR_POLL_SOCKET; - fd.reqevents = APR_POLLIN | APR_POLLOUT; - fd.desc.s = (J2P(p->set[i], tcn_socket_t *))->sock; - do_remove(p, &fd); + fd = &(J2P(p->set[i], tcn_socket_t *)->fd); + fd->reqevents = APR_POLLIN | APR_POLLOUT; + do_remove(p, fd); } } if (num) @@ -440,17 +426,17 @@ TCN_IMPLEMENT_CALL(jint, Poll, pollset)( jlongArray set) { tcn_pollset_t *p = J2P(pollset, tcn_pollset_t *); - apr_int32_t i = 0; - apr_pollfd_t fd; + apr_int32_t i = 0; + apr_pollfd_t *fd; UNREFERENCED(o); TCN_ASSERT(pollset != 0); for (i = 0; i < p->nelts; i++) { - p->socket_set[i].rtnevents = APR_POLLHUP | APR_POLLIN; + p->socket_set[i]->rtnevents = APR_POLLHUP | APR_POLLIN; fd = p->socket_set[i]; - p->set[i*2+0] = (jlong)(fd.rtnevents); - p->set[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)->SetLongArrayRegion(e, set, 0, p->nelts * 2, p->set); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org