-/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
ActorImpl::~ActorImpl()
{
- if (simix_global != nullptr && this != simix_global->maestro_) {
- if (context_.get() != nullptr) /* the actor was not start()ed yet. This happens if its host was initially off */
- context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
- actor::simcall([this] { s4u::Actor::on_destruction(*ciface()); });
- if (context_.get() != nullptr)
- context_->iwannadie = true;
- }
+ if (simix_global != nullptr && this != simix_global->maestro_)
+ s4u::Actor::on_destruction(*ciface());
}
/* Become an actor in the simulation
if (on_exit) {
// Execute the termination callbacks
- bool failed = context_->iwannadie;
+ bool failed = context_->wannadie();
for (auto exit_fun = on_exit->crbegin(); exit_fun != on_exit->crend(); ++exit_fun)
(*exit_fun)(failed);
on_exit.reset();
}
cleanup_from_simix();
- context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
+ context_->set_wannadie(false); // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
actor::simcall([this] { s4u::Actor::on_termination(*ciface()); });
- context_->iwannadie = true;
+ context_->set_wannadie();
}
void ActorImpl::exit()
{
- context_->iwannadie = true;
+ context_->set_wannadie();
suspended_ = false;
exception_ = nullptr;
/* Ok, maestro returned control to us */
XBT_DEBUG("Control returned to me: '%s'", get_cname());
- if (context_->iwannadie) {
+ if (context_->wannadie()) {
XBT_DEBUG("Actor %s@%s is dead", get_cname(), host_->get_cname());
context_->stop();
THROW_IMPOSSIBLE;
{
XBT_IN("actor = %p", this);
- if (context_->iwannadie) {
+ if (context_->wannadie()) {
XBT_VERB("Ignoring request to suspend an actor that is currently dying.");
return;
}
XBT_OUT();
}
-activity::ActivityImplPtr ActorImpl::join(ActorImpl* actor, double timeout)
+activity::ActivityImplPtr ActorImpl::join(const ActorImpl* actor, double timeout)
{
activity::ActivityImplPtr sleep = this->sleep(timeout);
actor->on_exit->emplace_back([sleep](bool) {