mturk 2005/06/23 01:58:05
Modified: jni/native/include tcn.h
jni/native/src info.c jnilib.c network.c sslnetwork.c
Log:
Add function wrappers for getting and setting the timeout.
Also catch the info classes to spped up it's prosessing.
Revision Changes Path
1.26 +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.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- tcn.h 18 Jun 2005 16:36:15 -0000 1.25
+++ tcn.h 23 Jun 2005 08:58:05 -0000 1.26
@@ -124,6 +124,8 @@
void *opaque;
int type;
apr_status_t (*cleanup)(void *);
+ apr_status_t (APR_THREAD_FUNC *tmset)(apr_socket_t *,
apr_interval_time_t);
+ apr_status_t (APR_THREAD_FUNC *tmget)(apr_socket_t *,
apr_interval_time_t *);
apr_status_t (APR_THREAD_FUNC *send) (apr_socket_t *, const char *,
apr_size_t *);
apr_status_t (APR_THREAD_FUNC *sendv)(apr_socket_t *, const struct iovec
*, apr_int32_t, apr_size_t *);
apr_status_t (APR_THREAD_FUNC *recv) (apr_socket_t *, char *, apr_size_t
*);
@@ -142,8 +144,8 @@
char *tcn_get_string(JNIEnv *, jstring);
char *tcn_strdup(JNIEnv *, jstring);
char *tcn_pstrdup(JNIEnv *, jstring, apr_pool_t *);
-apr_status_t tcn_load_finfo_class(JNIEnv *);
-apr_status_t tcn_load_ainfo_class(JNIEnv *);
+apr_status_t tcn_load_finfo_class(JNIEnv *, jclass);
+apr_status_t tcn_load_ainfo_class(JNIEnv *, jclass);
#define J2S(V) c##V
#define J2L(V) p##V
1.9 +65 -38 jakarta-tomcat-connectors/jni/native/src/info.c
Index: info.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/info.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- info.c 17 Jun 2005 09:41:30 -0000 1.8
+++ info.c 23 Jun 2005 08:58:05 -0000 1.9
@@ -121,17 +121,13 @@
static int finfo_class_initialized = 0;
static int ainfo_class_initialized = 0;
+static jmethodID finfo_class_init = NULL;
+static jmethodID ainfo_class_init = NULL;
+static jclass finfo_class = NULL;
+static jclass ainfo_class = NULL;
-apr_status_t tcn_load_finfo_class(JNIEnv *e)
+apr_status_t tcn_load_finfo_class(JNIEnv *e, jclass finfo)
{
- jclass finfo;
-
- finfo = (*e)->FindClass(e, TCN_FINFO_CLASS);
- if (finfo == NULL) {
- (*e)->ExceptionClear(e);
- return APR_EGENERAL;
- }
-
GET_FINFO_J(pool);
GET_FINFO_I(valid);
GET_FINFO_I(protection);
@@ -149,33 +145,33 @@
GET_FINFO_S(fname);
GET_FINFO_S(name);
GET_FINFO_J(filehand);
-
+
+ finfo_class_init = (*e)->GetMethodID(e, finfo,
+ "<init>", "()V");
+ if (finfo_class_init == NULL)
+ goto cleanup;
finfo_class_initialized = 1;
+ finfo_class = finfo;
cleanup:
- (*e)->DeleteLocalRef(e, finfo);
return APR_SUCCESS;
}
-apr_status_t tcn_load_ainfo_class(JNIEnv *e)
+apr_status_t tcn_load_ainfo_class(JNIEnv *e, jclass ainfo)
{
- jclass ainfo;
-
- ainfo = (*e)->FindClass(e, TCN_AINFO_CLASS);
- if (ainfo == NULL) {
- (*e)->ExceptionClear(e);
- return APR_EGENERAL;
- }
-
GET_AINFO_J(pool);
GET_AINFO_S(hostname);
GET_AINFO_S(servname);
GET_AINFO_I(port);
GET_AINFO_I(family);
GET_AINFO_J(next);
+ ainfo_class_init = (*e)->GetMethodID(e, ainfo,
+ "<init>", "()V");
+ if (ainfo_class_init == NULL)
+ goto cleanup;
ainfo_class_initialized = 1;
+ ainfo_class = ainfo;
cleanup:
- (*e)->DeleteLocalRef(e, ainfo);
return APR_SUCCESS;
}
@@ -233,6 +229,30 @@
return (jint)rv;
}
+TCN_IMPLEMENT_CALL(jobject, File, getStat)(TCN_STDARGS, jstring fname,
+ jint wanted, jlong pool)
+{
+ apr_pool_t *p = J2P(pool, apr_pool_t *);
+ TCN_ALLOC_CSTRING(fname);
+ apr_status_t rv;
+ apr_finfo_t info;
+ jobject finfo = NULL;
+
+ UNREFERENCED(o);
+
+ if ((rv = apr_stat(&info, J2S(fname), wanted, p)) == APR_SUCCESS) {
+ finfo = (*e)->NewObject(e, finfo_class, finfo_class_init);
+ if (finfo == NULL)
+ goto cleanup;
+ fill_finfo(e, finfo, &info);
+ }
+ else
+ tcn_ThrowAPRException(e, rv);
+cleanup:
+ TCN_FREE_CSTRING(fname);
+ return finfo;
+}
+
TCN_IMPLEMENT_CALL(jint, File, infoGet)(TCN_STDARGS, jobject finfo,
jint wanted, jlong file)
{
@@ -250,6 +270,27 @@
return (jint)rv;
}
+TCN_IMPLEMENT_CALL(jobject, File, getInfo)(TCN_STDARGS, jint wanted, jlong
file)
+{
+ apr_file_t *f = J2P(file, apr_file_t *);
+ apr_status_t rv;
+ apr_finfo_t info;
+
+ UNREFERENCED(o);
+
+ if ((rv = apr_file_info_get(&info, wanted, f)) == APR_SUCCESS) {
+ jobject finfo;
+ finfo = (*e)->NewObject(e, finfo_class, finfo_class_init);
+ if (finfo == NULL)
+ return NULL;
+ fill_finfo(e, finfo, &info);
+ return finfo;
+ }
+ else
+ tcn_ThrowAPRException(e, rv);
+ return NULL;
+}
+
TCN_IMPLEMENT_CALL(jint, Directory, read)(TCN_STDARGS, jobject finfo,
jint wanted, jlong dir)
{
@@ -297,28 +338,14 @@
TCN_IMPLEMENT_CALL(jobject, Address, getInfo)(TCN_STDARGS, jlong info)
{
apr_sockaddr_t *i = J2P(info, apr_sockaddr_t *);
- jclass aprSockaddrClass;
- jmethodID constructorID = 0;
jobject sockaddrObj = NULL;
UNREFERENCED(o);
- aprSockaddrClass = (*e)->FindClass(e, TCN_AINFO_CLASS);
- if (aprSockaddrClass == NULL)
- return NULL;
-
- /* Find the constructor ID */
- constructorID = (*e)->GetMethodID(e, aprSockaddrClass,
- "<init>", "()V");
- if (constructorID == NULL)
- goto cleanup;
/* Create the APR Error object */
- sockaddrObj = (*e)->NewObject(e, aprSockaddrClass, constructorID);
+ sockaddrObj = (*e)->NewObject(e, ainfo_class, ainfo_class_init);
if (sockaddrObj == NULL)
- goto cleanup;
+ return NULL;
fill_ainfo(e, sockaddrObj, i);
-cleanup:
- (*e)->DeleteLocalRef(e, aprSockaddrClass);
-
return sockaddrObj;
}
1.12 +9 -3 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.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- jnilib.c 17 Jun 2005 09:41:30 -0000 1.11
+++ jnilib.c 23 Jun 2005 08:58:05 -0000 1.12
@@ -37,6 +37,8 @@
static JavaVM *tcn_global_vm = NULL;
static jclass jString_class;
+static jclass jFinfo_class;
+static jclass jAinfo_class;
static jmethodID jString_init;
static jmethodID jString_getBytes;
@@ -53,15 +55,17 @@
/* Initialize global java.lang.String class */
TCN_LOAD_CLASS(env, jString_class, "java/lang/String", JNI_ERR);
+ TCN_LOAD_CLASS(env, jFinfo_class, TCN_FINFO_CLASS, JNI_ERR);
+ TCN_LOAD_CLASS(env, jAinfo_class, TCN_AINFO_CLASS, JNI_ERR);
TCN_GET_METHOD(env, jString_class, jString_init,
"<init>", "([B)V", JNI_ERR);
TCN_GET_METHOD(env, jString_class, jString_getBytes,
"getBytes", "()[B", JNI_ERR);
- if(tcn_load_finfo_class(env) != APR_SUCCESS)
+ if(tcn_load_finfo_class(env, jFinfo_class) != APR_SUCCESS)
return JNI_ERR;
- if(tcn_load_ainfo_class(env) != APR_SUCCESS)
+ if(tcn_load_ainfo_class(env, jAinfo_class) != APR_SUCCESS)
return JNI_ERR;
apr_initialize();
@@ -81,6 +85,8 @@
return;
}
TCN_UNLOAD_CLASS(env, jString_class);
+ TCN_UNLOAD_CLASS(env, jFinfo_class);
+ TCN_UNLOAD_CLASS(env, jAinfo_class);
apr_terminate();
}
1.38 +66 -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.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- network.c 18 Jun 2005 16:36:15 -0000 1.37
+++ network.c 23 Jun 2005 08:58:05 -0000 1.38
@@ -209,11 +209,25 @@
return apr_socket_shutdown(sock, how);
}
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t)
+{
+ return apr_socket_timeout_set(sock, t);
+}
+
+static APR_INLINE apr_status_t APR_THREAD_FUNC
+APR_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t)
+{
+ return apr_socket_timeout_get(sock, t);
+}
+
#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
+#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
+#define APR_socket_timeout_set apr_socket_timeout_set
+#define APR_socket_timeout_get apr_socket_timeout_get
#endif
TCN_IMPLEMENT_CALL(jlong, Socket, create)(TCN_STDARGS, jint family,
@@ -246,6 +260,8 @@
a->send = APR_socket_send;
a->sendv = APR_socket_sendv;
a->shutdown = APR_socket_shutdown;
+ a->tmget = APR_socket_timeout_get;
+ a->tmset = APR_socket_timeout_set;
a->close = NULL;
}
a->opaque = s;
@@ -295,7 +311,7 @@
return P2J(s->sock);
break;
case TCN_SOCKET_GET_TYPE:
- return P2J(s->type);
+ return (jlong)(s->type);
break;
}
return 0;
@@ -363,10 +379,15 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
-
- TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
+ if (s->type == TCN_SOCKET_APR) {
+ TCN_ASSERT(s->sock != NULL);
+ TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
+ }
+ else {
+ tcn_ThrowAPRException(e, APR_ENOTIMPL);
+ goto cleanup;
+ }
if (n) {
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_accepted);
@@ -379,6 +400,8 @@
a->send = APR_socket_send;
a->sendv = APR_socket_sendv;
a->shutdown = APR_socket_shutdown;
+ a->tmget = APR_socket_timeout_get;
+ a->tmset = APR_socket_timeout_set;
a->close = NULL;
a->opaque = n;
apr_pool_cleanup_register(p, (const void *)a,
@@ -399,11 +422,16 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p);
- TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
-
+ if (s->type == TCN_SOCKET_APR) {
+ TCN_ASSERT(s->sock != NULL);
+ TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
+ }
+ else {
+ tcn_ThrowAPRException(e, APR_ENOTIMPL);
+ goto cleanup;
+ }
if (n) {
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_accepted);
@@ -422,11 +450,11 @@
sp_socket_cleanup,
apr_pool_cleanup_null);
}
- else if (p)
- apr_pool_destroy(p);
-
-cleanup:
return P2J(a);
+cleanup:
+ if (p)
+ apr_pool_destroy(p);
+ return 0;
}
TCN_IMPLEMENT_CALL(jint, Socket, connect)(TCN_STDARGS, jlong sock,
@@ -649,12 +677,12 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
+ TCN_ASSERT(s->opaque != NULL);
TCN_ASSERT(buf != NULL);
- if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
+ if ((ss = (*s->tmget)(s->opaque, &t)) != APR_SUCCESS)
goto cleanup;
- if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
+ if ((ss = (*s->tmset)(s->opaque, J2T(timeout))) != APR_SUCCESS)
goto cleanup;
if (toread <= TCN_BUFFER_SZ) {
char sb[TCN_BUFFER_SZ];
@@ -668,7 +696,7 @@
nbytes ? 0 : JNI_ABORT);
}
/* Resore the original timeout */
- apr_socket_timeout_set(s->sock, t);
+ (*s->tmset)(s->opaque, t);
#ifdef TCN_DO_STATISTICS
if (ss == APR_SUCCESS) {
sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
@@ -761,13 +789,13 @@
bytes = (char *)(*e)->GetDirectBufferAddress(e, buf);
TCN_ASSERT(bytes != NULL);
- if ((ss = apr_socket_timeout_get(s->sock, &t)) != APR_SUCCESS)
+ if ((ss = (*s->tmget)(s->opaque, &t)) != APR_SUCCESS)
return -(jint)ss;
- if ((ss = apr_socket_timeout_set(s->sock, J2T(timeout))) != APR_SUCCESS)
+ if ((ss = (*s->tmset)(s->opaque, J2T(timeout))) != APR_SUCCESS)
return -(jint)ss;
ss = (*s->recv)(s->opaque, bytes + offset, &nbytes);
/* Resore the original timeout */
- apr_socket_timeout_set(s->sock, t);
+ (*s->tmset)(s->opaque, t);
#ifdef TCN_DO_STATISTICS
if (ss == APR_SUCCESS) {
sp_max_recv = TCN_MAX(sp_max_recv, nbytes);
@@ -830,20 +858,26 @@
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
- return (jint)apr_socket_opt_set(s->sock, (apr_int32_t)opt,
(apr_int32_t)on);
+ if (!s->sock)
+ return APR_EINVAL;
+ else
+ return (jint)apr_socket_opt_set(s->sock, (apr_int32_t)opt,
(apr_int32_t)on);
}
TCN_IMPLEMENT_CALL(jint, Socket, optGet)(TCN_STDARGS, jlong sock,
jint opt)
{
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
- apr_int32_t on;
+ apr_int32_t on = 0;
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
- TCN_THROW_IF_ERR(apr_socket_opt_get(s->sock, (apr_int32_t)opt,
- &on), on);
+ if (s->sock)
+ tcn_ThrowAPRException(e, APR_EINVAL);
+ else {
+ TCN_THROW_IF_ERR(apr_socket_opt_get(s->sock, (apr_int32_t)opt,
+ &on), on);
+ }
cleanup:
return (jint)on;
}
@@ -855,8 +889,8 @@
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
- return (jint)apr_socket_timeout_set(s->sock, J2T(timeout));
+ TCN_ASSERT(s->opaque != NULL);
+ return (jint)(*s->tmset)(s->opaque, J2T(timeout));
}
TCN_IMPLEMENT_CALL(jlong, Socket, timeoutGet)(TCN_STDARGS, jlong sock)
@@ -866,9 +900,8 @@
UNREFERENCED(o);
TCN_ASSERT(sock != 0);
- TCN_ASSERT(s->sock != NULL);
- TCN_THROW_IF_ERR(apr_socket_timeout_get(s->sock, &timeout), timeout);
-
+ TCN_ASSERT(s->opaque != NULL);
+ TCN_THROW_IF_ERR((*s->tmget)(s->sock, &timeout), timeout);
cleanup:
return (jlong)timeout;
}
1.18 +17 -1 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.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- sslnetwork.c 18 Jun 2005 14:03:09 -0000 1.17
+++ sslnetwork.c 23 Jun 2005 08:58:05 -0000 1.18
@@ -206,6 +206,20 @@
}
static apr_status_t APR_THREAD_FUNC
+ssl_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t)
+{
+ tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
+ return apr_socket_timeout_set(con->sock, t);
+}
+
+static apr_status_t APR_THREAD_FUNC
+ssl_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t)
+{
+ tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
+ return apr_socket_timeout_get(con->sock, t);
+}
+
+static apr_status_t APR_THREAD_FUNC
ssl_socket_shutdown(apr_socket_t *sock, apr_shutdown_how_e how)
{
apr_status_t rv = APR_SUCCESS;
@@ -453,6 +467,8 @@
s->send = ssl_socket_send;
s->sendv = ssl_socket_sendv;
s->shutdown = ssl_socket_shutdown;
+ s->tmget = ssl_socket_timeout_get;
+ s->tmset = ssl_socket_timeout_set;
s->close = ssl_socket_close;
s->opaque = con;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]