costin      02/05/15 12:40:44

  Modified:    jk/native2/common jk_workerEnv.c
  Log:
  Add the timing option.
  
  Add a CS to support concurent operation ( non-critical since this is not
  per request ).
  
  addEndpoint - will assign an index to the endpoint. We also assign an
  index to channels and workers, based on the position in the worker/channel
  tables.
  
  Revision  Changes    Path
  1.42      +85 -23    jakarta-tomcat-connectors/jk/native2/common/jk_workerEnv.c
  
  Index: jk_workerEnv.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_workerEnv.c,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- jk_workerEnv.c    14 May 2002 20:40:22 -0000      1.41
  +++ jk_workerEnv.c    15 May 2002 19:40:44 -0000      1.42
  @@ -59,7 +59,7 @@
    * Description: Workers controller                                         *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
    * Author:      Henri Gomez <[EMAIL PROTECTED]>                               *
  - * Version:     $Revision: 1.41 $                                           *
  + * Version:     $Revision: 1.42 $                                           *
    ***************************************************************************/
   
   #include "jk_env.h"
  @@ -89,6 +89,8 @@
        */
       if( strcmp( name, "sslEnable" )==0 ) {
           wEnv->ssl_enable = JK_TRUE;
  +    } else if( strcmp( name, "timing" )==0 ) {
  +        wEnv->timing= atoi( value );
       } else if( strcmp( name, "httpsIndicator" )==0 ) {
           wEnv->https_indicator = value;
       } else if( strcmp( name, "certsIndicator" )==0 ) {
  @@ -297,6 +299,31 @@
       return JK_OK;
   }
   
  +static int jk2_workerEnv_parentInit(jk_env_t *env, jk_workerEnv_t *wEnv)
  +{
  +    char *configFile;
  +    
  +    env->l->init( env, env->l );
  +
  +    configFile=wEnv->config->file;
  +    if(  configFile == NULL ) {
  +        wEnv->config->setPropertyString( env, wEnv->config,
  +                                         "config.file",
  +                                         "${serverRoot}/conf/workers2.properties" );
  +        configFile=wEnv->config->file;
  +    }
  +    
  +    if( wEnv->shm != NULL && ! wEnv->shm->mbean->disabled ) {
  +        wEnv->shm->init( env, wEnv->shm );
  +    }
  +    
  +    if( wEnv->shm != NULL && wEnv->shm->head != NULL ) {
  +        wEnv->shm->reset( env, wEnv->shm);
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "workerEnv.init() Reset shm\n" );
  +    }
  +}
  +
  +
   static int jk2_workerEnv_init(jk_env_t *env, jk_workerEnv_t *wEnv)
   {
       int err;
  @@ -322,7 +349,7 @@
           if( w==NULL ) {
               jk_bean_t *jkb=env->createBean2(env, wEnv->pool, "worker.lb", "lb" );
               w=jkb->object;
  -            if( wEnv->debug > 0 )
  +            if( wEnv->mbean->debug > 0 )
                   env->l->jkLog(env, env->l, JK_LOG_ERROR, "workerEnv.init() create 
default worker %s\n",  jkb->name );
           }
           wEnv->defaultWorker= w;
  @@ -432,14 +459,15 @@
           if( rc!=JK_OK ) {
               env->l->jkLog(env, env->l, JK_LOG_ERROR,
                             "workerEnv.processCallbacks() Error reading reply\n");
  -            /* We can recover */
  -            return JK_ERR;
  +            /* Probably protocol error, we can't recover
  +             */
  +            ep->recoverable=JK_FALSE;
  +            return rc;
           }
   
           if( ep->worker->mbean->debug > 10 )
               ep->request->dump( env, msg, "Received" );
   
  -        /*  ep->reply->dump(env, ep->reply, "Received ");   */
           code = (int)msg->getByte(env, msg);
           rc=jk2_workerEnv_dispatch( env, wEnv, req, ep, code, msg );
   
  @@ -461,7 +489,7 @@
                * A possible work-around could be to store the uploaded
                * data to file and replay for it
                */
  -            ep->recoverable = JK_FALSE;
  +            req->is_recoverable_error = JK_FALSE;
               if( ep->worker->mbean->debug > 10 )
                   ep->request->dump( env, ep->post, "Apache->tomcat" );
   
  @@ -469,28 +497,27 @@
               if (rc < 0) {
                   env->l->jkLog(env, env->l, JK_LOG_ERROR,
                                 "ajp14.processCallbacks() error sending response 
data\n");
  -                return JK_ERR;
  +                ep->recoverable = JK_FALSE;
  +                return rc;
               }
               break;
           case JK_HANDLER_ERROR:
  -            /*
  -             * we won't be able to gracefully recover from this so
  -             * set recoverable to false and get out.
  +            /* Normal error ( for example writing to the client failed ).
  +             * The ajp connection is still in a stable state.
                */
  -            ep->recoverable = JK_FALSE;
  -            return JK_ERR;
  +            return rc;
           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.
  +             * Protocol error. We'll disconnect the ajp connection and reconnect.
                */
  -            return JK_ERR;
  +            ep->recoverable = JK_FALSE; 
  +            return rc;
           default:
               /* Unknown status */
  -            break;
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "ajp14.processCallbacks() unknonwn status %d\n", rc);
  +            ep->recoverable = JK_FALSE; 
  +            return rc;
           }
       }
       return JK_ERR;
  @@ -509,16 +536,21 @@
   {
       int err=JK_OK;
       jk_bean_t *jkb;
  +    int csOk;
  +    
  +    JK_ENTER_CS(&wEnv->cs, csOk);
  +    if( !csOk ) return JK_ERR;
   
  -    wEnv->channel_map->put(env, wEnv->channel_map, ch->mbean->name, ch, NULL);
  +    ch->id=wEnv->channel_map->size( env, wEnv->channel_map );
  +    wEnv->channel_map->add(env, wEnv->channel_map, ch->mbean->name, ch);
   
       /* Automatically create the ajp13 worker to be used with this channel.
        */
  -        
       jkb=env->createBean2(env, ch->mbean->pool, "ajp13", ch->mbean->localName );
       if( jkb == NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
                         "workerEnv.addChannel(): Can't find ajp13 worker\n" );
  +        JK_LEAVE_CS( &wEnv->cs, csOk );
           return JK_ERR;
       }
       ch->worker=jkb->object;
  @@ -526,19 +558,45 @@
       ch->worker->channel=ch;
               
       /* XXX Set additional parameters - use defaults otherwise */
  +    JK_LEAVE_CS( &wEnv->cs, csOk );
   
       return JK_OK;
   }
   
  +static int jk2_workerEnv_addEndpoint(jk_env_t *env, jk_workerEnv_t *wEnv, 
jk_endpoint_t *ep)
  +{
  +    int csOk;
  +    
  +    JK_ENTER_CS(&wEnv->cs, csOk);
  +    if( !csOk ) return JK_ERR;
  +
  +    {
  +        int pos=wEnv->endpointMap->size( env, wEnv->endpointMap );
  +        
  +        wEnv->endpointMap->add( env, wEnv->endpointMap, ep->mbean->localName, ep );
  +        ep->id=pos;
  +
  +        ep->mbean->init( env, ep->mbean );
  +    }
  +    JK_LEAVE_CS( &wEnv->cs, csOk );
  +    return JK_OK;
  +}
  +
   
   static int jk2_workerEnv_addWorker(jk_env_t *env, jk_workerEnv_t *wEnv,
                                      jk_worker_t *w) 
   {
       int err=JK_OK;
       jk_worker_t *oldW = NULL;
  +    int csOk;
  +    
  +    JK_ENTER_CS(&wEnv->cs, csOk);
  +    if( !csOk ) return JK_ERR;
   
       w->workerEnv=wEnv;
   
  +    w->id=wEnv->worker_map->size( env, wEnv->worker_map );
  +
       w->rPoolCache= jk2_objCache_create( env, w->mbean->pool  );
   
       err=w->rPoolCache->init( env, w->rPoolCache,
  @@ -554,6 +612,7 @@
               oldW->mbean->destroy(env, oldW->mbean);
       }
       
  +    JK_LEAVE_CS( &wEnv->cs, csOk );
       return JK_OK;
   }
   
  @@ -599,6 +658,7 @@
       int err;
       jk_pool_t *uriMapPool;
       jk_bean_t *jkb;
  +    int csOk;
   
       wEnv=(jk_workerEnv_t *)pool->calloc( env, pool, sizeof( jk_workerEnv_t ));
   
  @@ -629,7 +689,6 @@
   
       wEnv->log_file        = NULL;
       wEnv->log_level       = -1;
  -    wEnv->mountcopy       = JK_FALSE;
       wEnv->was_initialized = JK_FALSE;
       wEnv->options         = JK_OPT_FWDURIDEFAULT;
   
  @@ -667,21 +726,23 @@
       /*     } */
   
       wEnv->uriMap = NULL;
  -    wEnv->secret_key = NULL; 
   
       wEnv->envvars_in_use = JK_FALSE;
       jk2_map_default_create(env, &wEnv->envvars, pool);
   
       jk2_map_default_create(env,&wEnv->worker_map, wEnv->pool);
       jk2_map_default_create(env,&wEnv->channel_map, wEnv->pool);
  +    jk2_map_default_create(env, & wEnv->endpointMap, wEnv->pool);
   
       wEnv->perThreadWorker=0;
       
       /* methods */
       wEnv->init=&jk2_workerEnv_init;
  +    wEnv->parentInit=&jk2_workerEnv_parentInit;
       wEnv->close=&jk2_workerEnv_close;
       wEnv->addWorker=&jk2_workerEnv_addWorker;
       wEnv->addChannel=&jk2_workerEnv_addChannel;
  +    wEnv->addEndpoint=&jk2_workerEnv_addEndpoint;
       wEnv->initChannel=&jk2_workerEnv_initChannel;
       wEnv->registerHandler=&jk2_workerEnv_registerHandler;
       wEnv->processCallbacks=&jk2_workerEnv_processCallbacks;
  @@ -720,6 +781,7 @@
           wEnv->shm=(jk_shm_t *)jkb->object;
           wEnv->shm->setWorkerEnv( env, wEnv->shm, wEnv );
       }
  +    JK_INIT_CS(&(wEnv->cs), csOk);
       
       return JK_OK;
   }
  
  
  

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

Reply via email to