costin 02/04/25 12:24:17 Modified: jk/native2/jni jk_jni_aprImpl.c Log: Implement the jni side for the dispatch. Revision Changes Path 1.13 +319 -16 jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c Index: jk_jni_aprImpl.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/jni/jk_jni_aprImpl.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- jk_jni_aprImpl.c 18 Apr 2002 22:52:33 -0000 1.12 +++ jk_jni_aprImpl.c 25 Apr 2002 19:24:17 -0000 1.13 @@ -72,7 +72,6 @@ #include <stdio.h> #include <string.h> #include <signal.h> -#include <sys/socket.h> #include <sys/un.h> #include "org_apache_jk_apr_AprImpl.h" @@ -80,7 +79,6 @@ #include "jk_global.h" #include "jk_map.h" #include "jk_pool.h" -/* #include "jk_scoreboard.h" */ #include "apr_strings.h" #include "apr_portable.h" @@ -96,12 +94,55 @@ #include "apr_proc_mutex.h" +static apr_pool_t *jniAprPool; +static jk_workerEnv_t *workerEnv; + +/* -------------------- Apr initialization and pools -------------------- */ JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_initialize(JNIEnv *jniEnv, jobject _jthis) { - /* fprintf(stderr, "XXX AprInitialize\n"); */ + jk_env_t *env; + apr_initialize(); + apr_pool_create( &jniAprPool, NULL ); + + if( jk_env_globalEnv == NULL ) { + jk_pool_t *globalPool; + jk_bean_t *jkb; + + if( jniAprPool==NULL ) { + return 0; + } + jk2_pool_apr_create( NULL, &globalPool, NULL, jniAprPool ); + /* Create the global env */ + env=jk2_env_getEnv( NULL, globalPool ); + } + env=jk_env_globalEnv; + + workerEnv=env->getByName( env, "workerEnv" ); + if( workerEnv==NULL ) { + jk_bean_t *jkb; + + jkb=env->createBean2( env, env->globalPool, "logger.file", ""); + if( jkb==NULL ) { + fprintf(stderr, "Error creating logger "); + return JK_ERR; + } + + env->l=jkb->object;; + env->alias( env, "logger.file:", "logger"); + + jkb=env->createBean2( env, env->globalPool,"workerEnv", ""); + env->alias( env, "workerEnv:", "workerEnv"); + if( jkb==NULL ) { + fprintf(stderr, "Error creating workerEnv "); + return JK_ERR; + } + + workerEnv=jkb->object; + } + fprintf( stderr, "XXX aprImpl: %p %p\n", env, workerEnv); return 0; } @@ -134,6 +175,8 @@ return 0; } +/* -------------------- Signals -------------------- */ + static void jk2_SigAction(int signal) { } @@ -164,6 +207,8 @@ return 0; } +/* -------------------- User related functions -------------------- */ + JNIEXPORT jlong JNICALL Java_org_apache_jk_apr_AprImpl_userId(JNIEnv *jniEnv, jobject _jthis, jlong pool) { @@ -172,19 +217,6 @@ } -/* - SendPacket -*/ -JNIEXPORT jint JNICALL -Java_org_apache_jk_apr_AprImpl_sendPacket - (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong eP, jbyteArray data, - jint len) -{ - return (jint)jk2_channel_jni_javaSendPacket( jniEnv, o, xEnv, eP, - data, len); -} - - /* -------------------- Shared memory -------------------- */ /* Use it to access the scoreboard or for shmem channel */ @@ -272,6 +304,41 @@ return apr_shm_destroy(shm); } +JNIEXPORT jint JNICALL +Java_org_apache_jk_apr_AprImpl_shmGetInt(JNIEnv *jniEnv, jobject _jthis, + jlong poolJ, jlong mP ) +{ + apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ; + int *mem=(int *)(void *)(long)mP; + jbyte *nbuf; + int rd; + + /* XXX use atomic */ + return (jint)*mem; +} + +JNIEXPORT void JNICALL +Java_org_apache_jk_apr_AprImpl_shmSetInt(JNIEnv *jniEnv, jobject _jthis, + jlong poolJ, jlong mP, jint value ) +{ + apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ; + int *mem=(int *)(void *)(long)mP; + + /* XXX use atomic */ + *mem=(int)value; +} + +JNIEXPORT jint JNICALL +Java_org_apache_jk_apr_AprImpl_shmIncrement(JNIEnv *jniEnv, jobject _jthis, + jlong poolJ, jlong mP ) +{ + apr_pool_t *pool=(apr_pool_t *)(void *)(long)poolJ; + int *mem=(int *)(void *)(long)mP; + + /* XXX use atomic */ + *mem++; +} + JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_shmRead(JNIEnv *jniEnv, jobject _jthis, @@ -659,4 +726,240 @@ return 0; } +/* -------------------- Access jk components -------------------- */ + +/* + * Get a jk_env_t * from the pool + * + * XXX We should use per thread data or per jniEnv data ( the jniEnv and jk_env are + * serving the same purpose ) + */ +JNIEXPORT jlong JNICALL +Java_org_apache_jk_apr_AprImpl_getJkEnv + (JNIEnv *jniEnv, jobject o ) +{ + jk_env_t *env; + + if( jk_env_globalEnv == NULL ) + return 0; + + fprintf(stderr, "Get env %p\n", jk_env_globalEnv); + env=jk_env_globalEnv->getEnv( jk_env_globalEnv ); + if( env!=NULL) + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.getJkEnv() %p\n", env); + return (jlong)(long)(void *)env; +} + + +/* + Release the jk env +*/ +JNIEXPORT void JNICALL +Java_org_apache_jk_apr_AprImpl_releaseJkEnv + (JNIEnv *jniEnv, jobject o, jlong xEnv ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + + if( jk_env_globalEnv != NULL ) + jk_env_globalEnv->releaseEnv( jk_env_globalEnv, env ); + + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.releaseJkEnv() %p\n", env); +} + +/* + Recycle the jk env +*/ +JNIEXPORT void JNICALL +Java_org_apache_jk_apr_AprImpl_jkRecycle + (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong endpointP ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + jk_bean_t *compCtx=(jk_bean_t *)(void *)(long)endpointP; + jk_endpoint_t *ep = (compCtx==NULL ) ? NULL : compCtx->object; + + if( env == NULL ) + return; + + if( ep!=NULL ) { + ep->reply->reset( env, ep->reply ); + } + + env->recycleEnv( env ); + + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.releaseJkEnv() %p\n", env); +} + + + +/* + Find a jk component. +*/ +JNIEXPORT jlong JNICALL +Java_org_apache_jk_apr_AprImpl_getJkHandler + (JNIEnv *jniEnv, jobject o, jlong xEnv, jstring compNameJ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + jk_bean_t *component; + char *cname=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, compNameJ, 0); + + component=env->getBean( env, cname ); + + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.getJkHandler() %p %s\n", component, cname ); + + (*jniEnv)->ReleaseStringUTFChars(jniEnv, compNameJ, cname); + + return (jlong)(long)(void *)component; +} + +/* + Create a jk handler +*/ +JNIEXPORT jlong JNICALL +Java_org_apache_jk_apr_AprImpl_createJkHandler + (JNIEnv *jniEnv, jobject o, jlong xEnv, jstring compNameJ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + jk_bean_t *component; + char *cname=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, compNameJ, 0); + + component=env->createBean( env, NULL, cname ); + + (*jniEnv)->ReleaseStringUTFChars(jniEnv, compNameJ, cname); + + return (jlong)(long)(void *)component; +} + +/* +*/ +JNIEXPORT jint JNICALL +Java_org_apache_jk_apr_AprImpl_jkSetAttribute + (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP, jstring nameJ, jstring valueJ ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; + char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); + char *value=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, valueJ, 0); + int rc; + + if( component->setAttribute ==NULL ) + return JK_OK; + + rc=component->setAttribute( env, component, name, value ); + + (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); + (*jniEnv)->ReleaseStringUTFChars(jniEnv, valueJ, value); + + return rc; +} + +/* +*/ +JNIEXPORT jstring JNICALL +Java_org_apache_jk_apr_AprImpl_jkGetAttribute + (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP, jstring nameJ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; + char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); + char *value; + jstring valueJ=NULL; + int rc; + + if( component->setAttribute ==NULL ) + return JK_OK; + + value=component->getAttribute( env, component, name ); + if( value!=NULL ) + valueJ=(*jniEnv)->NewStringUTF(jniEnv, value); + + (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); + + return valueJ; +} + +/* +*/ +JNIEXPORT jint JNICALL +Java_org_apache_jk_apr_AprImpl_jkGetId + (JNIEnv *jniEnv, jobject o, jlong xEnv, jstring nsJ, jstring nameJ) +{ + jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; + char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); + char *value; + int rc=-1; + int i=0; + + env->l->jkLog(env, env->l, JK_LOG_INFO, + "aprImpl.getId() %d %s\n", rc, name ); + + (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); + + return rc; +} + + +/* +*/ +JNIEXPORT jint JNICALL +Java_org_apache_jk_apr_AprImpl_jkInvoke + (JNIEnv *jniEnv, jobject o, jlong envJ, jlong componentP, jlong endpointP, jint code, jbyteArray data, jint len) +{ + jk_env_t *env = (jk_env_t *)(void *)(long)envJ; + jk_bean_t *compCtx=(jk_bean_t *)(void *)(long)endpointP; + void *target=(void *)(long)componentP; + jk_endpoint_t *ep = compCtx->object; + + jbyte *nbuf; + jboolean iscommit; + + int cnt=0; + jint rc = -1; + unsigned acc = 0; + + /*env->l->jkLog(env, env->l, JK_LOG_INFO,"jkInvoke()\n"); */ + + nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, data, &iscommit); + + if(nbuf==NULL) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "jkInvoke() NullPointerException 2\n"); + return -1; + } + + /* Simulate a receive on the incoming packet. e->reply is what's + used when receiving data from java. + */ + ep->currentData = nbuf; + ep->currentOffset=0; + /* This was an workaround, no longer used ! */ + + ep->reply->reset(env, ep->reply); + + memcpy( ep->reply->buf, nbuf , len ); + + rc=ep->reply->checkHeader( env, ep->reply, ep ); + ep->reply->dump( env, ep->reply ,"MESSAGE"); + if( rc < 0 ) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "jkInvoke() invalid data\n"); + /* we just can't recover, unset recover flag */ + (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); + return JK_ERR; + } + + env->l->jkLog(env, env->l, JK_LOG_INFO, + "jkInvoke() component dispatch %d %d\n", rc, code); + + rc=workerEnv->dispatch( env, workerEnv, target, ep, code, ep->reply ); + + (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); + + env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() done\n"); + + return rc; +}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>