diff options
Diffstat (limited to 'mmss/context.cpp')
-rw-r--r-- | mmss/context.cpp | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/mmss/context.cpp b/mmss/context.cpp index 36f2ea5..c398d3c 100644 --- a/mmss/context.cpp +++ b/mmss/context.cpp @@ -24,9 +24,15 @@ */ -#include "mmss.hpp" +#include "context.hpp" +#include "config.hpp" +#include "network.hpp" #include "node.hpp" +#include <algorithm> +#include <cassert> +#include <cstdio> + namespace MMSS { @@ -80,4 +86,61 @@ void context_t::logf(int priority, const char *format, ...) { va_end(ap); } +void context_t::run(int argc, char *argv[]) { + if (argc != 2) { + std::fprintf(stderr, "usage: %s protocol_module\n", argv[0]); + std::exit(1); + } + + std::shared_ptr<const protocol_t> proto = protocol_t::load(this, argv[1]); + if (!proto) + std::exit(1); + + config_t conf = {}; + + //read_config(this, &conf, "babel_test.mmss"); + + std::shared_ptr<network_t> net0 = std::make_shared<network_t>("net0"); + std::shared_ptr<network_t> net1 = std::make_shared<network_t>("net1"); + + std::shared_ptr<node_t> node1 = node_t::create(this, "node1", 1, proto); + std::shared_ptr<node_t> node2 = node_t::create(this, "node2", 2, proto); + std::shared_ptr<node_t> node3 = node_t::create(this, "node3", 3, proto); + + std::list<std::shared_ptr<node_t>> nodes; + + nodes.push_back(node1); + nodes.push_back(node2); + nodes.push_back(node3); + + gmrf_addr_t addr1 = {{1}}, addr2 = {{2}}, addr3 = {{3}}, addr4 = {{4}}; + add_iface(node1, net0, "mmss0", &addr1); + add_iface(node2, net0, "mmss0", &addr2); + add_iface(node2, net1, "mmss1", &addr3); + add_iface(node3, net1, "mmss1", &addr4); + + while (true) { + if (now() > 10000000) + break; + + int timeout = event_queue.timeout(); + + if (timeout < 0) { + fprintf(stderr, "nothing queued, deadlock occured.\n"); + break; + } + + if (timeout > 0) { + assert(!event_queue.get()); + + advance(timeout); + timeout = event_queue.timeout(); + } + + assert(timeout == 0); + + event_queue.get()->handle(this); + } +} + } |