costin 2003/03/04 15:58:30 Modified: jk/native2/common jk_config.c Log: Move the recently added code to mirror what happens on the java side ( i.e. all mbeans are configured, then init is called on new ones ). Now adding channels at runtime works fine - it was broken. Revision Changes Path 1.31 +69 -37 jakarta-tomcat-connectors/jk/native2/common/jk_config.c Index: jk_config.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_config.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- jk_config.c 4 Mar 2003 07:14:40 -0000 1.30 +++ jk_config.c 4 Mar 2003 23:58:30 -0000 1.31 @@ -394,23 +394,76 @@ { int i; int rc; - + + /* Set the config + */ for( i=0; i<cfg->cfgData->size( env, cfg->cfgData ); i++ ) { char *name=cfg->cfgData->nameAt(env, cfg->cfgData, i); rc=cfg->processNode(env, cfg , name, firstTime); } + + /* Init/stop components that need that. FirstTime will be handled by workerEnv, since + some components don't support dynamic config and need a specific order. + */ + if( !firstTime ) { + for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) { + char *name=env->_objects->nameAt( env, env->_objects, i ); + jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i ); + + if( mbean==NULL ) continue; + + /* New state ( == not initialized ) and disabled==0, + try to reinit */ + if( mbean->state == JK_STATE_NEW && + mbean->disabled== 0 ) { + int initOk=JK_OK; + + if( mbean->init != NULL ) { + initOk=mbean->init(env, mbean); + env->l->jkLog(env, env->l, JK_LOG_INFO, + "config.update(): Starting %s %d\n", name, initOk ); + } + if( initOk==JK_OK ) { + mbean->state=JK_STATE_INIT; + } + } + + /* Initialized state - and the config changed to disabled */ + if( mbean->state == JK_STATE_INIT && + mbean->disabled != 0 ) { + int initOk=JK_OK; + + /* Stop */ + if( mbean->destroy ) { + initOk=mbean->destroy(env, mbean); + env->l->jkLog(env, env->l, JK_LOG_INFO, + "config.update(): Stopping %s %d\n", name, initOk ); + } + if( initOk ) { + mbean->state=JK_STATE_NEW; + } + } + } + } return rc; } +/** This method will process one mbean configuration or reconfiguration. + The special case for firstTime will be eventually removed - it is needed because some + components may still depend on a specific startup order. + + The goal is for each component to follow JMX patterns - you should be able to add / remove + jk components at runtime in any order. +*/ int jk2_config_processNode(jk_env_t *env, jk_config_t *cfg, char *name, int firstTime ) { int j; jk_map_t *prefNode=cfg->cfgData->get(env, cfg->cfgData, name); jk_bean_t *bean; - long ver; + long ver=0; char *verString; - int oldDisabled=0; + int newBean=0; if( cfg->mbean->debug > 5 ) env->l->jkLog(env, env->l, JK_LOG_DEBUG, @@ -423,6 +476,7 @@ "config.setConfig(): Creating %s\n", name ); } bean=env->createBean( env, cfg->pool, name ); + newBean=1; } if( bean == NULL ) { @@ -432,28 +486,29 @@ return JK_ERR; } - oldDisabled=bean->disabled; - + /* Don't call setters on objects that have the same ver. + This is just a workaround for components that are not reconfigurable. + */ verString= prefNode->get( env, prefNode, "ver" ); if( !firstTime ) { /* No ver option - assume it didn't change */ - if( verString == NULL ) { + if( verString == NULL && ! newBean ) { return JK_OK; } - ver=atol( verString ); + if( verString != NULL ) { + ver=atol( verString ); - if( ver == bean->ver) { - /* Object didn't change - */ - return JK_OK; + if( ver == bean->ver && ! newBean ) { + /* Object didn't change and is not new + */ + return JK_OK; + } } } if( !firstTime ) env->l->jkLog(env, env->l, JK_LOG_INFO, - "config.update(): Updating %s %ld %ld %d\n", name, ver, bean->ver, getpid() ); - - /* XXX Maybe we shoud destroy/init ? */ + "config.update(): Updating %s in %d\n", name, getpid() ); for( j=0; j<prefNode->size( env, prefNode ); j++ ) { char *pname=prefNode->nameAt(env, prefNode, j); @@ -464,29 +519,6 @@ env->l->jkLog(env, env->l, JK_LOG_INFO, "config.update(): done %s\n", name ); - - if( !firstTime ) { - /* Deal with lifecycle - if a mbean has been enabled or disabled */ - if( oldDisabled != bean->disabled ) { - /* State change ... */ - if( bean->disabled==0 ) { - /* Start */ - if( bean->init != NULL ) { - env->l->jkLog(env, env->l, JK_LOG_INFO, - "config.update(): Starting %s\n", name ); - bean->init(env, bean); - } - } else { - /* Stop */ - env->l->jkLog(env, env->l, JK_LOG_INFO, - "config.update(): Stopping %s\n", name ); - bean->destroy(env, bean); - } - - } - } - - return JK_OK; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]