mturk 2005/06/18 01:03:21
Modified: jni/examples/org/apache/tomcat/jni Echo.java SSLServer.java
jni/java/org/apache/tomcat/jni Poll.java SSLSocket.java
Socket.java
jni/native/include tcn.h
jni/native/src network.c poll.c
util/java/org/apache/tomcat/util/net AprEndpoint.java
Log:
Use auto pool management for Socket.accept.
On each accept the socket's child pool is created and assigned
to the accepted socket.
Revision Changes Path
1.14 +2 -2
jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/Echo.java
Index: Echo.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/Echo.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Echo.java 17 Jun 2005 12:03:51 -0000 1.13
+++ Echo.java 18 Jun 2005 08:03:21 -0000 1.14
@@ -99,7 +99,7 @@
int i = 0;
try {
while (true) {
- long clientSock = Socket.accept(serverSock, pool);
+ long clientSock = Socket.accept(serverSock);
System.out.println("Accepted id: " + i);
try {
1.10 +3 -3
jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java
Index: SSLServer.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/SSLServer.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- SSLServer.java 17 Jun 2005 12:03:51 -0000 1.9
+++ SSLServer.java 18 Jun 2005 08:03:21 -0000 1.10
@@ -116,7 +116,7 @@
int i = 0;
try {
while (true) {
- long clientSock = Socket.accept(serverSock, pool);
+ long clientSock = Socket.accept(serverSock);
System.out.println("Accepted id: " + i);
try {
@@ -142,7 +142,7 @@
}
Socket.timeoutSet(clientSock, 10000000);
- SSLSocket.attach(SSLServer.serverCtx, clientSock, pool);
+ SSLSocket.attach(SSLServer.serverCtx, clientSock);
i = SSLSocket.handshake(clientSock);
if (i == 0) {
1.13 +3 -4
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Poll.java
Index: Poll.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Poll.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Poll.java 17 Jun 2005 11:22:04 -0000 1.12
+++ Poll.java 18 Jun 2005 08:03:21 -0000 1.13
@@ -113,11 +113,10 @@
* Maintain on the descriptor(s) in a pollset
* @param pollset The pollset to use
* @param descriptors Array of signalled descriptors (output parameter)
- * The desctiptor array must be two times the size of pollset.
+ * The desctiptor array must be the size of pollset.
* and are populated as follows:
* <PRE>
- * descriptors[n + 0] -> returned events
- * descriptors[n + 1] -> socket
+ * descriptors[n] -> socket
* </PRE>
* @param remove Remove signaled descriptors from pollset
* @return Number of signalled descriptors (output parameter)
1.15 +3 -5
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java
Index: SSLSocket.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSLSocket.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SSLSocket.java 17 Jun 2005 12:04:40 -0000 1.14
+++ SSLSocket.java 18 Jun 2005 08:03:21 -0000 1.15
@@ -30,12 +30,10 @@
/**
* Attach APR socket on a SSL connection.
* @param ctx SSLContext to use.
- * @param sock APR Socket that already did physical connect.
- * @param pool The pool to use
- * @param pool The pool to use
+ * @param sock APR Socket that already did physical connect or accept.
* @return APR_STATUS code.
*/
- public static native int attach(long ctx, long sock, long pool)
+ public static native int attach(long ctx, long sock)
throws Exception;
/**
1.17 +3 -3
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Socket.java
Index: Socket.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Socket.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- Socket.java 17 Jun 2005 09:41:30 -0000 1.16
+++ Socket.java 18 Jun 2005 08:03:21 -0000 1.17
@@ -102,7 +102,7 @@
* @param family The address family of the socket (e.g., APR_INET).
* @param type The type of the socket (e.g., SOCK_STREAM).
* @param protocol The protocol of the socket (e.g., APR_PROTO_TCP).
- * @param cont The pool to use
+ * @param cont The parent pool to use
* @return The new socket that has been set up.
*/
public static native long create(int family, int type,
@@ -163,7 +163,7 @@
* made the connection request. This is the socket which should
* be used for all future communication.
*/
- public static native long accept(long sock, long pool)
+ public static native long accept(long sock)
throws Exception;
/**
1.22 +6 -6 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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- tcn.h 17 Jun 2005 14:17:00 -0000 1.21
+++ tcn.h 18 Jun 2005 08:03:21 -0000 1.22
@@ -118,11 +118,11 @@
void *opaque;
int type;
apr_status_t (*cleanup)(void *);
- apr_status_t (APR_THREAD_FUNC *net_send) (void *, const char *,
apr_size_t *);
- apr_status_t (APR_THREAD_FUNC *net_sendv)(void *sock, const struct iovec
*, apr_int32_t, apr_size_t *);
- apr_status_t (APR_THREAD_FUNC *net_recv) (void *sock, char *, apr_size_t
*);
- apr_status_t (APR_THREAD_FUNC *net_close) (void *);
- apr_status_t (APR_THREAD_FUNC *net_shutdown) (void *,
apr_shutdown_how_e);
+ apr_status_t (APR_THREAD_FUNC *send) (void *, const char *, apr_size_t
*);
+ apr_status_t (APR_THREAD_FUNC *sendv)(void *, const struct iovec *,
apr_int32_t, apr_size_t *);
+ apr_status_t (APR_THREAD_FUNC *recv) (void *, char *, apr_size_t *);
+ apr_status_t (APR_THREAD_FUNC *close) (void *);
+ apr_status_t (APR_THREAD_FUNC *shutdown) (void *, apr_shutdown_how_e);
} tcn_socket_t;
1.30 +104 -33 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.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- network.c 17 Jun 2005 14:17:00 -0000 1.29
+++ network.c 18 Jun 2005 08:03:21 -0000 1.30
@@ -150,7 +150,7 @@
static apr_status_t sp_socket_cleanup(void *data)
{
tcn_socket_t *s = (tcn_socket_t *)data;
-
+
if (s->cleanup) {
(*s->cleanup)(s->opaque);
s->cleanup = NULL;
@@ -165,9 +165,42 @@
return APR_SUCCESS;
}
+#if defined(DEBUG) || defined(_DEBUG)
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_send(void *sock, const char *buf, apr_size_t *len)
+{
+ return apr_socket_send((apr_socket_t *)sock, buf, len);
+}
+
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_recv(void *sock, char *buf, apr_size_t *len)
+{
+ return apr_socket_recv((apr_socket_t *)sock, buf, len);
+}
+
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_sendv(void *sock, const struct iovec *vec,
+ apr_int32_t nvec, apr_size_t *len)
+{
+ return apr_socket_sendv((apr_socket_t *)sock, vec, nvec, len);
+}
+
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_shutdown(void *sock, apr_shutdown_how_e how)
+{
+ return apr_socket_shutdown((apr_socket_t *)sock, how);
+}
+
+#else
+#define APR_socket_send apr_socket_send
+#define APR_socket_recv apr_socket_recv
+#define APR_socket_sendv apr_socket_sendv
+#define APR_socket_shutdown apr_socket_shutdown
+#endif
TCN_IMPLEMENT_CALL(jlong, Socket, create)(TCN_STDARGS, jint family,
- jint type, jint protocol, jlong
pool)
+ jint type, jint protocol,
+ jlong pool)
{
apr_pool_t *p = J2P(pool, apr_pool_t *);
apr_socket_t *s = NULL;
@@ -180,7 +213,7 @@
GET_S_TYPE(t, type);
TCN_THROW_IF_ERR(apr_socket_create(&s,
- f, t, protocol, p), s);
+ f, t, protocol, p), a);
#ifdef TCN_DO_STATISTICS
sp_created++;
@@ -189,12 +222,12 @@
a->sock = s;
a->pool = p;
a->type = TCN_SOCKET_APR;
- a->net_recv = apr_socket_recv;
- a->net_send = apr_socket_send;
- a->net_sendv = apr_socket_sendv;
- a->net_shutdown = apr_socket_shutdown;
- a->net_close = NULL;
- a->opaque = s;
+ a->recv = APR_socket_recv;
+ a->send = APR_socket_send;
+ a->sendv = APR_socket_sendv;
+ a->shutdown = APR_socket_shutdown;
+ a->close = NULL;
+ a->opaque = s;
apr_pool_cleanup_register(p, (const void *)a,
sp_socket_cleanup,
apr_pool_cleanup_null);
@@ -229,7 +262,7 @@
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
- return (jint)(*s->net_shutdown)(s->opaque, how);
+ return (jint)(*s->shutdown)(s->opaque, how);
}
TCN_IMPLEMENT_CALL(jint, Socket, close)(TCN_STDARGS, jlong sock)
@@ -242,8 +275,8 @@
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_closed);
#endif
- if (s->net_close)
- rv = (*s->net_close)(s->opaque);
+ if (s->close)
+ rv = (*s->close)(s->opaque);
if (s->sock) {
rv = (jint)apr_socket_close(s->sock);
s->sock = NULL;
@@ -272,8 +305,8 @@
return (jint)apr_socket_listen(s->sock, backlog);
}
-TCN_IMPLEMENT_CALL(jlong, Socket, accept)(TCN_STDARGS, jlong sock,
- jlong pool)
+TCN_IMPLEMENT_CALL(jlong, Socket, acceptx)(TCN_STDARGS, jlong sock,
+ jlong pool)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
apr_pool_t *p = J2P(pool, apr_pool_t *);
@@ -293,12 +326,12 @@
a->sock = n;
a->pool = p;
a->type = TCN_SOCKET_APR;
- a->net_recv = apr_socket_recv;
- a->net_send = apr_socket_send;
- a->net_sendv = apr_socket_sendv;
- a->net_shutdown = apr_socket_shutdown;
- a->net_close = NULL;
- a->opaque = n;
+ a->recv = APR_socket_recv;
+ a->send = APR_socket_send;
+ a->sendv = APR_socket_sendv;
+ a->shutdown = APR_socket_shutdown;
+ a->close = NULL;
+ a->opaque = n;
apr_pool_cleanup_register(p, (const void *)a,
sp_socket_cleanup,
apr_pool_cleanup_null);
@@ -308,6 +341,44 @@
return P2J(a);
}
+TCN_IMPLEMENT_CALL(jlong, Socket, accept)(TCN_STDARGS, jlong sock)
+{
+ tcn_socket_t *s = J2P(sock, tcn_socket_t *);
+ apr_pool_t *p = NULL;
+ apr_socket_t *n = NULL;
+ tcn_socket_t *a = NULL;
+
+ UNREFERENCED(o);
+ TCN_ASSERT(sock != 0);
+
+ TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p);
+ TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
+
+ if (n) {
+#ifdef TCN_DO_STATISTICS
+ apr_atomic_inc32(&sp_accepted);
+#endif
+ a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
+ a->sock = n;
+ a->pool = p;
+ a->type = TCN_SOCKET_APR;
+ a->recv = APR_socket_recv;
+ a->send = APR_socket_send;
+ a->sendv = APR_socket_sendv;
+ a->shutdown = APR_socket_shutdown;
+ a->close = NULL;
+ a->opaque = n;
+ apr_pool_cleanup_register(p, (const void *)a,
+ sp_socket_cleanup,
+ apr_pool_cleanup_null);
+ }
+ else if (p)
+ apr_pool_destroy(p);
+
+cleanup:
+ return P2J(a);
+}
+
TCN_IMPLEMENT_CALL(jint, Socket, connect)(TCN_STDARGS, jlong sock,
jlong sa)
{
@@ -328,7 +399,7 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
-
+
if (tosend <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
(*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb);
@@ -342,7 +413,7 @@
bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
else
bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->send)(s->opaque, bytes + offset, &nbytes);
if (nb)
(*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
else
@@ -369,7 +440,7 @@
TCN_ASSERT(buf != NULL);
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
- ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->send)(s->opaque, bytes + offset, &nbytes);
if (ss == APR_SUCCESS)
return (jint)nbytes;
@@ -403,7 +474,7 @@
vec[i].iov_base = (*e)->GetByteArrayElements(e, ba[i], NULL);
}
- ss = (*s->net_sendv)(s->opaque, vec, nvec, &written);
+ ss = (*s->sendv)(s->opaque, vec, nvec, &written);
for (i = 0; i < nvec; i++) {
(*e)->ReleaseByteArrayElements(e, ba[i], vec[i].iov_base, JNI_ABORT);
@@ -463,13 +534,13 @@
if (toread <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
-
- if ((ss = (*s->net_recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS)
+
+ if ((ss = (*s->recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS)
(*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
}
else {
jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->recv)(s->opaque, bytes + offset, &nbytes);
(*e)->ReleaseByteArrayElements(e, buf, bytes,
nbytes ? 0 : JNI_ABORT);
}
@@ -500,12 +571,12 @@
goto cleanup;
if (toread <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
- ss = (*s->net_recv)(s->opaque, sb, &nbytes);
+ ss = (*s->recv)(s->opaque, sb, &nbytes);
(*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
}
else {
jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->recv)(s->opaque, bytes + offset, &nbytes);
(*e)->ReleaseByteArrayElements(e, buf, bytes,
nbytes ? 0 : JNI_ABORT);
}
@@ -534,7 +605,7 @@
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
TCN_ASSERT(bytes != NULL);
- ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->recv)(s->opaque, bytes + offset, &nbytes);
if (ss == APR_SUCCESS)
return (jint)nbytes;
@@ -565,7 +636,7 @@
return -(jint)ss;
if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
return -(jint)ss;
- ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
+ ss = (*s->recv)(s->opaque, bytes + offset, &nbytes);
/* Resore the original timeout */
apr_socket_timeout_set(s->sock, t);
@@ -686,7 +757,7 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(file != 0);
-
+
if (s->type != TCN_SOCKET_APR)
return (jint)(-APR_ENOTIMPL);
if (headers)
1.22 +3 -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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- poll.c 17 Jun 2005 09:41:30 -0000 1.21
+++ poll.c 18 Jun 2005 08:03:21 -0000 1.22
@@ -292,11 +292,8 @@
if (p->max_ttl > 0) {
for (i = 0; i < p->nelts; i++) {
if ((now - p->socket_ttl[i]) > p->max_ttl) {
- p->socket_set[i].rtnevents = APR_POLLHUP | APR_POLLIN;
fd = p->socket_set[i];
- pset[num*2+0] = (jlong)(fd.rtnevents);
- pset[num*2+1] = P2J(fd.client_data);
- num++;
+ pset[num++] = P2J(fd.client_data);
}
}
if (remove && num) {
@@ -307,7 +304,7 @@
#endif
for (i = 0; i < num; i++) {
fd.desc_type = APR_POLL_SOCKET;
- fd.desc.s = (J2P(pset[i*2+1], tcn_socket_t *))->sock;
+ fd.desc.s = (J2P(pset[i], tcn_socket_t *))->sock;
do_remove(p, &fd);
}
}
1.48 +2 -5
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java
Index: AprEndpoint.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- AprEndpoint.java 17 Jun 2005 12:31:40 -0000 1.47
+++ AprEndpoint.java 18 Jun 2005 08:03:21 -0000 1.48
@@ -722,11 +722,8 @@
Worker workerThread = getWorkerThread();
// Accept the next incoming connection from the server socket
- long socket = 0;
- long pool = 0;
try {
- pool = Pool.create(serverSockPool);
- socket = Socket.accept(serverSock, pool);
+ long socket = Socket.accept(serverSock);
// Hand this socket off to an appropriate processor
workerThread.assign(socket);
} catch (Exception e) {
@@ -916,7 +913,7 @@
keepAliveCount -= rv;
for (int n = 0; n < rv; n++) {
// Close socket and clear pool
- Socket.destroy(desc[n*2+1]);
+ Socket.destroy(desc[n]);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]