mturk 2005/05/27 09:39:13 Modified: jni/native/include tcn.h jni/native/src jnilib.c network.c poll.c Log: Add statistics data that is compiled in only if -DTCN_DO_STATISTICS is defined at compile time. Revision Changes Path 1.6 +5 -3 jakarta-tomcat-connectors/jni/native/include/tcn.h Index: tcn.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/include/tcn.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- tcn.h 24 May 2005 09:24:39 -0000 1.5 +++ tcn.h 27 May 2005 16:39:13 -0000 1.6 @@ -18,7 +18,7 @@ * @author Mladen Turk * @version $Revision$, $Date$ */ - + #ifndef TCN_H #define TCN_H @@ -138,5 +138,7 @@ typedef struct tcn_callback tcn_callback_t; - +#ifdef TCN_DO_STATISTICS +#define TCN_MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif #endif /* TCN_H */ 1.5 +17 -4 jakarta-tomcat-connectors/jni/native/src/jnilib.c Index: jnilib.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/jnilib.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jnilib.c 24 May 2005 09:24:40 -0000 1.4 +++ jnilib.c 27 May 2005 16:39:13 -0000 1.5 @@ -18,7 +18,7 @@ * @author Mladen Turk * @version $Revision$, $Date$ */ - + #include "apr.h" #include "apr_pools.h" #include "apr_version.h" @@ -30,6 +30,10 @@ #include "tcn.h" #include "tcn_version.h" +#ifdef TCN_DO_STATISTICS +extern void sp_poll_dump_statistics(); +extern void sp_network_dump_statistics(); +#endif apr_pool_t *tcn_global_pool = NULL; static JavaVM *tcn_global_vm = NULL; @@ -44,7 +48,7 @@ JNIEnv *env; UNREFERENCED(reserved); - if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2)) { + if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4)) { return JNI_ERR; } tcn_global_vm = vm; @@ -63,7 +67,7 @@ return JNI_ERR; apr_initialize(); - return JNI_VERSION_1_2; + return JNI_VERSION_1_4; } @@ -73,6 +77,7 @@ JNIEnv *env; UNREFERENCED(reserved); + if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2)) { return; } @@ -161,8 +166,16 @@ UNREFERENCED_STDARGS; if (tcn_global_pool) { +#ifdef TCN_DO_STATISTICS + fprintf(stderr, "APR Statistical data ....\n"); +#endif apr_pool_destroy(tcn_global_pool); tcn_global_pool = NULL; +#ifdef TCN_DO_STATISTICS + sp_poll_dump_statistics(); + sp_network_dump_statistics(); + fprintf(stderr, "APR Terminated\n"); +#endif } } 1.21 +51 -3 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.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- network.c 24 May 2005 09:24:40 -0000 1.20 +++ network.c 27 May 2005 16:39:13 -0000 1.21 @@ -18,12 +18,19 @@ * @author Mladen Turk * @version $Revision$, $Date$ */ - + #include "apr.h" #include "apr_pools.h" #include "apr_network_io.h" +#include "apr_portable.h" #include "tcn.h" +#ifdef TCN_DO_STATISTICS +static int sp_created = 0; +static int sp_closed = 0; +static int sp_cleared = 0; +static int sp_accepted = 0; +#endif #if !APR_HAVE_IPV6 #define APR_INET6 APR_INET @@ -40,6 +47,25 @@ else if (F == 1) T = SOCK_DGRAM; \ else T = F +#ifdef TCN_DO_STATISTICS + +static apr_status_t sp_socket_cleanup(void *data) +{ + sp_cleared++; + return APR_SUCCESS; +} + +void sp_network_dump_statistics() +{ + fprintf(stderr, "Network Statistics ......\n"); + fprintf(stderr, "Sockets created : %d\n", sp_created); + fprintf(stderr, "Sockets accepted : %d\n", sp_accepted); + fprintf(stderr, "Sockets closed : %d\n", sp_closed); + fprintf(stderr, "Sockets cleared : %d\n", sp_cleared); +} + +#endif + TCN_IMPLEMENT_CALL(jlong, Address, info)(TCN_STDARGS, jstring hostname, jint family, jint port, @@ -138,6 +164,13 @@ TCN_THROW_IF_ERR(apr_socket_create(&s, f, t, protocol, p), s); +#ifdef TCN_DO_STATISTICS + sp_created++; + apr_pool_cleanup_register(p, (const void *)s, + sp_socket_cleanup, + apr_pool_cleanup_null); +#endif + cleanup: return P2J(s); @@ -159,6 +192,12 @@ UNREFERENCED_STDARGS; TCN_ASSERT(sock != 0); + +#ifdef TCN_DO_STATISTICS + sp_closed++; + apr_pool_cleanup_kill((apr_pool_t *)s, s, sp_socket_cleanup); +#endif + return (jint)apr_socket_close(s); } @@ -193,7 +232,16 @@ UNREFERENCED(o); TCN_ASSERT(sock != 0); - TCN_THROW_IF_ERR(apr_socket_accept(&n, s, p), s); + TCN_THROW_IF_ERR(apr_socket_accept(&n, s, p), n); + +#ifdef TCN_DO_STATISTICS + if (n) { + sp_accepted++; + apr_pool_cleanup_register(p, (const void *)n, + sp_socket_cleanup, + apr_pool_cleanup_null); + } +#endif cleanup: return P2J(n); 1.15 +106 -6 jakarta-tomcat-connectors/jni/native/src/poll.c Index: poll.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/poll.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- poll.c 24 May 2005 09:24:40 -0000 1.14 +++ poll.c 27 May 2005 16:39:13 -0000 1.15 @@ -18,12 +18,19 @@ * @author Mladen Turk * @version $Revision$, $Date$ */ - + #include "apr.h" #include "apr_pools.h" #include "apr_poll.h" #include "tcn.h" + +#ifdef TCN_DO_STATISTICS +static int sp_created = 0; +static int sp_destroyed = 0; +static int sp_cleared = 0; +#endif + /* Internal poll structure for queryset */ @@ -35,8 +42,59 @@ apr_pollfd_t *socket_set; apr_interval_time_t *socket_ttl; apr_interval_time_t max_ttl; +#ifdef TCN_DO_STATISTICS + int sp_added; + int sp_max_count; + int sp_poll; + int sp_polled; + int sp_max_polled; + int sp_remove; + int sp_removed; + int sp_maintained; + int sp_max_maintained; + int sp_err_poll; + int sp_poll_timeout; + int sp_overflow; + int sp_equals; +#endif } tcn_pollset_t; +#ifdef TCN_DO_STATISTICS +static void sp_poll_statistics(tcn_pollset_t *p) +{ + fprintf(stderr, "Pollset Statistics ......\n"); + fprintf(stderr, "Number of added sockets : %d\n", p->sp_added); + fprintf(stderr, "Max. number of sockets : %d\n", p->sp_max_count); + fprintf(stderr, "Poll calls : %d\n", p->sp_poll); + fprintf(stderr, "Poll timeouts : %d\n", p->sp_poll_timeout); + fprintf(stderr, "Poll errors : %d\n", p->sp_err_poll); + fprintf(stderr, "Poll overflows : %d\n", p->sp_overflow); + fprintf(stderr, "Polled sockets : %d\n", p->sp_polled); + fprintf(stderr, "Max. Polled sockets : %d\n", p->sp_max_polled); + fprintf(stderr, "Poll remove : %d\n", p->sp_remove); + fprintf(stderr, "Total removed : %d\n", p->sp_removed); + fprintf(stderr, "Maintained : %d\n", p->sp_maintained); + fprintf(stderr, "Max. maintained : %d\n", p->sp_max_maintained); + fprintf(stderr, "Number of duplicates : %d\n", p->sp_equals); + +} + +static apr_status_t sp_poll_cleanup(void *data) +{ + sp_cleared++; + sp_poll_statistics(data); + return APR_SUCCESS; +} + +void sp_poll_dump_statistics() +{ + fprintf(stderr, "Poll Statistics .........\n"); + fprintf(stderr, "Polls created : %d\n", sp_created); + fprintf(stderr, "Polls destroyed : %d\n", sp_destroyed); + fprintf(stderr, "Polls cleared : %d\n", sp_cleared); +} +#endif + TCN_IMPLEMENT_CALL(jlong, Poll, create)(TCN_STDARGS, jint size, jlong pool, jint flags, jlong ttl) @@ -69,6 +127,12 @@ tps->nalloc = size; tps->pool = p; tps->max_ttl = J2T(ttl); +#ifdef TCN_DO_STATISTICS + sp_created++; + apr_pool_cleanup_register(p, (const void *)tps, + sp_poll_cleanup, + apr_pool_cleanup_null); +#endif cleanup: return P2J(tps); } @@ -79,6 +143,11 @@ UNREFERENCED_STDARGS; TCN_ASSERT(pollset != 0); +#ifdef TCN_DO_STATISTICS + sp_destroyed++; + apr_pool_cleanup_kill(p->pool, p, sp_poll_cleanup); + sp_poll_statistics(p); +#endif return (jint)apr_pollset_destroy(p->pollset); } @@ -92,9 +161,12 @@ UNREFERENCED_STDARGS; TCN_ASSERT(socket != 0); - if (p->nelts == p->nalloc) + if (p->nelts == p->nalloc) { +#ifdef TCN_DO_STATISTICS + p->sp_overflow++; +#endif return APR_ENOMEM; - + } memset(&fd, 0, sizeof(apr_pollfd_t)); fd.desc_type = APR_POLL_SOCKET; fd.reqevents = (apr_int16_t)reqevents; @@ -103,6 +175,10 @@ p->socket_ttl[p->nelts] = apr_time_now(); p->socket_set[p->nelts] = 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); } @@ -116,8 +192,14 @@ apr_int32_t dst = i; apr_int32_t old_nelts = p->nelts; p->nelts--; +#ifdef TCN_DO_STATISTICS + p->sp_removed++; +#endif for (i++; i < old_nelts; i++) { if (fd->desc.s == p->socket_set[i].desc.s) { +#ifdef TCN_DO_STATISTICS + p->sp_equals++; +#endif p->nelts--; } else { @@ -143,6 +225,9 @@ memset(&fd, 0, sizeof(apr_pollfd_t)); fd.desc_type = APR_POLL_SOCKET; fd.desc.s = J2P(socket, apr_socket_t *); +#ifdef TCN_DO_STATISTICS + p->sp_remove++; +#endif return (jint)do_remove(p, &fd); } @@ -161,12 +246,23 @@ UNREFERENCED(o); TCN_ASSERT(pollset != 0); - if (rv != APR_SUCCESS) - return (jint)(-rv); +#ifdef TCN_DO_STATISTICS + p->sp_poll++; +#endif if ((rv = apr_pollset_poll(p->pollset, J2T(timeout), &num, &fd)) != APR_SUCCESS) { +#ifdef TCN_DO_STATISTICS + if (APR_STATUS_IS_TIMEUP(rv)) + p->sp_poll_timeout++; + else + p->sp_err_poll++; +#endif num = (apr_int32_t)(-rv); } if (num > 0) { +#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*4+0] = (jlong)(fd->rtnevents); pset[i*4+1] = P2J(fd->desc.s); @@ -211,6 +307,10 @@ } 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.desc.s = J2P(pset[i*4+1], apr_socket_t *);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]