X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7ef49c428ab0209965a09a36ab28b59789aaa4b5..8777fcefb063df4a6c7c04f045c82e5eef400a11:/src/simix/smx_global.cpp diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index 376c1b9177..0644ac793b 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -6,26 +6,27 @@ #include #include -#include /* Signal handling */ -#include #include "src/internal_config.h" +#include /* Signal handling */ +#include +#include #include #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" +#include "smx_private.hpp" #include "src/surf/surf_interface.hpp" #include "src/surf/xml/platf.hpp" -#include "smx_private.h" -#include "xbt/ex.h" /* ex_backtrace_display */ +#include "xbt/ex.h" /* ex_backtrace_display */ #include "mc/mc.h" #include "simgrid/sg_config.h" #include "src/mc/mc_replay.h" #include "src/surf/StorageImpl.hpp" -#include "src/smpi/smpi_process.hpp" +#include "src/smpi/include/smpi_process.hpp" #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/activity/ExecImpl.hpp" @@ -34,16 +35,15 @@ #include "src/kernel/activity/SynchroRaw.hpp" #if SIMGRID_HAVE_MC -#include "src/mc/mc_private.h" +#include "src/mc/mc_private.hpp" #include "src/mc/remote/Client.hpp" #include "src/mc/remote/mc_protocol.h" -#include #endif -#include "src/mc/mc_record.h" +#include "src/mc/mc_record.hpp" #if HAVE_SMPI -#include "src/smpi/private.h" +#include "src/smpi/include/private.hpp" #endif XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); @@ -53,18 +53,20 @@ std::unique_ptr simix_global; static xbt_heap_t simix_timers = nullptr; /** @brief Timer datatype */ -typedef struct s_smx_timer { +class s_smx_timer_t { double date = 0.0; - simgrid::xbt::Task callback; + s_smx_timer_t() = default; - s_smx_timer()=default; - s_smx_timer(double date, simgrid::xbt::Task callback) : date(date), callback(std::move(callback)) {} -} s_smx_timer_t; +public: + simgrid::xbt::Task callback; + double getDate() { return date; } + s_smx_timer_t(double date, simgrid::xbt::Task callback) : date(date), callback(std::move(callback)) {} +}; void (*SMPI_switch_data_segment)(int) = nullptr; int _sg_do_verbose_exit = 1; -static void inthandler(int ignored) +static void inthandler(int) { if ( _sg_do_verbose_exit ) { XBT_INFO("CTRL-C pressed. The current status will be displayed before exit (disable that behavior with option 'verbose-exit')."); @@ -77,13 +79,13 @@ static void inthandler(int ignored) } #ifndef _WIN32 -static void segvhandler(int signum, siginfo_t *siginfo, void *context) +static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/) { if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) { fprintf(stderr, "Access violation detected.\n" "This probably comes from a programming error in your code, or from a stack\n" "overflow. If you are certain of your code, try increasing the stack size\n" - " --cfg=contexts/stack-size=XXX (current size is %d KiB).\n" + " --cfg=contexts/stack-size=XXX (current size is %u KiB).\n" "\n" "If it does not help, this may have one of the following causes:\n" "a bug in SimGrid, a bug in the OS or a bug in a third-party libraries.\n" @@ -127,8 +129,8 @@ static void install_segvhandler() return; } if (not(old_stack.ss_flags & SS_DISABLE)) { - XBT_DEBUG("An alternate stack was already installed (sp=%p, size=%zd, flags=%x). Restore it.", - old_stack.ss_sp, old_stack.ss_size, old_stack.ss_flags); + 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); } @@ -204,8 +206,6 @@ void SIMIX_global_init(int *argc, char **argv) simix_global = std::unique_ptr(new simgrid::simix::Global()); simgrid::simix::ActorImpl proc; - simix_global->process_to_run = xbt_dynar_new(sizeof(smx_actor_t), nullptr); - simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_actor_t), nullptr); simix_global->process_to_destroy = xbt_swag_new(xbt_swag_offset(proc, destroy_hookup)); simix_global->maestro_process = nullptr; simix_global->create_process_function = &SIMIX_process_create; @@ -235,8 +235,8 @@ void SIMIX_global_init(int *argc, char **argv) }); simgrid::surf::storageCreatedCallbacks.connect([](simgrid::surf::StorageImpl* storage) { - sg_storage_t s = simgrid::s4u::Storage::byName(storage->cname()); - xbt_assert(s != nullptr, "Storage not found for name %s", storage->cname()); + sg_storage_t s = simgrid::s4u::Storage::byName(storage->getCname()); + xbt_assert(s != nullptr, "Storage not found for name %s", storage->getCname()); }); } @@ -264,6 +264,15 @@ void SIMIX_clean() if (smx_cleaned) return; // to avoid double cleaning by java and C + smx_cleaned = 1; + XBT_DEBUG("SIMIX_clean called. Simulation's over."); + if (not simix_global->process_to_run.empty() && SIMIX_get_clock() <= 0.0) { + XBT_CRITICAL(" "); + XBT_CRITICAL("The time is still 0, and you still have processes ready to run."); + XBT_CRITICAL("It seems that you forgot to run the simulation that you setup."); + xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code."); + } + #if HAVE_SMPI if (SIMIX_process_count()>0){ if(smpi_process()->initialized()){ @@ -275,16 +284,10 @@ void SIMIX_clean() } #endif - smx_cleaned = 1; - XBT_DEBUG("SIMIX_clean called. Simulation's over."); - if (not xbt_dynar_is_empty(simix_global->process_to_run) && SIMIX_get_clock() <= 0.0) { - XBT_CRITICAL(" "); - XBT_CRITICAL("The time is still 0, and you still have processes ready to run."); - XBT_CRITICAL("It seems that you forgot to run the simulation that you setup."); - xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code."); - } /* Kill all processes (but maestro) */ SIMIX_process_killall(simix_global->maestro_process, 1); + SIMIX_context_runall(); + SIMIX_process_empty_trash(); /* Exit the SIMIX network module */ SIMIX_mailbox_exit(); @@ -292,8 +295,8 @@ void SIMIX_clean() xbt_heap_free(simix_timers); simix_timers = nullptr; /* Free the remaining data structures */ - xbt_dynar_free(&simix_global->process_to_run); - xbt_dynar_free(&simix_global->process_that_ran); + simix_global->process_to_run.clear(); + simix_global->process_that_ran.clear(); xbt_swag_free(simix_global->process_to_destroy); simix_global->process_list.clear(); simix_global->process_to_destroy = nullptr; @@ -334,25 +337,12 @@ double SIMIX_get_clock() } } -static int process_syscall_color(void *p) -{ - switch ((*(smx_actor_t *)p)->simcall.call) { - case SIMCALL_NONE: - case SIMCALL_PROCESS_KILL: - return 2; - // case SIMCALL_PROCESS_RESUME: - // return 1; - default: - return 0; - } -} - /** Wake up all processes waiting for a Surf action to finish */ static void SIMIX_wake_processes() { surf_action_t action; - for(auto model : *all_existing_models) { + for (auto const& model : *all_existing_models) { XBT_DEBUG("Handling the processes whose action failed (if any)"); while ((action = surf_model_extract_failed_action_set(model))) { XBT_DEBUG(" Handling Action %p",action); @@ -429,19 +419,16 @@ void SIMIX_run() double time = 0; do { - XBT_DEBUG("New Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); + XBT_DEBUG("New Schedule Round; size(queue)=%zu", simix_global->process_to_run.size()); SIMIX_execute_tasks(); - while (not xbt_dynar_is_empty(simix_global->process_to_run)) { - XBT_DEBUG("New Sub-Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); + while (not simix_global->process_to_run.empty()) { + XBT_DEBUG("New Sub-Schedule Round; size(queue)=%zu", simix_global->process_to_run.size()); /* Run all processes that are ready to run, possibly in parallel */ SIMIX_process_runall(); - /* Move all killer processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */ - xbt_dynar_three_way_partition(simix_global->process_that_ran, process_syscall_color); - /* answer sequentially and in a fixed arbitrary order all the simcalls that were issued during that sub-round */ /* WARNING, the order *must* be fixed or you'll jeopardize the simulation reproducibility (see RR-7653) */ @@ -497,9 +484,7 @@ void SIMIX_run() * That would thus be a pure waste of time. */ - unsigned int iter; - smx_actor_t process; - xbt_dynar_foreach(simix_global->process_that_ran, iter, process) { + for (smx_actor_t const& process : simix_global->process_that_ran) { if (process->simcall.call != SIMCALL_NONE) { SIMIX_simcall_handle(&process->simcall, 0); } @@ -512,14 +497,14 @@ void SIMIX_run() /* If only daemon processes remain, cancel their actions, mark them to die and reschedule them */ if (simix_global->process_list.size() == simix_global->daemons.size()) - for (const auto& dmon : simix_global->daemons) { - XBT_DEBUG("Kill %s", dmon->cname()); + for (auto const& dmon : simix_global->daemons) { + XBT_DEBUG("Kill %s", dmon->getCname()); SIMIX_process_kill(dmon, simix_global->maestro_process); } } time = SIMIX_timer_next(); - if (time > -1.0 || simix_global->process_list.empty() == false) { + if (time > -1.0 || not simix_global->process_list.empty()) { XBT_DEBUG("Calling surf_solve"); time = surf_solve(time); XBT_DEBUG("Moving time ahead : %g", time); @@ -539,7 +524,7 @@ void SIMIX_run() } while (again); /* Autorestart all process */ - for (auto host: host_that_restart) { + for (auto const& host : host_that_restart) { XBT_INFO("Restart processes on host %s", host->getCname()); SIMIX_host_autorestart(host); } @@ -548,15 +533,15 @@ void SIMIX_run() /* Clean processes to destroy */ SIMIX_process_empty_trash(); - XBT_DEBUG("### time %f, #processes %zu, #to_run %lu", time, simix_global->process_list.size(), - xbt_dynar_length(simix_global->process_to_run)); + XBT_DEBUG("### time %f, #processes %zu, #to_run %zu", time, simix_global->process_list.size(), + simix_global->process_to_run.size()); - if (xbt_dynar_is_empty(simix_global->process_to_run) && not simix_global->process_list.empty()) + if (simix_global->process_to_run.empty() && not simix_global->process_list.empty()) simgrid::simix::onDeadlock(); - } while (time > -1.0 || not xbt_dynar_is_empty(simix_global->process_to_run)); + } while (time > -1.0 || not simix_global->process_to_run.empty()); - if (simix_global->process_list.size() != 0) { + if (not simix_global->process_list.empty()) { TRACE_end(); @@ -578,7 +563,7 @@ void SIMIX_run() */ smx_timer_t SIMIX_timer_set(double date, void (*callback)(void*), void *arg) { - smx_timer_t timer = new s_smx_timer_t(date, [=](){ callback(arg); }); + smx_timer_t timer = new s_smx_timer_t(date, [callback, arg]() { callback(arg); }); xbt_heap_push(simix_timers, timer, date); return timer; } @@ -592,12 +577,12 @@ smx_timer_t SIMIX_timer_set(double date, simgrid::xbt::Task callback) /** @brief cancels a timer that was added earlier */ void SIMIX_timer_remove(smx_timer_t timer) { - xbt_heap_rm_elm(simix_timers, timer, timer->date); + delete static_cast(xbt_heap_rm_elm(simix_timers, timer, timer->getDate())); } /** @brief Returns the date at which the timer will trigger (or 0 if nullptr timer) */ double SIMIX_timer_get_date(smx_timer_t timer) { - return timer?timer->date:0; + return timer ? timer->getDate() : 0; } /** @@ -646,7 +631,7 @@ void SIMIX_display_process_status() XBT_INFO("%d processes are still running, waiting for something.", nbprocess); /* List the process and their state */ XBT_INFO("Legend of the following listing: \"Process (@): \""); - for (auto kv : simix_global->process_list) { + for (auto const& kv : simix_global->process_list) { smx_actor_t process = kv.second; if (process->waiting_synchro) { @@ -668,24 +653,12 @@ void SIMIX_display_process_status() if (boost::dynamic_pointer_cast(process->waiting_synchro) != nullptr) synchro_description = "I/O"; - - /* - switch (process->waiting_synchro->type) { - case SIMIX_SYNC_PARALLEL_EXECUTE: - synchro_description = "parallel execution"; - break; - - case SIMIX_SYNC_JOIN: - synchro_description = "joining"; - break; -*/ - XBT_INFO("Process %lu (%s@%s): waiting for %s synchro %p (%s) in state %d to finish", process->pid, - process->cname(), process->host->getCname(), synchro_description, process->waiting_synchro.get(), + process->getCname(), process->host->getCname(), synchro_description, process->waiting_synchro.get(), process->waiting_synchro->name.c_str(), (int)process->waiting_synchro->state); } else { - XBT_INFO("Process %lu (%s@%s)", process->pid, process->cname(), process->host->getCname()); + XBT_INFO("Process %lu (%s@%s)", process->pid, process->getCname(), process->host->getCname()); } } }