*/
smx_actor_t SIMIX_process_self()
{
- smx_context_t self_context = simgrid::kernel::context::Context::self();
+ simgrid::kernel::context::Context* self_context = simgrid::kernel::context::Context::self();
return (self_context != nullptr) ? self_context->get_actor() : nullptr;
}
context->attach_start();
/* The on_creation() signal must be delayed until there, where the pid and everything is set */
- simgrid::s4u::ActorPtr tmp = actor->iface(); // Passing this directly to on_creation will lead to crashes
- simgrid::s4u::Actor::on_creation(tmp);
+ simgrid::s4u::Actor::on_creation(*actor->ciface());
return ActorImplPtr(actor);
}
}
// Execute the termination callbacks
- smx_process_exit_status_t exit_status = (context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+ bool failed = context_->iwannadie;
while (not on_exit.empty()) {
- s_smx_process_exit_fun_t exit_fun = on_exit.back();
+ auto exit_fun = on_exit.back();
on_exit.pop_back();
- (exit_fun.fun)(exit_status, exit_fun.arg);
+ exit_fun(failed);
}
/* cancel non-blocking activities */
simix_global->mutex.unlock();
context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
- simgrid::simix::simcall([this] { simgrid::s4u::Actor::on_destruction(iface()); });
+ simgrid::simix::simcall([this] { simgrid::s4u::Actor::on_destruction(*ciface()); });
context_->iwannadie = true;
}
return kill_timer ? kill_timer->get_date() : 0;
}
-static void dying_daemon(int /*exit_status*/, void* data)
-{
- std::vector<ActorImpl*>* vect = &simix_global->daemons;
-
- auto it = std::find(vect->begin(), vect->end(), static_cast<ActorImpl*>(data));
- xbt_assert(it != vect->end(), "The dying daemon is not a daemon after all. Please report that bug.");
-
- /* Don't move the whole content since we don't really care about the order */
- std::swap(*it, vect->back());
- vect->pop_back();
-}
-
void ActorImpl::yield()
{
XBT_DEBUG("Yield actor '%s'", get_cname());
XBT_DEBUG("Control returned to me: '%s'", get_cname());
if (context_->iwannadie) {
-
XBT_DEBUG("Actor %s@%s is dead", get_cname(), host_->get_cname());
// throw simgrid::kernel::context::ForcefulKillException(); Does not seem to properly kill the actor
context_->stop();
if (not daemon_) {
daemon_ = true;
simix_global->daemons.push_back(this);
- SIMIX_process_on_exit(this, dying_daemon, this);
+ SIMIX_process_on_exit(this, [this](bool) {
+ auto& vect = simix_global->daemons;
+ auto it = std::find(vect.begin(), vect.end(), this);
+ xbt_assert(it != vect.end(), "The dying daemon is not a daemon after all. Please report that bug.");
+
+ /* Don't move the whole content since we don't really care about the order */
+ std::swap(*it, vect.back());
+ vect.pop_back();
+ });
}
}
return nullptr;
} else {
- return activity::ExecImplPtr(new activity::ExecImpl("suspend", ""))->set_host(host_)->start(0.0, 1.0, 0.0);
+ activity::ExecImpl* exec = new activity::ExecImpl();
+ (*exec).set_name("suspend").set_host(host_).set_flops_amount(0.0).start();
+ return activity::ExecImplPtr(exec);
}
}
activity::ActivityImplPtr ActorImpl::join(ActorImpl* actor, double timeout)
{
- activity::ActivityImplPtr res = this->sleep(timeout);
- intrusive_ptr_add_ref(res.get());
- SIMIX_process_on_exit(actor,
- [](int, void* arg) {
- auto sleep = static_cast<activity::SleepImpl*>(arg);
- if (sleep->surf_action_)
- sleep->surf_action_->finish(resource::Action::State::FINISHED);
- intrusive_ptr_release(sleep);
- },
- res.get());
- return res;
+ activity::ActivityImplPtr sleep = this->sleep(timeout);
+ SIMIX_process_on_exit(actor, [sleep](bool) {
+ if (sleep->surf_action_)
+ sleep->surf_action_->finish(resource::Action::State::FINISHED);
+ });
+ return sleep;
}
activity::ActivityImplPtr ActorImpl::sleep(double duration)
intrusive_ptr_add_ref(actor);
/* The on_creation() signal must be delayed until there, where the pid and everything is set */
- s4u::Actor::on_creation(actor->iface());
+ s4u::Actor::on_creation(*actor->ciface());
return ActorImplPtr(actor);
}
void SIMIX_process_on_exit(smx_actor_t actor, int_f_pvoid_pvoid_t fun, void* data)
{
- SIMIX_process_on_exit(actor, [fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data);
+ SIMIX_process_on_exit(actor, [fun, data](bool failed) {
+ intptr_t status = failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+ fun(reinterpret_cast<void*>(status), data);
+ });
}
-void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool, void*)>& fun, void* data)
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(int, void*)>& fun, void* data)
{
- xbt_assert(actor, "current process not found: are you in maestro context ?");
+ SIMIX_process_on_exit(actor, [fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); });
+}
- actor->on_exit.emplace_back(s_smx_process_exit_fun_t{fun, data});
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool /*failed*/)>& fun)
+{
+ xbt_assert(actor, "current process not found: are you in maestro context ?");
+ actor->on_exit.emplace_back(fun);
}
/** @brief Restart a process, starting it again from the beginning. */