costin 02/04/25 11:48:13 Modified: jk/native2/common jk_channel_jni.c Log: Fix error handling. Remove duplicated code ( now all dispatching is done consistently in jni/ ). Revision Changes Path 1.10 +48 -160 jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c Index: jk_channel_jni.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- jk_channel_jni.c 15 Apr 2002 23:52:41 -0000 1.9 +++ jk_channel_jni.c 25 Apr 2002 18:48:13 -0000 1.10 @@ -104,14 +104,14 @@ jk_bean_t *mbean, char *name, void *value) { - return JK_TRUE; + return JK_OK; } static int JK_METHOD jk2_channel_jni_init(jk_env_t *env, jk_channel_t *_this) { - return JK_TRUE; + return JK_OK; } /** Assume the jni-worker or someone else started @@ -133,7 +133,7 @@ if( endpoint->channelData != NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() already open, nothing else to do\n"); - return JK_TRUE; + return JK_OK; } env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.init(): \n" ); @@ -142,14 +142,14 @@ if( jniCh->vm == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() no VM found\n" ); - return JK_FALSE; + return JK_ERR; } jniEnv = (JNIEnv *)jniCh->vm->attach( env, jniCh->vm ); if( jniEnv == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() can't attach\n" ); - return JK_FALSE; + return JK_ERR; } /* Create the buffers used by the write method. We allocate a byte[] and jbyte[] - I have no idea what's more expensive, @@ -174,7 +174,7 @@ if( jniCh->jniBridge == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() can't find %s\n",jniCh->className ); - return JK_FALSE; + return JK_ERR; } @@ -191,7 +191,7 @@ if( jmethod == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() can't find createJavaContext\n"); - return JK_FALSE; + return JK_ERR; } jstr=(*jniEnv)->NewStringUTF(jniEnv, "channelJni" ); @@ -199,13 +199,13 @@ jobj=(*jniEnv)->CallStaticObjectMethod( jniEnv, jniCh->jniBridge, jmethod, jstr, - (jlong)(long)(void *)endpoint ); + (jlong)(long)(void *)endpoint->mbean ); if( jobj == NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "channel_jni.open() Can't create java context\n" ); epData->jniJavaContext=NULL; - return JK_FALSE; + return JK_ERR; } epData->jniJavaContext=(*jniEnv)->NewGlobalRef( jniEnv, jobj ); @@ -220,7 +220,7 @@ if( jmethod == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.open() can't find getBuffer\n"); - return JK_FALSE; + return JK_ERR; } epData->jarray=(*jniEnv)->CallStaticObjectMethod( jniEnv, jniCh->jniBridge, @@ -244,7 +244,7 @@ if( jniCh->writeMethod == NULL ) { env->l->jkLog(env, env->l, JK_LOG_EMERG, "channel_jni.open() can't find jniInvoke\n"); - return JK_FALSE; + return JK_ERR; } env->l->jkLog(env, env->l, JK_LOG_INFO, @@ -255,7 +255,7 @@ * closing in order for this to work ) */ /* jniCh->vm->detach( env, jniCh->vm ); */ - return JK_TRUE; + return JK_OK; } @@ -271,7 +271,7 @@ /* (*jniEnv)->DeleteGlobalRef( jniEnv, epData->msgJ ); */ /* (*jniEnv)->DeleteGlobalRef( jniEnv, epData->jniJavaContext ); */ - return JK_TRUE; + return JK_OK; } @@ -313,7 +313,7 @@ if( epData->jniJavaContext == NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR,"channel_jni.send() no java context\n" ); - return JK_FALSE; + return JK_ERR; } msg->end( env, msg ); @@ -328,7 +328,7 @@ if( jniCh->writeMethod == NULL ) { env->l->jkLog(env, env->l, JK_LOG_EMERG, "channel_jni.send() no write method\n" ); - return JK_FALSE; + return JK_ERR; } if( jniEnv==NULL ) { /* Try first getEnv, then attach */ @@ -336,7 +336,7 @@ if( jniEnv == NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channel_jni.send() can't attach\n" ); - return JK_FALSE; + return JK_ERR; } } @@ -352,7 +352,7 @@ if(nbuf==NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "channelJni.send() Can't get java bytes"); - return JK_FALSE; + return JK_ERR; } if( len > jlen ) { @@ -375,7 +375,7 @@ epData->jniJavaContext ); env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.send() result %d\n", sent); - return JK_TRUE; + return JK_OK; } @@ -418,138 +418,6 @@ */ } -/* Process a message from java. We return in all cases, - with the response message if any. -*/ -static int jk2_channel_jni_processMsg(jk_env_t *env, jk_endpoint_t *e, - jk_ws_service_t *r) -{ -// int code; - jk_handler_t *handler; - int rc; - jk_handler_t **handlerTable=e->worker->workerEnv->handlerTable; - int maxHandler=e->worker->workerEnv->lastMessageId; - - rc=-1; - handler=NULL; - - env->l->jkLog(env, env->l, JK_LOG_INFO, - "channelJniNative.processMsg()\n"); - - /* e->reply->dump(env, e->reply, "Received "); */ - - rc = e->worker->workerEnv->dispatch( env, e->worker->workerEnv, e, r ); - - /* Process the status code returned by handler */ - switch( rc ) { - case JK_HANDLER_RESPONSE: - e->recoverable = JK_FALSE; - /* XXX response must be put back into the buffer - rc = e->post->send(env, e->post, e ); */ - if (rc < 0) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "jni.processCallbacks() error sending response data\n"); - return JK_FALSE; - } - return JK_TRUE; - case JK_HANDLER_ERROR: - /* - * we won't be able to gracefully recover from this so - * set recoverable to false and get out. - */ - e->recoverable = JK_FALSE; - return JK_FALSE; - case JK_HANDLER_FATAL: - /* - * Client has stop talking to us, so get out. - * We assume this isn't our fault, so just a normal exit. - * In most (all?) cases, the ajp13_endpoint::reuse will still be - * false here, so this will be functionally the same as an - * un-recoverable error. We just won't log it as such. - */ - return JK_FALSE; - default: - /* All other cases */ - return JK_TRUE; - } - - /* not reached */ - return JK_FALSE; -} - - -/* - Called from Java - the 2 pointers are exactly what we passed when we constructed - the endpoint and for the request. - */ -int jk2_channel_jni_javaSendPacket(JNIEnv *jniEnv, jobject o, - jlong envJ, jlong eP, - jbyteArray data, jint dataLen) -{ - /* [V] Convert indirectly from jlong -> int -> pointer to shut up gcc */ - /* I hope it's okay on other compilers and/or machines... */ - jk_env_t *env = (jk_env_t *)(long)envJ; - jk_endpoint_t *e = (jk_endpoint_t *)(long)eP; - jk_ws_service_t *ps = e->currentRequest; - - int cnt=0; - jint rc = -1; - jboolean iscommit; - jbyte *nbuf; - unsigned acc = 0; - int msgLen=(int)dataLen; - - env->l->jkLog(env, env->l, JK_LOG_INFO, - "channelJniNative.sendPacket()\n"); - - if(!ps) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "channelJniNative.sendPacket() NullPointerException\n"); - return -1; - } - - nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, data, &iscommit); - - if(nbuf==NULL) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "channelJniNative.sendPacket() NullPointerException 2\n"); - return -1; - } - - /* Simulate a receive on the incoming packet. e->reply is what's - used when receiving data from java. This method is JAVA.sendPacket() - and corresponds to CHANNELJNI.receive */ - e->currentData = nbuf; - e->currentOffset=0; - /* This was an workaround, no longer used ! */ - - e->reply->reset(env, e->reply); - - memcpy( e->reply->buf, nbuf , msgLen ); - - rc=e->reply->checkHeader( env, e->reply, e ); - if( rc < 0 ) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "ajp14.service() Error reading reply\n"); - /* we just can't recover, unset recover flag */ - return JK_FALSE; - } - - /* XXX check if the len in header matches our len */ - - /* Now execute it */ - jk2_channel_jni_processMsg( env, e, ps ); - - (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); - - env->l->jkLog(env, env->l, JK_LOG_INFO, - "channelJniNative.sendPacket() done\n"); - - return (jint)cnt; -} - - - /** Called before request processing, to initialize resources. All following calls will be in the same thread. @@ -572,19 +440,19 @@ /* Try to attach */ if( we->vm == NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "No VM to use\n"); - return JK_FALSE; + return JK_ERR; } jniEnv = we->vm->attach(env, we->vm); if(jniEnv == NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "Attach failed\n"); /* Is it recoverable ?? - yes, don't change the previous value*/ - /* r->is_recoverable_error = JK_TRUE; */ - return JK_FALSE; + /* r->is_recoverable_error = JK_OK; */ + return JK_ERR; } endpoint->endpoint_private = jniEnv; } - return JK_TRUE; + return JK_OK; } /** Called after request processing. Used to be worker.done() @@ -603,16 +471,30 @@ env->l->jkLog(env, env->l, JK_LOG_INFO, "channelJni.afterRequest() ok\n"); - return JK_TRUE; + return JK_OK; } - +/** Called by java. Will take the rest of the message and dispatch again to the real target. + */ +static int jk2_channel_jni_dispatch(jk_env_t *env, void *target, jk_endpoint_t *ep, jk_msg_t *msg) +{ + jk_bean_t *jniChB=(jk_bean_t *)target; + jk_channel_t *jniCh=(jk_channel_t *)jniChB->object; + int code; + + env->l->jkLog(env, env->l, JK_LOG_INFO,"channelJni.java2cInvoke() ok\n"); + + code = (int)msg->getByte(env, msg); + return ep->worker->workerEnv->dispatch( env, ep->worker->workerEnv, + ep->currentRequest, ep, code, ep->reply ); +} int JK_METHOD jk2_channel_jni_factory(jk_env_t *env, jk_pool_t *pool, jk_bean_t *result, const char *type, const char *name) { jk_channel_t *ch=result->object; + jk_workerEnv_t *wEnv; ch=(jk_channel_t *)pool->calloc(env, pool, sizeof( jk_channel_t)); @@ -628,13 +510,19 @@ ch->_privatePtr=(jk_channel_jni_private_t *)pool->calloc(env, pool, sizeof(jk_channel_jni_private_t)); ch->is_stream=JK_FALSE; - + result->setAttribute= jk2_channel_jni_setProperty; ch->mbean=result; result->object= ch; - ch->workerEnv=env->getByName( env, "workerEnv" ); - ch->workerEnv->addChannel( env, ch->workerEnv, ch ); + wEnv=env->getByName( env, "workerEnv" ); + ch->workerEnv=wEnv; + wEnv->addChannel( env, wEnv, ch ); - return JK_TRUE; + wEnv->registerHandler( env, wEnv, type, + "sendResponse", JK_HANDLE_JNI_DISPATCH, + jk2_channel_jni_dispatch, NULL ); + + + return JK_OK; }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>