X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3580b0137eab12ca216d9847823c86918b10dd53..8c6bbb14f44b8daed5ea43d80880c6bf2155118b:/src/kernel/context/ContextThread.cpp diff --git a/src/kernel/context/ContextThread.cpp b/src/kernel/context/ContextThread.cpp index f5a1f7a5e6..68bb417827 100644 --- a/src/kernel/context/ContextThread.cpp +++ b/src/kernel/context/ContextThread.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2023. 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. */ @@ -8,8 +8,8 @@ #include "simgrid/Exception.hpp" #include "src/internal_config.h" /* loads context system definitions */ #include "src/kernel/EngineImpl.hpp" +#include "src/xbt/xbt_modinter.h" /* prototype of os thread module's init/exit in XBT */ #include "xbt/function_types.h" -#include "xbt/xbt_modinter.h" /* prototype of os thread module's init/exit in XBT */ #include #include @@ -18,43 +18,39 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ker_context); -namespace simgrid { -namespace kernel { -namespace context { +namespace simgrid::kernel::context { // ThreadContextFactory ThreadContextFactory::ThreadContextFactory() : ContextFactory() { - if (stack_size != 8 * 1024 * 1024) + if (Context::stack_size != 8 * 1024 * 1024) XBT_INFO("Stack size modifications are ignored by thread factory."); - if (is_parallel()) + if (Context::is_parallel()) ParallelThreadContext::initialize(); } ThreadContextFactory::~ThreadContextFactory() { - if (is_parallel()) + if (Context::is_parallel()) ParallelThreadContext::finalize(); } ThreadContext* ThreadContextFactory::create_context(std::function&& code, actor::ActorImpl* actor, bool maestro) { - if (is_parallel()) + if (Context::is_parallel()) return this->new_context(std::move(code), actor, maestro); else return this->new_context(std::move(code), actor, maestro); } -void ThreadContextFactory::run_all() +void ThreadContextFactory::run_all(std::vector const& actors_list) { - if (is_parallel()) { - // Parallel execution - ParallelThreadContext::run_all(); - } else { - // Serial execution - SerialThreadContext::run_all(); - } + if (Context::is_parallel()) + ParallelThreadContext::run_all(actors_list); + + else + SerialThreadContext::run_all(actors_list); } // ThreadContext @@ -88,9 +84,7 @@ void ThreadContext::wrapper(ThreadContext* context) { Context::set_current(context); -#ifndef WIN32 - install_sigsegv_stack(nullptr, true); -#endif + install_sigsegv_stack(true); // Tell the caller (normally the maestro) we are starting, and wait for its green light context->end_.release(); context->start(); @@ -109,9 +103,7 @@ void ThreadContext::wrapper(ThreadContext* context) // Signal to the caller (normally the maestro) that we have finished: context->yield(); -#ifndef WIN32 - install_sigsegv_stack(nullptr, false); -#endif + install_sigsegv_stack(false); XBT_DEBUG("Terminating"); Context::set_current(nullptr); } @@ -166,10 +158,9 @@ void ThreadContext::attach_stop() // SerialThreadContext -void SerialThreadContext::run_all() +void SerialThreadContext::run_all(std::vector const& actors_list) { - const auto& to_run = EngineImpl::get_instance()->get_actors_to_run(); - for (smx_actor_t const& actor : to_run) { + for (auto const* actor : actors_list) { XBT_DEBUG("Handling %p", actor); auto* context = static_cast(actor->context_.get()); context->release(); @@ -192,13 +183,12 @@ void ParallelThreadContext::finalize() thread_sem_ = nullptr; } -void ParallelThreadContext::run_all() +void ParallelThreadContext::run_all(std::vector const& actors_list) { - const auto& to_release = EngineImpl::get_instance()->get_actors_to_run(); - for (smx_actor_t const& actor : to_release) + for (auto const* actor : actors_list) static_cast(actor->context_.get())->release(); - const auto& to_wait = EngineImpl::get_instance()->get_actors_to_run(); - for (smx_actor_t const& actor : to_wait) + + for (auto const* actor : actors_list) static_cast(actor->context_.get())->wait(); } @@ -219,6 +209,4 @@ XBT_PRIVATE ContextFactory* thread_factory() XBT_VERB("Activating thread context factory"); return new ThreadContextFactory(); } -} // namespace context -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::context