> [ 3.000000] (maestro@) Oops! Deadlock or code not perfectly clean.
> [ 3.000000] (maestro@) 1 actors are still running, waiting for something.
> [ 3.000000] (maestro@) Legend of the following listing: "Actor <pid> (<name>@<host>): <status>"
-> [ 3.000000] (maestro@) Actor 3 (C@Ginette): waiting for synchronization activity 0xdeadbeef () in state WAITING to finish
+> [ 3.000000] (maestro@) Actor 3 (C@Ginette): waiting for communication activity 0xdeadbeef () in state WAITING to finish
> [ 3.000000] (C@Ginette) I was killed!
> [ 3.000000] (C@Ginette) The backtrace would be displayed here if --log=no_loc would not have been passed
> [ 3.000000] (maestro@) Oops! Deadlock or code not perfectly clean.
> [ 3.000000] (maestro@) 1 actors are still running, waiting for something.
> [ 3.000000] (maestro@) Legend of the following listing: "Actor <pid> (<name>@<host>): <status>"
-> [ 3.000000] (maestro@) Actor 3 (C@Ginette): waiting for synchronization activity 0xdeadbeef () in state WAITING to finish
+> [ 3.000000] (maestro@) Actor 3 (C@Ginette): waiting for communication activity 0xdeadbeef () in state WAITING to finish
> [ 3.000000] (C@Ginette) I was killed!
> [ 3.000000] (C@Ginette) The backtrace would be displayed here if --log=no_loc would not have been passed
> [ 3.000000] (maestro@) Actor C terminates now
if (state_ != State::WAITING && state_ != State::RUNNING) {
finish();
} else {
+ /* we need a sleep action (even when the timeout is infinite) to be notified of host failures */
+ /* Comms handle that a bit differently of the other activities */
auto* comm = dynamic_cast<CommImpl*>(this);
if (comm != nullptr) {
resource::Action* sleep = issuer->get_host()->get_cpu()->sleep(timeout);
comm->src_timeout_ = sleep;
else
comm->dst_timeout_ = sleep;
+ } else {
+ RawImplPtr synchro(new RawImpl([this, issuer]() {
+ this->unregister_simcall(&issuer->simcall_);
+ issuer->waiting_synchro_ = nullptr;
+ issuer->exception_ = nullptr;
+ auto* observer = dynamic_cast<kernel::actor::ActivityWaitSimcall*>(issuer->simcall_.observer_);
+ xbt_assert(observer != nullptr);
+ observer->set_result(true);
+ }));
+ synchro->set_host(issuer->get_host()).set_timeout(timeout).start();
+ synchro->register_simcall(&issuer->simcall_);
}
- /* we need a sleep action (even when the timeout is infinite) to be notified of host failures */
- RawImplPtr synchro(new RawImpl([this, issuer]() {
- this->unregister_simcall(&issuer->simcall_);
- issuer->waiting_synchro_ = nullptr;
- issuer->exception_ = nullptr;
- auto* observer = dynamic_cast<kernel::actor::ActivityWaitSimcall*>(issuer->simcall_.observer_);
- xbt_assert(observer != nullptr);
- observer->set_result(true);
- }));
- synchro->set_host(issuer->get_host()).set_timeout(timeout).start();
- synchro->register_simcall(&issuer->simcall_);
}
}
if (not simcall->issuer_->get_host()->is_on()) {
simcall->issuer_->context_->set_wannadie();
} else {
- set_exception(simcall->issuer_);
- simcall->issuer_->simcall_answer();
+ // Do not answer to dying actors
+ if (not simcall->issuer_->context_->wannadie()) {
+ set_exception(simcall->issuer_);
+ simcall->issuer_->simcall_answer();
+ }
}
simcall->issuer_->waiting_synchro_ = nullptr;