# HG changeset patch # User Florian Pose # Date 1224234832 0 # Node ID dd648d1786e93bdf64254dadbfd8eb07d62c3b8c # Parent c887af3c92b32bbadaa41a76ce4bc52268a78fe2 Fixed race concerning ec_slave_config_state->operational. diff -r c887af3c92b3 -r dd648d1786e9 TODO --- a/TODO Thu Oct 02 08:52:48 2008 +0000 +++ b/TODO Fri Oct 17 09:13:52 2008 +0000 @@ -9,7 +9,6 @@ Version 1.4.0: * Check for possible race condition in jiffy-based frame timeout calculation. -* Remove race condition concerning the operational-Flag. * Update documentation. Future issues: diff -r c887af3c92b3 -r dd648d1786e9 master/fsm_master.c --- a/master/fsm_master.c Thu Oct 02 08:52:48 2008 +0000 +++ b/master/fsm_master.c Fri Oct 17 09:13:52 2008 +0000 @@ -728,6 +728,8 @@ if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config)) return; + fsm->slave->force_config = 0; + // configuration finished master->config_busy = 0; wake_up_interruptible(&master->config_queue); diff -r c887af3c92b3 -r dd648d1786e9 master/fsm_slave_config.c --- a/master/fsm_slave_config.c Thu Oct 02 08:52:48 2008 +0000 +++ b/master/fsm_slave_config.c Fri Oct 17 09:13:52 2008 +0000 @@ -172,10 +172,6 @@ EC_DBG("Configuring slave %u...\n", fsm->slave->ring_position); } - // configuration will be done immediately; therefore reset the - // force flag - fsm->slave->force_config = 0; - ec_fsm_change_start(fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); ec_fsm_change_exec(fsm->fsm_change); fsm->state = ec_fsm_slave_config_state_init; diff -r c887af3c92b3 -r dd648d1786e9 master/slave_config.c --- a/master/slave_config.c Thu Oct 02 08:52:48 2008 +0000 +++ b/master/slave_config.c Fri Oct 17 09:13:52 2008 +0000 @@ -748,7 +748,8 @@ state->online = sc->slave ? 1 : 0; if (state->online) { state->operational = - sc->slave->current_state == EC_SLAVE_STATE_OP; + sc->slave->current_state == EC_SLAVE_STATE_OP + && !sc->slave->force_config; state->al_state = sc->slave->current_state; } else { state->operational = 0;