X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/53ab1525ab0a15ba7323171aba78be415fd64fd6..42ec07cc0c4fb24df86b22c97bfbeab2f0a21c8e:/src/kernel/activity/SynchroRaw.cpp diff --git a/src/kernel/activity/SynchroRaw.cpp b/src/kernel/activity/SynchroRaw.cpp index 8a4cb51ea0..a54933725e 100644 --- a/src/kernel/activity/SynchroRaw.cpp +++ b/src/kernel/activity/SynchroRaw.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2021. 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. */ @@ -61,6 +61,9 @@ void RawImpl::post() } else if (surf_action_->get_state() == resource::Action::State::FINISHED) { state_ = State::SRC_TIMEOUT; } + + clean_action(); + /* Answer all simcalls associated with the synchro */ finish(); } @@ -71,40 +74,14 @@ void RawImpl::finish() if (state_ == State::FAILED) { XBT_DEBUG("RawImpl::finish(): host '%s' failed", simcall->issuer_->get_host()->get_cname()); - simcall->issuer_->context_->iwannadie = true; + simcall->issuer_->context_->set_wannadie(); simcall->issuer_->exception_ = std::make_exception_ptr(HostFailureException(XBT_THROW_POINT, "Host failed")); } else if (state_ != State::SRC_TIMEOUT) { xbt_die("Internal error in RawImpl::finish() unexpected synchro state %d", static_cast(state_)); } - switch (simcall->call_) { - - case SIMCALL_MUTEX_LOCK: - simgrid::xbt::intrusive_erase(simcall_mutex_lock__get__mutex(simcall)->sleeping_, *simcall->issuer_); - break; - - case SIMCALL_COND_WAIT: - simgrid::xbt::intrusive_erase(simcall_cond_wait__get__cond(simcall)->sleeping_, *simcall->issuer_); - break; - - case SIMCALL_COND_WAIT_TIMEOUT: - simgrid::xbt::intrusive_erase(simcall_cond_wait_timeout__get__cond(simcall)->sleeping_, *simcall->issuer_); - simcall_cond_wait_timeout__set__result(simcall, 1); // signal a timeout - break; - - case SIMCALL_SEM_ACQUIRE: - simgrid::xbt::intrusive_erase(simcall_sem_acquire__get__sem(simcall)->sleeping_, *simcall->issuer_); - break; - - case SIMCALL_SEM_ACQUIRE_TIMEOUT: - simgrid::xbt::intrusive_erase(simcall_sem_acquire_timeout__get__sem(simcall)->sleeping_, *simcall->issuer_); - simcall_sem_acquire_timeout__set__result(simcall, 1); // signal a timeout - break; - - default: - THROW_IMPOSSIBLE; - } - simcall->issuer_->waiting_synchro = nullptr; + finish_callback_(); + simcall->issuer_->waiting_synchro_ = nullptr; simcall->issuer_->simcall_answer(); }