X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/52a4a8d74247e74c0af8461ebdb3e68b5d5375e6..23802cce688def4bcaa49c5723b627b261ca5092:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index 050908b2b8..cb929b9ae0 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2020. 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. */ @@ -44,6 +44,18 @@ unsigned long get_maxpid() { return maxpid; } +ActorImpl* ActorImpl::by_PID(aid_t PID) +{ + auto item = simix_global->process_list.find(PID); + if (item != simix_global->process_list.end()) + return item->second; + + // Search the trash + for (auto& a : simix_global->actors_to_destroy) + if (a.get_pid() == PID) + return &a; + return nullptr; // Not found, even in the trash +} ActorImpl* ActorImpl::self() { @@ -153,7 +165,7 @@ void ActorImpl::cleanup() if (has_to_auto_restart() && not get_host()->is_on()) { XBT_DEBUG("Insert host %s to watched_hosts because it's off and %s needs to restart", get_host()->get_cname(), get_cname()); - watched_hosts.insert(get_host()->get_name()); + watched_hosts().insert(get_host()->get_name()); } if (on_exit) { @@ -306,7 +318,38 @@ void ActorImpl::yield() XBT_DEBUG("Wait, maestro left me an exception"); std::exception_ptr exception = std::move(exception_); exception_ = nullptr; - std::rethrow_exception(std::move(exception)); + try { + std::rethrow_exception(std::move(exception)); + } catch (const simgrid::Exception& e) { + if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested(simgrid::TimeoutException(XBT_THROW_POINT, "Timeout raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested(simgrid::HostFailureException(XBT_THROW_POINT, "HostFailure raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested( + simgrid::NetworkFailureException(XBT_THROW_POINT, "NetworkFailure raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested( + simgrid::StorageFailureException(XBT_THROW_POINT, "StorageFailure raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested(simgrid::VmFailureException(XBT_THROW_POINT, "VmFailure raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested(simgrid::CancelException(XBT_THROW_POINT, "Cancel raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + std::throw_with_nested(simgrid::TracingError(XBT_THROW_POINT, "Tracing error raised in kernel mode.")); + + } else if (dynamic_cast(&e) != nullptr) { + auto pe = dynamic_cast(&e); + std::throw_with_nested(simgrid::ParseError(pe->file_, pe->line_, "Parse error raised in kernel mode.")); + } + THROW_IMPOSSIBLE; + } } if (SMPI_switch_data_segment && not finished_) { @@ -562,25 +605,10 @@ const char* SIMIX_process_self_get_name() return SIMIX_is_maestro() ? "maestro" : simgrid::kernel::actor::ActorImpl::self()->get_cname(); } -/** - * @brief Calling this function makes the process to yield. - * - * Only the current process can call this function, giving back the control to maestro. - * - * @param self the current process - */ - /** @brief Returns the process from PID. */ smx_actor_t SIMIX_process_from_PID(aid_t PID) { - auto item = simix_global->process_list.find(PID); - if (item == simix_global->process_list.end()) { - for (auto& a : simix_global->actors_to_destroy) - if (a.get_pid() == PID) - return &a; - return nullptr; // Not found, even in the trash - } - return item->second; + return simgrid::kernel::actor::ActorImpl::by_PID(PID); } void SIMIX_process_on_exit(smx_actor_t actor,