costin      02/04/12 22:34:21

  Modified:    jk/native2/common jk_worker_jni.c
  Log:
  Got it to use plain main() and a much simpler and intuitive syntax ( I hope ).
  At least it's using standard java options instead of invented jk option names
  
  Both Tomcat3.3 and 4.0 are starting fine - and seem to find all the native
  libs they need ( if LD_LIBRARY_PATH is set ). There is one more problem
  with setting up the ChannelJni ( and detecting and failing back gracefully ).
  
  Then the big problem will be getting shm to work and dealing with the
  real difficult reconfiguration of workers when a new apache process
  is started ( sort of a dynamic pool of workers - with apache monitoring
  and managing creation of workers ). That may not happen completely
  for this release ( except maybe on windows or if a single process is used ).
  
  Revision  Changes    Path
  1.8       +58 -70    jakarta-tomcat-connectors/jk/native2/common/jk_worker_jni.c
  
  Index: jk_worker_jni.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_jni.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- jk_worker_jni.c   12 Apr 2002 23:15:48 -0000      1.7
  +++ jk_worker_jni.c   13 Apr 2002 05:34:21 -0000      1.8
  @@ -69,18 +69,14 @@
   #include "jni.h"
   
   /* default only, will be  configurable  */
  -#define JAVA_BRIDGE_CLASS_NAME ("org/apache/jk/server/JniMain")
  +#define JAVA_BRIDGE_CLASS_NAME ("org/apache/jk/server/JkMain")
   
   struct jni_worker_data {
  -
       jclass      jk_java_bridge_class;
  -    jmethodID   jk_startup_method;
  -    jmethodID   jk_shutdown_method;
  -
  +    jmethodID   jk_main_method;
       char *className;
  -    char *tomcat_cmd_line;
  -    char *stdout_name;
  -    char *stderr_name;
  +    char **args;
  +    int nArgs;
   };
   
   typedef struct jni_worker_data jni_worker_data_t;
  @@ -92,26 +88,17 @@
    */
   static int jk2_get_method_ids(jk_env_t *env, jni_worker_data_t *p, JNIEnv *jniEnv )
   {
  -
  -    p->jk_startup_method =
  +    p->jk_main_method =
           (*jniEnv)->GetStaticMethodID(jniEnv, p->jk_java_bridge_class,
  -                                     "startup", 
  -               "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");
  +                                     "main", 
  +                                     "([Ljava/lang/String;)V");
  +
       
  -    if(!p->jk_startup_method) {
  -     env->l->jkLog(env, env->l, JK_LOG_EMERG, "Can't find startup()\n"); 
  +    if(!p->jk_main_method) {
  +     env->l->jkLog(env, env->l, JK_LOG_EMERG, "Can't find main()\n"); 
        return JK_FALSE;
       }
   
  -    p->jk_shutdown_method = (*jniEnv)->GetStaticMethodID(jniEnv,
  -                                                   p->jk_java_bridge_class, 
  -                                                   "shutdown", 
  -                                                   "()V");   
  -    if(!p->jk_shutdown_method) {
  -     env->l->jkLog(env, env->l, JK_LOG_EMERG, "Can't find shutdown()\n"); 
  -        return JK_FALSE;
  -    }    
  -    
       return JK_TRUE;
   }
   
  @@ -143,12 +130,9 @@
   
       if( strcmp( name, "class" )==0 ) {
           jniWorker->className = value;
  -    } else if( strcmp( name, "cmd_line" )==0 ) {
  -        jniWorker->tomcat_cmd_line = value;
  -    } else if( strcmp( name, "stdout" )==0 ) {
  -        jniWorker->stdout_name=value;
  -    } else if( strcmp( name, "stderr" )==0 ) {
  -        jniWorker->stderr_name=value;
  +    } else if( strcmp( name, "ARG" )==0 ) {
  +        jniWorker->args[jniWorker->nArgs]=value;
  +        jniWorker->nArgs++;
       } else {
           return JK_FALSE;
       }
  @@ -168,6 +152,9 @@
       jk_map_t *props=_this->workerEnv->initData;
       jk_bean_t *chB;
       jk_vm_t *vm=_this->workerEnv->vm;
  +    jclass jstringClass;
  +    jarray jargs;
  +    int i=0;
       
       if(! _this || ! _this->worker_private) {
           env->l->jkLog(env, env->l, JK_LOG_EMERG,
  @@ -187,17 +174,14 @@
           jniWorker->className=JAVA_BRIDGE_CLASS_NAME;
       
       env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "jni.validate() cmd: %s %s %s %s\n",
  -                  jniWorker->className, jniWorker->tomcat_cmd_line,
  -                  jniWorker->stdout_name, jniWorker->stderr_name);
  -    
  +                  "jni.validate() class= %s \n",
  +                  jniWorker->className);
   
       jniEnv = (JNIEnv *)vm->attach( env, vm );
   
       if( jniEnv==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
                         "workerJni.init() Can't attach to VM\n");
  -        
           return JK_FALSE;
       }
       
  @@ -212,7 +196,7 @@
           return JK_FALSE;
       }
       
  -    env->l->jkLog(env, env->l, JK_LOG_EMERG,
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,
                     "Loaded %s\n", jniWorker->className);
   
       rc=jk2_get_method_ids(env, jniWorker, jniEnv);
  @@ -224,27 +208,27 @@
           return JK_FALSE;
       }
   
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "jni.init()\n");
  +    jstringClass=(*jniEnv)->FindClass(jniEnv, "java/lang/String" );
   
  -    if(jniWorker->tomcat_cmd_line) {
  -        cmd_line = (*jniEnv)->NewStringUTF(jniEnv, jniWorker->tomcat_cmd_line);
  -    }
  -    if(jniWorker->stdout_name) {
  -        stdout_name = (*jniEnv)->NewStringUTF(jniEnv, jniWorker->stdout_name);
  -    }
  -    if(jniWorker->stdout_name) {
  -        stderr_name = (*jniEnv)->NewStringUTF(jniEnv, jniWorker->stderr_name);
  +    jargs=(*jniEnv)->NewObjectArray(jniEnv, jniWorker->nArgs, jstringClass, NULL);
  +
  +    for( i=0; i<jniWorker->nArgs; i++ ) {
  +        jstring arg=NULL;
  +        if( jniWorker->args[i] != NULL ) {
  +            arg=(*jniEnv)->NewStringUTF(jniEnv, jniWorker->args[i] );
  +            env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                          "jni.init() ARG %s\n", jniWorker->args[i]);
  +        }
  +        (*jniEnv)->SetObjectArrayElement(jniEnv, jargs, i, arg );        
       }
       
       env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "jni.init() calling Tomcat to intialize itself...\n");
  +                  "jni.init() calling main()...\n");
       
  -    rc = (*jniEnv)->CallStaticIntMethod(jniEnv,
  -                                        jniWorker->jk_java_bridge_class,
  -                                        jniWorker->jk_startup_method,
  -                                        cmd_line,
  -                                        stdout_name,
  -                                        stderr_name);
  +    (*jniEnv)->CallStaticVoidMethod(jniEnv,
  +                                    jniWorker->jk_java_bridge_class,
  +                                    jniWorker->jk_main_method,
  +                                    jargs);
       
       vm->detach(env, vm);
       return JK_TRUE;
  @@ -264,20 +248,27 @@
   
       jniWorker = _this->worker_private;
   
  -    if(! jniWorker->jk_shutdown_method) {
  -        env->l->jkLog(env, env->l, JK_LOG_EMERG,
  -                      "In destroy, Tomcat not intantiated\n");
  -        return JK_FALSE;
  -    }
  -
  -    if((jniEnv = vm->attach(env, vm))) {
  -        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                      "jni.destroy(), shutting down Tomcat...\n");
  -        (*jniEnv)->CallStaticVoidMethod(jniEnv,
  -                                  jniWorker->jk_java_bridge_class,
  -                                  jniWorker->jk_shutdown_method);
  -        vm->detach(env, vm);
  -    }
  +    /* A MUCH better solution is to use the standard JDK1.3 mechanism.
  +       Or Ajp13 shutdown.
  +       I'll implement JDK1.3 after I check if I do need to do anything
  +       on the C side ( i.e. call System.exit() explicitely - I have a feeling
  +       the smart VM guys have added a hook to at_exit ). 
  +    */
  +    
  +/*     if(! jniWorker->jk_shutdown_method) { */
  +/*         env->l->jkLog(env, env->l, JK_LOG_EMERG, */
  +/*                       "In destroy, Tomcat not intantiated\n"); */
  +/*         return JK_FALSE; */
  +/*     } */
  +
  +/*     if((jniEnv = vm->attach(env, vm))) { */
  +/*         env->l->jkLog(env, env->l, JK_LOG_INFO,  */
  +/*                       "jni.destroy(), shutting down Tomcat...\n"); */
  +/*         (*jniEnv)->CallStaticVoidMethod(jniEnv, */
  +/*                                   jniWorker->jk_java_bridge_class, */
  +/*                                   jniWorker->jk_shutdown_method); */
  +/*         vm->detach(env, vm); */
  +/*     } */
   
       _this->pool->close(env, _this->pool);
   
  @@ -318,12 +309,9 @@
       _this->pool=pool;
   
       jniData->jk_java_bridge_class  = NULL;
  -    jniData->jk_startup_method     = NULL;
  -    jniData->jk_shutdown_method    = NULL;
   
  -    jniData->tomcat_cmd_line       = NULL;
  -    jniData->stdout_name           = NULL;
  -    jniData->stderr_name           = NULL;
  +    jniData->args = pool->calloc( env, pool, 64 * sizeof( char *));
  +    jniData->nArgs =0;
   
       _this->init           = jk2_jni_worker_init;
       _this->destroy        = jk2_jni_worker_destroy;
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to