X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_cont_man_master.cpp;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_cont_man_master.cpp;h=932644cb476680b20f0ebc32e4fab916e36603a0;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hdsd/scd/scd_cont_man_master.cpp b/dol/src/dol/visitor/hdsd/scd/scd_cont_man_master.cpp new file mode 100644 index 0000000..932644c --- /dev/null +++ b/dol/src/dol/visitor/hdsd/scd/scd_cont_man_master.cpp @@ -0,0 +1,93 @@ +#include "scd_cont_man_master.h" + +#include "scd_logging.h" +#include "scd_exception.h" + + +scd_cont_man_master::scd_cont_man_master(scd_simulator& sim): + _sim(sim), scd_cont_fsm("master"), + _st_init(sim, *this), _st_busy(sim, *this), _st_idle(sim, *this), + _st_done(sim, *this), _st_time_req(sim, *this), _st_time(sim, *this), + _st_term_req(sim, *this), _st_terminate(sim, *this), + _st_terminated(sim, *this), _st_fail(sim, *this), _st_failed(sim, *this) +{ + // set initial state + set_state(_st_init); +} + + +scd_cont_man_master::~scd_cont_man_master() +{ + std::list::iterator it; + + for (it = _slaves.begin(); it != _slaves.end(); it++) + delete *it; +} + + +void scd_cont_man_master::connect_slave(const scd_command &c, scd_socket* sock) +{ + std::string name = c.get_string(); + + scd_cont_slave_wrapper* slave = _get_slave(name); + + if (slave == NULL) + { + scd_warn("unknown slave \"" + name + "\""); + delete sock; + } + else + slave->connect(sock); + +} // connect() + + +void scd_cont_man_master::set_master(const std::string& host, uint16_t port) +{ + scd_error("simulator is master, can not have another master"); + throw scd_exception("simulator is master"); +} // set_master() + + +void scd_cont_man_master::register_slave(const std::string& name) +{ + if ( _get_slave(name) != NULL ) + { + scd_warn("slave \"" + name + "\" already registered, ignoring..."); + } + else + { + scd_cont_slave_wrapper* wrap; + wrap = new scd_cont_slave_wrapper(_sim, name); + _slaves.push_back(wrap); + } + +} // register_slave + + +void scd_cont_man_master::process() +{ + std::list::iterator it; + + // process all slaves + for (it = _slaves.begin(); it != _slaves.end(); it++) + (*it)->process(); + + // process the local state + _state->process(); +} + + +scd_cont_slave_wrapper* scd_cont_man_master::_get_slave(const std::string& name) +{ + std::list::iterator it; + + for (it = _slaves.begin(); it != _slaves.end(); it++) + { + if ( (*it)->get_name() == name ) + return *it; + } + + return NULL; + +} // _get_slave()