35 type._to_string() +
" type_=" +
type_._to_string());
36 throw "called function of different trigger type";
49 std::string(
"etiss::fault::Trigger::Trigger(const InjectorAddress &target_injector) : type_ (ASAP)"));
53 : type_(
type_t::META_COUNTER), sub_(new
Trigger(sub)), param1_(count), param2_(0)
58 : type_(
type_t::VARIABLEVALUE)
83 if (
type_ == +type_t::VARIABLEVALUE)
93 case type_t::META_COUNTER:
98 case type_t::VARIABLEVALUE:
104 case type_t::TIMERELATIVE:
120#if CXX0X_UP_SUPPORTED
134 if (
type_ == +type_t::VARIABLEVALUE)
146 std::string(
", Injector*)"));
149 case type_t::META_COUNTER:
151 if (
sub_->check(time_ps, target_injector))
161 case type_t::VARIABLEVALUE:
170 std::cout <<
"Trigger::check: Failed to get field" << std::endl;
179 if (
inj_->getInjector())
184 std::cout <<
"Trigger::check: Failed to read field: " << errmsg << std::endl;
194 std::cout <<
"Trigger::check: Failed get injector: " <<
inj_->getInjectorPath() << std::endl;
201 case type_t::TIMERELATIVE:
245 std::string(
"etiss::fault::Trigger::resolveTime(time=") + std::to_string(time) + std::string(
")"));
246 if (
type_ == +type_t::TIMERELATIVE)
248 type_ = type_t::TIME;
251 else if (
type_ == +type_t::META_COUNTER)
253 return sub_->resolveTime(time);
258 if (
type_ == +type_t::META_COUNTER)
260 return sub_->isResolved();
262 return type_ != +type_t::TIMERELATIVE;
267 ensure(type_t::META_COUNTER);
273 ensure(type_t::META_COUNTER);
279 if (
type_ == +type_t::META_COUNTER)
281 return sub_->getTriggerTime();
289 ensure(type_t::TIMERELATIVE);
301 if (
type_ == +type_t::META_COUNTER)
307 return inj_->getInjector();
313 if (
type_ == +type_t::META_COUNTER)
315 return sub_->isNOP();
319 return type_ == +type_t::NOP;
326 if (
type_ == +type_t::META_COUNTER)
328 return sub_->getTriggerField();
330 ensure(type_t::VARIABLEVALUE);
337 if (
type_ == +type_t::META_COUNTER)
339 return sub_->getTriggerFieldValue();
341 ensure(type_t::VARIABLEVALUE);
352 std::stringstream ss;
353 ss <<
"Trigger { type=" <<
type_;
356 case type_t::META_COUNTER:
357 ss <<
" triggerCount=" << +
param1_ <<
" currentCount=" << +
param2_;
359 case type_t::VARIABLEVALUE:
362 case type_t::TIMERELATIVE:
365 ss <<
" triggerTime=" << +
param1_;
378bool parse<etiss::fault::Trigger *>(pugi::xml_node node,
etiss::fault::Trigger *&f, Diagnostics &diag)
381 std::string(
"(node, Trigger*&, Diagnostics)"));
384 if (!parse_attr(node,
"type", type_s, diag))
389 if (!Trigger::type_t::_from_string_nothrow(type_s.c_str()))
391 diag.unexpectedNode(node, std::string(
"There is no Trigger type ") + type_s);
394 auto type = Trigger::type_t::_from_string(type_s.c_str());
398 case Trigger::type_t::META_COUNTER:
401 if (!parse<uint64_t>(findSingleNode(node,
"count", diag), count, diag))
406 if ((!parse<etiss::fault::Trigger *>(findSingleNode(node,
"trigger", diag), sub, diag)) || (sub == 0))
408 diag.unexpectedNode(node,
"Failed to parse sub trigger");
416 case Trigger::type_t::VARIABLEVALUE:
419 if (!parse_hex(findSingleNode(node,
"value", diag), value, diag))
424 if (!parse<std::string>(findSingleNode(node,
"field", diag), field, diag))
430 if (!parse<etiss::fault::InjectorAddress>(findSingleNode(node,
"injector", diag), injector, diag))
434 f =
new Trigger(injector, field, value);
438 case Trigger::type_t::TIME:
441 if (!parse<uint64_t>(findSingleNode(node,
"time_ps", diag), count, diag))
447 if (!parse<etiss::fault::InjectorAddress>(findSingleNode(node,
"injector", diag), injector, diag))
451 f =
new Trigger(injector, count);
455 case Trigger::type_t::TIMERELATIVE:
458 if (!parse<uint64_t>(findSingleNode(node,
"time_ps", diag), count, diag))
464 if (!parse<etiss::fault::InjectorAddress>(findSingleNode(node,
"injector", diag), injector, diag))
468 f =
new Trigger(injector, count,
true);
473 case Trigger::type_t::ASAP:
476 if (!parse<etiss::fault::InjectorAddress>(findSingleNode(node,
"injector", diag), injector, diag))
480 f =
new Trigger(injector);
492bool write<const etiss::fault::Trigger *>(pugi::xml_node node,
const etiss::fault::Trigger *
const &f, Diagnostics &diag)
495 std::string(
"(node, Trigger*&, Diagnostics)"));
498 return write<etiss::fault::Trigger>(node, *f, diag);
505 std::string(
"(node, Trigger&, Diagnostics)"));
507 if (!parse<etiss::fault::Trigger *>(node, t, diag))
514bool write<Trigger>(pugi::xml_node node,
const Trigger &f, Diagnostics &diag)
517 std::string(
"(node, Trigger&, Diagnostics)"));
519 write_attr<std::string>(node,
"type", f.getType()._to_string(), diag);
522 case Trigger::type_t::META_COUNTER:
524 write<uint64_t>(node.append_child(
"count"), f.getTriggerCount(), diag);
525 write<Trigger>(node.append_child(
"trigger"), f.getSubTrigger(), diag);
528 case Trigger::type_t::VARIABLEVALUE:
530 write<std::string>(node.append_child(
"field"), f.getTriggerField(), diag);
531 write<uint64_t>(node.append_child(
"count"), f.getTriggerFieldValue(), diag);
535 diag.errors.push_back(
"A fault trigger has no target_injector. failed to "
536 "get path of trigger");
539 write<std::string>(node.append_child(
"injector"), ptr->getInjectorPath(), diag);
542 case Trigger::type_t::TIME:
544 case Trigger::type_t::TIMERELATIVE:
546 write<uint64_t>(node.append_child(
"time_ps"), f.getTriggerTime(), diag);
550 diag.errors.push_back(
"A fault trigger has no target_injector. failed to "
551 "get path of trigger");
554 write<std::string>(node.append_child(
"injector"), ptr->getInjectorPath(), diag);
557 case Trigger::type_t::ASAP:
559 case Trigger::type_t::NOP:
565 diag.errors.push_back(
"etiss::fault::xml::write<etiss::fault::Trigger> "
566 "encountered an unknown type of trigger");
contains the fault container class that stores triggers and actions for fault injection
contains a simple class that represents and resolves injector addresses as used by triggers (
contains the fault injector interface class.
general configuration and logging
contains the Trigger class that defines conditions under which actions of a Fault need to be applied.
contains XML related functions.
static __inline__ uint64_t
const std::string & getInjectorPath() const
const Injector_ptr & getInjector() const
virtual void * fastFieldAccessPtr(const std::string &name, std::string &errormsg)=0
std::string toString() const
operator<< can be used.
const std::string & getTriggerField() const
const uint64_t & getTriggerFieldValue() const
uint64_t getTriggerCount() const
const Injector_ptr & getInjector() const
std::unique_ptr< Trigger > sub_
void ensure(type_t type) const
const type_t & getType() const
bool check(uint64_t time_ps, etiss::fault::Injector *target_injector)
this function checks if the Trigger has just fired.
const Trigger & getSubTrigger() const
const InjectorAddress & getInjectorAddress() const
std::unique_ptr< InjectorAddress > inj_
Trigger()
Type: NOP (no operation)
Trigger & operator=(const Trigger &cpy)
uint64_t getTriggerTime() const
bool isResolved() const
returns if the translation from TIMERELATIVE to TIME trigger has taken place
void resolveTime(uint64_t time)
this function calculates in case of a TIMERELATIVE Trigger a constant TIME trigger
void setCoreName(std::string &str)
std::shared_ptr< Injector > Injector_ptr
void log(Verbosity level, std::string msg)
write log message at the given level.