1 #include "scd_cont_man_slave.h"
3 #include "scd_logging.h"
4 #include "scd_exception.h"
7 scd_cont_man_slave::scd_cont_man_slave(scd_simulator& sim):
8 scd_cont_fsm("slave"), _sim(sim),
9 _connector(sim, SCD_CM_NETSIM, sim.get_name()), _has_master(false),
10 _st_init(sim, *this), _st_busy(sim, *this), _st_fail(sim, *this),
11 _st_failed(sim, *this), _st_idle(sim, *this), _st_done(sim, *this),
12 _st_time_ack(sim, *this), _st_time(sim, *this), _st_term_ack(sim, *this),
13 _st_terminated(sim, *this)
20 scd_cont_man_slave::~scd_cont_man_slave()
27 void scd_cont_man_slave::set_socket()
29 _socket = _connector.get_connection();
30 _writer.set_socket(*_socket);
31 _reader.set_socket(*_socket);
35 void scd_cont_man_slave::send_command(scd_command* cmd)
37 // register write event if not registered
38 if (!_writer.is_writing() && _socket->is_valid())
39 _sim.get_poller().set_ev(*this, SOCK_EV_WRITE | SOCK_EV_READ
42 // queue command to be written
43 _writer.queue_command(cmd);
47 bool scd_cont_man_slave::is_sending()
49 return _writer.is_writing() && _socket->is_valid();
53 void scd_cont_man_slave::close()
60 void scd_cont_man_slave::set_master(const std::string& host, uint16_t port)
63 _connector.connect_to(host, port);
66 scd_error("master already set");
67 throw scd_exception("master already set");
72 void scd_cont_man_slave::register_slave(const std::string& name)
74 scd_error("simulator is slave, can not have other slaves");
75 throw scd_exception("simulator is slave");
80 void scd_cont_man_slave::handle_sock_ev(sock_ev events)
82 scd_sts_base& state = *static_cast<scd_sts_base*>(_state);
84 if (events & SOCK_EV_CLOSE)
86 scd_error("connection to master lost");
92 if (events & SOCK_EV_READ)
96 if (!_socket->is_valid())
99 scd_error("connection to master lost");
104 if (!_reader.is_reading() && !_reader.has_command())
106 // received an illegal command
107 scd_error("received illegal command");
112 if (_reader.has_command())
114 scd_command* cmd = _reader.get_command();
121 if (events & SOCK_EV_WRITE)
124 if (!_writer.is_writing())
126 // done sending commands
127 _sim.get_poller().set_ev(*this, SOCK_EV_READ | SOCK_EV_CLOSE);
131 if (!_socket->is_valid())
133 scd_error("connection to master lost");
137 } // handle_sock_ev()
140 const scd_socket& scd_cont_man_slave::get_sock() { return *_socket; }
143 void scd_cont_man_slave::_process_cmd(scd_command& cmd)
145 if (cmd.get_type() != SCD_CM_CONTROL)
147 scd_warn("received non-control command");
151 scd_sts_base* state = static_cast<scd_sts_base*>(_state);
153 switch (cmd.get_subtype())
156 scd_error("master failed");
159 case SCD_CM_TIME_REQ:
160 state->recv_time_req();
162 case SCD_CM_TIME_NACK:
163 state->recv_time_nack();
166 state->recv_time(cmd.get_time());
168 case SCD_CM_TERM_REQ:
169 state->recv_term_req();
171 case SCD_CM_TERM_NACK:
172 state->recv_term_nack();
178 scd_warn("received unknown command");