+ if (TRACE_actor_is_enabled()) {
+ s4u::Actor::on_creation_cb(on_actor_creation);
+ s4u::Actor::on_destruction_cb([](s4u::Actor const& actor) {
+ if (auto* container = Container::by_name_or_null(instr_pid(actor)))
+ container->remove_from_parent();
+ });
+ s4u::Actor::on_suspend_cb([](s4u::Actor const& actor) {
+ Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("suspend");
+ });
+ s4u::Actor::on_resume_cb(
+ [](s4u::Actor const& actor) { Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); });
+ s4u::Actor::on_sleep_cb([](s4u::Actor const& actor) {
+ Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->push_event("sleep");
+ });
+ s4u::Actor::on_wake_up_cb(
+ [](s4u::Actor const& actor) { Container::by_name(instr_pid(actor))->get_state("ACTOR_STATE")->pop_event(); });
+
+ s4u::Exec::on_start_cb([](s4u::Exec const& e) {
+ std::string pid = instr_pid(*s4u::Actor::self());
+ if (pid == "-0") //Exec is launched directly by Maestro, use the host as container
+ Container::by_name(e.get_host()->get_name())->get_state("HOST_STATE")->push_event("execute");
+ else
+ Container::by_name(pid)->get_state("ACTOR_STATE")->push_event("execute");
+ });
+
+ s4u::Exec::on_completion_cb([](const s4u::Exec& e) {
+ std::string pid = instr_pid(*s4u::Actor::self());
+ if (pid == "-0") //Exec is launched directly by Maestro, use the host as container
+ Container::by_name(e.get_host()->get_name())->get_state("HOST_STATE")->pop_event();
+ else
+ Container::by_name(pid)->get_state("ACTOR_STATE")->pop_event();
+ });
+
+ s4u::Comm::on_completion_cb([](const s4u::Comm& c) {
+ if (c.get_sender()) {
+ Container::by_name(instr_pid(*c.get_sender()))->get_state("ACTOR_STATE")->pop_event();
+ Container::by_name(instr_pid(*c.get_receiver()))->get_state("ACTOR_STATE")->pop_event();
+ } else {
+ Container::by_name(c.get_source()->get_name())->get_state("HOST_STATE")->pop_event();
+ Container::by_name(c.get_destination()->get_name())->get_state("HOST_STATE")->pop_event();
+ }
+ });
+ s4u::Comm::on_start_cb([](s4u::Comm const& c) {
+ std::string pid = instr_pid(*s4u::Actor::self());
+ if (pid == "-0") { //Comm is launched directly by Maestro, use the host as container
+ Container::by_name(c.get_source()->get_name())->get_state("HOST_STATE")->push_event("start");
+ Container::by_name(c.get_destination()->get_name())->get_state("HOST_STATE")->push_event("start");
+ }
+ });
+ s4u::Comm::on_send_cb([](s4u::Comm const&) {
+ Container::by_name(instr_pid(*s4u::Actor::self()))->get_state("ACTOR_STATE")->push_event("send");
+ });
+ s4u::Comm::on_recv_cb([](s4u::Comm const&) {
+ Container::by_name(instr_pid(*s4u::Actor::self()))->get_state("ACTOR_STATE")->push_event("receive");
+ });
+ s4u::Actor::on_host_change_cb(on_actor_host_change);
+ }