X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cc834a41aa246f3067a49b5b2ed0da23128c497c..3e8cbdbebfce89fb0abf0cb8710c8505e111d097:/src/kernel/EngineImpl.cpp diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index 4a41dd014e..e769b07410 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2016-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. */ @@ -22,9 +22,7 @@ #include "xbt/xbt_modinter.h" /* whether initialization was already done */ #include -#ifndef _WIN32 #include -#endif /* _WIN32 */ #if SIMGRID_HAVE_MC #include "src/mc/remote/AppSide.hpp" @@ -68,7 +66,7 @@ static inline std::string contexts_list() } static config::Flag context_factory_name("contexts/factory", - (std::string("Possible values: ") + contexts_list()).c_str(), + ("Possible values: " + contexts_list()).c_str(), context_factories.begin()->first); } // namespace simgrid::kernel @@ -85,7 +83,6 @@ XBT_ATTRIB_NORETURN static void inthandler(int) exit(1); } -#ifndef _WIN32 static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/) { if ((siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) || siginfo->si_signo == SIGBUS) { @@ -118,46 +115,29 @@ static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/) std::raise(signum); } -/** - * Install signal handler for SIGSEGV. Check that nobody has already installed - * its own handler. For example, the Java VM does this. - */ -static void install_segvhandler() +static void install_signal_handlers() { - stack_t old_stack; + /* Install signal handler for SIGINT */ + std::signal(SIGINT, inthandler); - if (simgrid::kernel::context::Context::install_sigsegv_stack(&old_stack, true) == -1) { + /* Install signal handler for SIGSEGV */ + if (simgrid::kernel::context::Context::install_sigsegv_stack(true) == -1) { XBT_WARN("Failed to register alternate signal stack: %s", strerror(errno)); return; } - if (not(old_stack.ss_flags & SS_DISABLE)) { - XBT_DEBUG("An alternate stack was already installed (sp=%p, size=%zu, flags=%x). Restore it.", old_stack.ss_sp, - old_stack.ss_size, (unsigned)old_stack.ss_flags); - sigaltstack(&old_stack, nullptr); - } struct sigaction action; - struct sigaction old_action; action.sa_sigaction = &segvhandler; action.sa_flags = SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; sigemptyset(&action.sa_mask); /* Linux tend to raise only SIGSEGV where other systems also raise SIGBUS on severe error */ for (int sig : {SIGSEGV, SIGBUS}) { - if (sigaction(sig, &action, &old_action) == -1) { + if (sigaction(sig, &action, nullptr) == -1) XBT_WARN("Failed to register signal handler for signal %d: %s", sig, strerror(errno)); - continue; - } - if ((old_action.sa_flags & SA_SIGINFO) || old_action.sa_handler != SIG_DFL) { - XBT_DEBUG("A signal handler was already installed for signal %d (%p). Restore it.", sig, - (old_action.sa_flags & SA_SIGINFO) ? (void*)old_action.sa_sigaction : (void*)old_action.sa_handler); - sigaction(sig, &old_action, nullptr); - } } } -#endif /* _WIN32 */ - namespace simgrid::kernel { EngineImpl::~EngineImpl() @@ -202,15 +182,9 @@ void EngineImpl::initialize(int* argc, char** argv) instance_->context_mod_init(); - /* Prepare to display some more info when dying on Ctrl-C pressing */ - std::signal(SIGINT, inthandler); - -#ifndef _WIN32 - install_segvhandler(); -#endif + install_signal_handlers(); /* register a function to be called by SURF after the environment creation */ - sg_platf_init(); s4u::Engine::on_platform_created_cb([this]() { this->presolve(); }); if (config::get_value("debug/clean-atexit")) @@ -238,11 +212,6 @@ void EngineImpl::context_mod_init() const } #endif - /* select the context factory to use to create the contexts */ - if (context::ContextFactory::initializer) { // Give Java a chance to hijack the factory mechanism - instance_->set_context_factory(context::ContextFactory::initializer()); - return; - } /* use the factory specified by --cfg=contexts/factory:value */ for (auto const& [factory_name, factory] : context_factories) if (context_factory_name == factory_name) { @@ -268,7 +237,7 @@ void EngineImpl::context_mod_init() const XBT_ERROR(" (boost was disabled at compilation time on this machine -- check configure logs for details. Did you " "install the libboost-context-dev package?)"); #endif - XBT_ERROR(" thread: slow portability layer using pthreads as provided by gcc"); + XBT_ERROR(" thread: slow portability layer using standard threads as provided by libstdc"); xbt_die("Please use a valid factory."); } } @@ -302,7 +271,7 @@ void EngineImpl::shutdown() } tmgr_finalize(); - sg_platf_exit(); + sg_platf_parser_finalize(); delete instance_; instance_ = nullptr; @@ -324,9 +293,6 @@ void EngineImpl::load_platform(const std::string& platf) { double start = xbt_os_time(); if (boost::algorithm::ends_with(platf, ".so") || boost::algorithm::ends_with(platf, ".dylib")) { -#ifdef _WIN32 - xbt_die("loading platform through shared library isn't supported on windows"); -#else void* handle = dlopen(platf.c_str(), RTLD_LAZY); xbt_assert(handle, "Impossible to open platform file: %s", platf.c_str()); platf_handle_ = std::unique_ptr>(handle, dlclose); @@ -335,7 +301,6 @@ void EngineImpl::load_platform(const std::string& platf) const char* dlsym_error = dlerror(); xbt_assert(not dlsym_error, "Error: %s", dlsym_error); callable(*simgrid::s4u::Engine::get_instance()); -#endif /* _WIN32 */ } else { parse_platform_file(platf); } @@ -346,8 +311,7 @@ void EngineImpl::load_platform(const std::string& platf) void EngineImpl::load_deployment(const std::string& file) const { - sg_platf_exit(); - sg_platf_init(); + sg_platf_parser_finalize(); surf_parse_open(file); surf_parse();