X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Ffsm%2Fscd_stm_done.cpp;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Ffsm%2Fscd_stm_done.cpp;h=9d54d60038cf6461db2c6189512d33f169cbe787;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hdsd/scd/fsm/scd_stm_done.cpp b/dol/src/dol/visitor/hdsd/scd/fsm/scd_stm_done.cpp new file mode 100644 index 0000000..9d54d60 --- /dev/null +++ b/dol/src/dol/visitor/hdsd/scd/fsm/scd_stm_done.cpp @@ -0,0 +1,64 @@ +#include "fsm/scd_stm_done.h" + +#include "scd_logging.h" +#include "scd_exception.h" +#include "scd_cont_man_master.h" + + +void scd_stm_done::set_busy() +{ + _fsm.set_state(_st_busy); +} + + +void scd_stm_done::set_idle(const sc_core::sc_time& time) +{ + _time_step = time; + _fsm.set_state(_st_idle); +} + + +void scd_stm_done::process() +{ + if (!_check_slaves()) + return; + + std::list::iterator iter; + bool terminate = true; + + for (iter = _slaves.begin(); iter != _slaves.end(); iter++) + { + if (!(*iter)->idle() && !(*iter)->done()) + { + // this slave is not ready yet + return; + } + + if (!(*iter)->done()) + terminate = false; + } + + /* all slaves seem idle or done. wait a short moment, to prevent + * race conditions (channel data in transit but both endpoints done). + * if no socket activity occured we can move on, else we cancel. + */ + if (_sim.get_poller().wait(SCD_CONT_DELAY)) + return; + + if (terminate) + { + // all slaves seem to be done + for (iter = _slaves.begin(); iter != _slaves.end(); iter++) + (*iter)->send_term_req(); + _fsm.save_state(); + _fsm.set_state(_st_term_req); + } + else + { + // some slaves are not done yet + for (iter = _slaves.begin(); iter != _slaves.end(); iter++) + (*iter)->send_time_req(); + _fsm.save_state(); + _fsm.set_state(_st_time_req); + } +}