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]