mturk 2005/06/17 07:17:00
Modified: jni/native/include tcn.h
jni/native/src network.c sslnetwork.c
Log:
Instead duplicating entire Socket API, duplicate APR API.
Revision Changes Path
1.21 +12 -16 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.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- tcn.h 17 Jun 2005 11:22:30 -0000 1.20
+++ tcn.h 17 Jun 2005 14:17:00 -0000 1.21
@@ -45,7 +45,7 @@
#include <process.h>
#else
#include <unistd.h>
-#endif
+#endif
#include <jni.h>
#if defined(_DEBUG) || defined(DEBUG)
@@ -107,26 +107,22 @@
#define TCN_GETNET_METHOD(FN) method_##FN
-#define TCN_SOCKET_APR 1
-#define TCN_SOCKET_SSL 2
-#define TCN_SOCKET_UNIX 4
-#define TCN_SOCKET_NTPIPE 5
+#define TCN_SOCKET_APR 0
+#define TCN_SOCKET_SSL 1
+#define TCN_SOCKET_UNIX 2
+#define TCN_SOCKET_NTPIPE 3
typedef struct {
apr_pool_t *pool;
apr_socket_t *sock;
void *opaque;
int type;
- apr_status_t (*cleanup)(void *opaque);
- jint (*shutdown)(TCN_IMPARGS, jint how);
- jint (*close)(TCN_IMPARGS);
- jint (*send)(TCN_IMPARGS, jbyteArray buf, jint offset, jint tosend);
- jint (*sendb)(TCN_IMPARGS, jobject buf, jint offset, jint len);
- jint (*sendv)(TCN_IMPARGS, jobjectArray bufs);
- jint (*recv)(TCN_IMPARGS, jbyteArray buf, jint offset, jint toread);
- jint (*recvt)(TCN_IMPARGS, jbyteArray buf, jint offset, jint toread,
jlong timeout);
- jint (*recvb)(TCN_IMPARGS, jobject buf, jint offset, jint len);
- jint (*recvbt)(TCN_IMPARGS, jobject buf, jint offset, jint len, jlong
timeout);
+ 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);
} tcn_socket_t;
1.29 +27 -34 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.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- network.c 17 Jun 2005 11:22:30 -0000 1.28
+++ network.c 17 Jun 2005 14:17:00 -0000 1.29
@@ -189,6 +189,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;
apr_pool_cleanup_register(p, (const void *)a,
sp_socket_cleanup,
apr_pool_cleanup_null);
@@ -223,10 +229,7 @@
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
- if (s->shutdown)
- return (*s->shutdown)(TCN_IMPCALL(s), how);
- else
- return (jint)apr_socket_shutdown(s->sock, (apr_shutdown_how_e)how);
+ return (jint)(*s->net_shutdown)(s->opaque, how);
}
TCN_IMPLEMENT_CALL(jint, Socket, close)(TCN_STDARGS, jlong sock)
@@ -239,9 +242,9 @@
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_closed);
#endif
- if (s->close)
- rv = (*s->close)(TCN_IMPCALL(s));
- if (s->sock) {
+ if (s->net_close)
+ rv = (*s->net_close)(s->opaque);
+ if (s->sock) {
rv = (jint)apr_socket_close(s->sock);
s->sock = NULL;
}
@@ -290,6 +293,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;
apr_pool_cleanup_register(p, (const void *)a,
sp_socket_cleanup,
apr_pool_cleanup_null);
@@ -320,8 +329,6 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- if (s->send)
- return (*s->send)(TCN_IMPCALL(s), buf, offset, tosend);
if (tosend <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
(*e)->GetByteArrayRegion(e, buf, offset, tosend, (jbyte *)sb);
@@ -335,8 +342,7 @@
bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
else
bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = apr_socket_send(s->sock, bytes + offset, &nbytes);
-
+ ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes);
if (nb)
(*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
else
@@ -361,11 +367,9 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(buf != NULL);
- if (s->sendb)
- return (*s->sendb)(TCN_IMPCALL(s), buf, offset, len);
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
- ss = apr_socket_send(s->sock, bytes + offset, &nbytes);
+ ss = (*s->net_send)(s->opaque, bytes + offset, &nbytes);
if (ss == APR_SUCCESS)
return (jint)nbytes;
@@ -389,8 +393,6 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- if (s->sendv)
- return (*s->sendv)(TCN_IMPCALL(s), bufs);
nvec = (*e)->GetArrayLength(e, bufs);
if (nvec >= APR_MAX_IOVEC_SIZE)
return (jint)(-APR_ENOMEM);
@@ -401,7 +403,7 @@
vec[i].iov_base = (*e)->GetByteArrayElements(e, ba[i], NULL);
}
- ss = apr_socket_sendv(s->sock, vec, nvec, &written);
+ ss = (*s->net_sendv)(s->opaque, vec, nvec, &written);
for (i = 0; i < nvec; i++) {
(*e)->ReleaseByteArrayElements(e, ba[i], vec[i].iov_base, JNI_ABORT);
@@ -459,17 +461,15 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- if (s->recv)
- return (*s->recv)(TCN_IMPCALL(s), buf, offset, toread);
-
if (toread <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
- if ((ss = apr_socket_recv(s->sock, sb, &nbytes)) == APR_SUCCESS)
+
+ if ((ss = (*s->net_recv)(s->opaque, sb, &nbytes)) == APR_SUCCESS)
(*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
}
else {
jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = apr_socket_recv(s->sock, bytes + offset, &nbytes);
+ ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
(*e)->ReleaseByteArrayElements(e, buf, bytes,
nbytes ? 0 : JNI_ABORT);
}
@@ -494,20 +494,18 @@
TCN_ASSERT(sock != 0);
TCN_ASSERT(buf != NULL);
- if (s->recvt)
- return (*s->recvt)(TCN_IMPCALL(s), buf, offset, toread, timeout);
if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
goto cleanup;
if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
goto cleanup;
if (toread <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
- ss = apr_socket_recv(s->sock, sb, &nbytes);
+ ss = (*s->net_recv)(s->opaque, sb, &nbytes);
(*e)->SetByteArrayRegion(e, buf, offset, (jsize)nbytes, sb);
}
else {
jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = apr_socket_recv(s->sock, bytes + offset, &nbytes);
+ ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
(*e)->ReleaseByteArrayElements(e, buf, bytes,
nbytes ? 0 : JNI_ABORT);
}
@@ -533,12 +531,10 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
TCN_ASSERT(buf != NULL);
- if (s->recvb)
- return (*s->recvb)(TCN_IMPCALL(s), buf, offset, len);
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
TCN_ASSERT(bytes != NULL);
- ss = apr_socket_recv(s->sock, bytes + offset, &nbytes);
+ ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
if (ss == APR_SUCCESS)
return (jint)nbytes;
@@ -562,9 +558,6 @@
TCN_ASSERT(sock != 0);
TCN_ASSERT(buf != NULL);
- if (s->recvbt)
- return (*s->recvbt)(TCN_IMPCALL(s), buf, offset, len, timeout);
-
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
TCN_ASSERT(bytes != NULL);
@@ -572,7 +565,7 @@
return -(jint)ss;
if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
return -(jint)ss;
- ss = apr_socket_recv(s->sock, bytes + offset, &nbytes);
+ ss = (*s->net_recv)(s->opaque, bytes + offset, &nbytes);
/* Resore the original timeout */
apr_socket_timeout_set(s->sock, t);
1.15 +38 -222 jakarta-tomcat-connectors/jni/native/src/sslnetwork.c
Index: sslnetwork.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslnetwork.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- sslnetwork.c 17 Jun 2005 12:04:40 -0000 1.14
+++ sslnetwork.c 17 Jun 2005 14:17:00 -0000 1.15
@@ -91,7 +91,7 @@
return rc;
}
-TCN_IMPLEMENT_METHOD(apr_status_t, cleanup)(void *data)
+static apr_status_t ssl_cleanup(void *data)
{
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)data;
@@ -181,7 +181,7 @@
apr_socket_timeout_get(con->sock, &timeout);
pfd.desc_type = APR_POLL_SOCKET;
- pfd.desc.s = con->sock;
+ pfd.desc.s = con->sock;
pfd.reqevents = type;
/* Remove the object if it was in the pollset, then add in the new
@@ -205,13 +205,12 @@
return status;
}
-TCN_IMPLEMENT_METHOD(jint, shutdown)(TCN_IMPARGS, jint how)
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_shutdown(void *sock, apr_shutdown_how_e how)
{
apr_status_t rv = APR_SUCCESS;
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
- UNREFERENCED_STDARGS;
- TCN_ASSERT(sock != 0);
if (con->ssl) {
if (how < 1)
how = con->shutdown_type;
@@ -220,15 +219,14 @@
SSL_free(con->ssl);
con->ssl = NULL;
}
- return (jint)rv;
+ return rv;
}
-TCN_IMPLEMENT_METHOD(jint, close)(TCN_IMPARGS)
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_close(void *sock)
{
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
apr_status_t rv = APR_SUCCESS;
- UNREFERENCED_STDARGS;
- TCN_ASSERT(sock != 0);
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&ssl_closed);
@@ -242,7 +240,7 @@
X509_free(con->peer);
con->peer = NULL;
}
- return (jint)rv;
+ return rv;
}
TCN_IMPLEMENT_CALL(jint, SSLSocket, handshake)(TCN_STDARGS, jlong sock)
@@ -310,7 +308,8 @@
return APR_SUCCESS;
}
-static apr_status_t ssl_socket_recv(tcn_ssl_conn_t *con, char *buf,
apr_size_t *len)
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_recv(tcn_ssl_conn_t *con, char *buf, apr_size_t *len)
{
int s, rd = (int)(*len);
apr_status_t rv = APR_SUCCESS;
@@ -355,8 +354,9 @@
return rv;
}
-static apr_status_t ssl_socket_send(tcn_ssl_conn_t *con, const char *buf,
- apr_size_t *len)
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_send(tcn_ssl_conn_t *con, const char *buf,
+ apr_size_t *len)
{
int s, rd = (int)(*len);
apr_status_t rv = APR_SUCCESS;
@@ -396,207 +396,27 @@
return rv;
}
-TCN_IMPLEMENT_METHOD(jint, send)(TCN_IMPARGS,
- jbyteArray buf, jint offset,
- jint tosend)
-{
- tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock;
- apr_size_t nbytes = (apr_size_t)tosend;
- jbyte *bytes;
- apr_int32_t nb;
- apr_status_t ss;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- apr_socket_opt_get(s->sock, APR_SO_NONBLOCK, &nb);
- if (nb)
- bytes = (*e)->GetPrimitiveArrayCritical(e, buf, NULL);
- else
- bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- ss = ssl_socket_send(s, bytes + offset, &nbytes);
- if (nb)
- (*e)->ReleasePrimitiveArrayCritical(e, buf, bytes, JNI_ABORT);
- else
- (*e)->ReleaseByteArrayElements(e, buf, bytes, JNI_ABORT);
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
-
-TCN_IMPLEMENT_METHOD(jint, sendv)(TCN_IMPARGS,
- jobjectArray bufs)
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_sendv(tcn_ssl_conn_t *sock,
+ const struct iovec *vec,
+ apr_int32_t nvec, apr_size_t *len)
{
- tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock;
- jsize nvec = (*e)->GetArrayLength(e, bufs);
- jsize i;
- jobject ba;
- apr_size_t written = 0;
- apr_status_t ss;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
+ apr_status_t rv;
+ apr_size_t readed = 0;
+ apr_int32_t i;
- if (nvec >= APR_MAX_IOVEC_SIZE)
- return (jint)(-APR_ENOMEM);
for (i = 0; i < nvec; i++) {
- apr_size_t len;
- jbyte *buf;
- ba = (*e)->GetObjectArrayElement(e, bufs, i);
- len = (*e)->GetArrayLength(e, ba);
- buf = (*e)->GetByteArrayElements(e, ba, NULL);
- ss = ssl_socket_send(s, buf, &len);
- (*e)->ReleaseByteArrayElements(e, ba, buf, JNI_ABORT);
- if (ss == APR_SUCCESS)
- written += len;
- else
- break;
- }
-
- if (ss == APR_SUCCESS)
- return (jint)written;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
-
-TCN_IMPLEMENT_METHOD(jint, sendb)(TCN_IMPARGS,
- jobject buf, jint offset, jint len)
-{
- tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock;
- apr_size_t nbytes = (apr_size_t)len;
- char *bytes;
- apr_status_t ss;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- TCN_ASSERT(buf != NULL);
- bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
- ss = ssl_socket_send(s, bytes + offset, &nbytes);
-
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
-
-
-TCN_IMPLEMENT_METHOD(jint, recv)(TCN_IMPARGS,
- jbyteArray buf, jint offset,
- jint toread)
-{
- tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock;
- apr_size_t nbytes = (apr_size_t)toread;
- jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- apr_status_t ss;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- TCN_ASSERT(bytes != NULL);
- ss = ssl_socket_recv(s, bytes + offset, &nbytes);
-
- (*e)->ReleaseByteArrayElements(e, buf, bytes,
- nbytes ? 0 : JNI_ABORT);
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
-
-TCN_IMPLEMENT_METHOD(jint, recvt)(TCN_IMPARGS,
- jbyteArray buf, jint offset,
- jint toread, jlong timeout)
-{
- tcn_ssl_conn_t *s = (tcn_ssl_conn_t *)sock;
- apr_size_t nbytes = (apr_size_t)toread;
- jbyte *bytes = (*e)->GetByteArrayElements(e, buf, NULL);
- apr_status_t ss;
- apr_interval_time_t t;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- TCN_ASSERT(buf != NULL);
- TCN_ASSERT(bytes != NULL);
-
- if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
- goto cleanup;
- if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
- goto cleanup;
- ss = ssl_socket_recv(s, bytes + offset, &nbytes);
- /* Resore the original timeout */
- apr_socket_timeout_set(s->sock, t);
-cleanup:
- (*e)->ReleaseByteArrayElements(e, buf, bytes,
- nbytes ? 0 : JNI_ABORT);
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
-
-TCN_IMPLEMENT_METHOD(jint, recvb)(TCN_IMPARGS,
- jobject buf, jint offset, jint len)
-{
- tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
- apr_status_t ss;
- apr_size_t nbytes = (apr_size_t)len;
- char *bytes;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- TCN_ASSERT(buf != NULL);
- bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
- TCN_ASSERT(bytes != NULL);
- ss = ssl_socket_recv(s, bytes + offset, &nbytes);
-
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
+ apr_size_t rd = vec[i].iov_len;
+ if ((rv = ssl_socket_send(sock, vec[i].iov_base, &rd)) !=
APR_SUCCESS) {
+ *len = readed;
+ return rv;
+ }
+ readed += rd;
}
+ *len = readed;
+ return APR_SUCCESS;
}
-TCN_IMPLEMENT_METHOD(jint, recvbt)(TCN_IMPARGS,
- jobject buf, jint offset,
- jint len, jlong timeout)
-{
- tcn_ssl_conn_t *s = J2P(sock, tcn_ssl_conn_t *);
- apr_status_t ss;
- apr_size_t nbytes = (apr_size_t)len;
- char *bytes;
- apr_interval_time_t t;
-
- UNREFERENCED(o);
- TCN_ASSERT(sock != 0);
- TCN_ASSERT(buf != NULL);
- bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
- TCN_ASSERT(bytes != NULL);
-
- if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
- return -(jint)ss;
- if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
- return -(jint)ss;
- ss = ssl_socket_recv(s, bytes + offset, &nbytes);
- /* Resore the original timeout */
- apr_socket_timeout_set(s->sock, t);
-
- if (ss == APR_SUCCESS)
- return (jint)nbytes;
- else {
- TCN_ERROR_WRAP(ss);
- return -(jint)ss;
- }
-}
TCN_IMPLEMENT_CALL(jint, SSLSocket, attach)(TCN_STDARGS, jlong ctx,
jlong sock, jlong pool)
@@ -625,18 +445,14 @@
else
SSL_set_connect_state(con->ssl);
/* Change socket type */
- s->type = TCN_SOCKET_SSL;
- s->cleanup = TCN_GETNET_METHOD(cleanup);
- s->shutdown = TCN_GETNET_METHOD(shutdown);
- s->close = TCN_GETNET_METHOD(close);
- s->send = TCN_GETNET_METHOD(send);
- s->sendb = TCN_GETNET_METHOD(sendb);
- s->sendv = TCN_GETNET_METHOD(sendv);
- s->recv = TCN_GETNET_METHOD(recv);
- s->recvt = TCN_GETNET_METHOD(recvt);
- s->recvb = TCN_GETNET_METHOD(recvb);
- s->recvbt = TCN_GETNET_METHOD(recvbt);
- s->opaque = con;
+ s->type = TCN_SOCKET_SSL;
+ s->cleanup = ssl_cleanup;
+ s->net_recv = ssl_socket_recv;
+ s->net_send = ssl_socket_send;
+ s->net_sendv = ssl_socket_sendv;
+ s->net_shutdown = ssl_socket_shutdown;
+ s->net_close = ssl_socket_close;
+ s->opaque = con;
return APR_SUCCESS;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]