Files
dofs/src/core/node.cc

68 lines
1.7 KiB
C++

#include "core/node.h"
#include "core/simulator.h"
#include "core/error.h"
#include <optional>
namespace dofs {
Node::Node(Simulator *const sim, NodeId id, NodeType type) noexcept
: _sim(sim), _id(id), _status(NodeStatus::OK), _type(type) {}
// Accessors
NodeId Node::id() const noexcept {
return _id;
}
NodeStatus Node::status() const noexcept {
return _status;
}
NodeType Node::type() const noexcept {
return _type;
}
void Node::set_status(NodeStatus s) noexcept {
_status = s;
}
static inline bool schedule_status_ok_after(Simulator *const sim, Time delay_ns,
Node* self) {
if (!sim) {
log_error("ERROR", "Node: simulator instance not found for boot/reboot");
return false;
}
sim->schedule_after(delay_ns, [self]() {
self->set_status(NodeStatus::OK);
});
return true;
}
void Node::boot(Time boottime_ns) {
if (_status != NodeStatus::DOWN) {
log_error("ERROR", "boot() ignored: node not in DOWN state");
return;
}
_status = NodeStatus::BOOTING;
if (!schedule_status_ok_after(_sim, boottime_ns, this)) {
// Intentionally left BOOTING; caller can handle recovery/logs.
}
}
void Node::reboot(Time boottime_ns) {
if (_status != NodeStatus::OK && _status != NodeStatus::THROTTLING) {
log_error("ERROR", "reboot() ignored: node not in OK/THROTTLING state");
return;
}
_status = NodeStatus::BOOTING;
if (!schedule_status_ok_after(_sim, boottime_ns, this)) {
// Intentionally left BOOTING; caller can handle recovery/logs.
}
}
} // namespace dofs