X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3ed26c1bad5a748ee8a9601b60cfd1bd3e6cc161..ec1ff601331bbc2a69a3d7501f468e2238be2a5e:/src/simix/smx_global.cpp diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index be74fbf712..856ccc8c49 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -4,47 +4,38 @@ /* 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. */ +#include /* Signal handling */ #include -#include "src/portable.h" -#ifdef HAVE_SYS_PTRACE_H -# include -# include -#endif +#include "src/internal_config.h" #include "src/surf/surf_interface.hpp" +#include "src/surf/storage_interface.hpp" +#include "src/surf/xml/platf.hpp" #include "smx_private.h" #include "smx_private.hpp" -#include "xbt/heap.h" -#include "xbt/sysdep.h" -#include "xbt/log.h" #include "xbt/str.h" #include "xbt/ex.h" /* ex_backtrace_display */ #include "mc/mc.h" #include "src/mc/mc_replay.h" #include "simgrid/sg_config.h" -#include "src/surf/callbacks.h" - -#ifdef HAVE_MC +#if HAVE_MC #include "src/mc/mc_private.h" #include "src/mc/mc_protocol.h" -#include "src/mc/mc_client.h" -#endif +#include "src/mc/Client.hpp" -#ifdef HAVE_MC #include #include "src/mc/mc_protocol.h" #endif #include "src/mc/mc_record.h" -#ifdef HAVE_SMPI +#if HAVE_SMPI #include "src/smpi/private.h" #endif XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, - "Logging specific to SIMIX (kernel)"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, "Logging specific to SIMIX (kernel)"); smx_global_t simix_global = NULL; static xbt_heap_t simix_timers = NULL; @@ -62,11 +53,9 @@ static void* SIMIX_synchro_mallocator_new_f(void); static void SIMIX_synchro_mallocator_free_f(void* synchro); static void SIMIX_synchro_mallocator_reset_f(void* synchro); -/* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */ -#include int _sg_do_verbose_exit = 1; -static void _XBT_CALL inthandler(int ignored) +static void inthandler(int ignored) { 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')."); @@ -78,8 +67,8 @@ static void _XBT_CALL inthandler(int ignored) exit(1); } -#ifndef WIN32 -static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context) +#ifndef _WIN32 +static void segvhandler(int signum, siginfo_t *siginfo, void *context) { if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) { fprintf(stderr, @@ -98,12 +87,17 @@ static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context) } } else if (siginfo->si_signo == SIGSEGV) { fprintf(stderr, "Segmentation fault.\n"); -#ifdef HAVE_SMPI +#if HAVE_SMPI if (smpi_enabled() && !smpi_privatize_global_variables) { +#if HAVE_PRIVATIZATION fprintf(stderr, - "Try to enable SMPI variable privatization with --cfg=smpi/privatize_global_variables:yes.\n"); + "Try to enable SMPI variable privatization with --cfg=smpi/privatize-global-variables:yes.\n"); +#else + fprintf(stderr, + "Sadly, your system does not support --cfg=smpi/privatize-global-variables:yes (yet).\n"); +#endif /* HAVE_PRIVATIZATION */ } -#endif +#endif /* HAVE_SMPI */ } raise(signum); } @@ -122,8 +116,7 @@ static void install_segvhandler(void) stack.ss_flags = 0; if (sigaltstack(&stack, &old_stack) == -1) { - XBT_WARN("Failed to register alternate signal stack: %s", - strerror(errno)); + XBT_WARN("Failed to register alternate signal stack: %s", strerror(errno)); return; } if (!(old_stack.ss_flags & SS_DISABLE)) { @@ -138,8 +131,7 @@ static void install_segvhandler(void) sigemptyset(&action.sa_mask); if (sigaction(SIGSEGV, &action, &old_action) == -1) { - XBT_WARN("Failed to register signal handler for SIGSEGV: %s", - strerror(errno)); + XBT_WARN("Failed to register signal handler for SIGSEGV: %s", strerror(errno)); return; } if ((old_action.sa_flags & SA_SIGINFO) || old_action.sa_handler != SIG_DFL) { @@ -150,9 +142,9 @@ static void install_segvhandler(void) } } -#endif -/********************************* SIMIX **************************************/ +#endif /* _WIN32 */ +/********************************* SIMIX **************************************/ double SIMIX_timer_next(void) { return xbt_heap_size(simix_timers) > 0 ? xbt_heap_maxkey(simix_timers) : -1.0; @@ -163,10 +155,22 @@ static void kill_process(smx_process_t process) SIMIX_process_kill(process, NULL); } -static void SIMIX_storage_create_(smx_storage_t storage) +static std::function maestro_code; + +namespace simgrid { +namespace simix { + +XBT_PUBLIC(void) set_maestro(std::function code) +{ + maestro_code = std::move(code); +} + +} +} + +void SIMIX_set_maestro(void (*code)(void*), void* data) { - const char* key = xbt_dict_get_elm_key(storage); - SIMIX_storage_create(key, storage, NULL); + maestro_code = std::bind(code, data); } /** @@ -178,8 +182,10 @@ static void SIMIX_storage_create_(smx_storage_t storage) */ void SIMIX_global_init(int *argc, char **argv) { -#ifdef HAVE_MC - _sg_do_model_check = getenv(MC_ENV_VARIABLE) != NULL; +#if HAVE_MC + // The communication initialization is done ASAP. + // We need to communicate initialization of the different layers to the model-checker. + simgrid::mc::Client::initialize(); #endif s_smx_process_t proc; @@ -187,17 +193,10 @@ void SIMIX_global_init(int *argc, char **argv) if (!simix_global) { simix_global = xbt_new0(s_smx_global_t, 1); -#ifdef TIME_BENCH_AMDAHL - simix_global->timer_seq = xbt_os_timer_new(); - simix_global->timer_par = xbt_os_timer_new(); - xbt_os_cputimer_start(simix_global->timer_seq); -#endif simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL); simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL); - simix_global->process_list = - xbt_swag_new(xbt_swag_offset(proc, process_hookup)); - simix_global->process_to_destroy = - xbt_swag_new(xbt_swag_offset(proc, destroy_hookup)); + simix_global->process_list = xbt_swag_new(xbt_swag_offset(proc, process_hookup)); + simix_global->process_to_destroy = xbt_swag_new(xbt_swag_offset(proc, destroy_hookup)); simix_global->maestro_process = NULL; simix_global->registered_functions = xbt_dict_new_homogeneous(NULL); @@ -208,48 +207,51 @@ void SIMIX_global_init(int *argc, char **argv) simix_global->synchro_mallocator = xbt_mallocator_new(65536, SIMIX_synchro_mallocator_new_f, SIMIX_synchro_mallocator_free_f, SIMIX_synchro_mallocator_reset_f); - simix_global->autorestart = SIMIX_host_restart_processes; simix_global->mutex = xbt_os_mutex_init(); surf_init(argc, argv); /* Initialize SURF structures */ SIMIX_context_mod_init(); - SIMIX_create_maestro_process(); + + // Either create a new context with maestro or create + // a context object with the current context mestro): + simgrid::simix::create_maestro(maestro_code); /* context exception handlers */ __xbt_running_ctx_fetch = SIMIX_process_get_running_context; __xbt_ex_terminate = SIMIX_process_exception_terminate; - SIMIX_network_init(); - /* Prepare to display some more info when dying on Ctrl-C pressing */ signal(SIGINT, inthandler); -#ifndef WIN32 - /* Install SEGV handler */ +#ifndef _WIN32 install_segvhandler(); #endif /* register a function to be called by SURF after the environment creation */ sg_platf_init(); - sg_platf_postparse_add_cb(SIMIX_post_create_environment); - surf_on_host_created(SIMIX_host_create); - surf_on_storage_created(SIMIX_storage_create_); - + simgrid::surf::on_postparse.connect(SIMIX_post_create_environment); + simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) { + SIMIX_host_create(&host); + }); + SIMIX_HOST_LEVEL = simgrid::s4u::Host::extension_create(SIMIX_host_destroy); + + simgrid::surf::storageCreatedCallbacks.connect([](simgrid::surf::Storage* storage) { + const char* name = storage->getName(); + // TODO, create sg_storage_by_name + sg_storage_t s = xbt_lib_get_elm_or_null(storage_lib, name); + xbt_assert(s != NULL, "Storage not found for name %s", name); + + SIMIX_storage_create(name, s, NULL); + }); + + SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy); } if (!simix_timers) { simix_timers = xbt_heap_new(8, &free); } - SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy); - - if (sg_cfg_get_boolean("clean_atexit")) + if (xbt_cfg_get_boolean("clean-atexit")) atexit(SIMIX_clean); -#ifdef HAVE_MC - // The communication initialization is done ASAP. - // We need to communicate initialization of the different layers to the model-checker. - MC_client_init(); -#endif - if (_sg_cfg_exit_asap) exit(0); } @@ -263,23 +265,20 @@ int smx_cleaned = 0; */ void SIMIX_clean(void) { -#ifdef TIME_BENCH_PER_SR - smx_ctx_raw_new_sr(); -#endif if (smx_cleaned) return; // to avoid double cleaning by java and C smx_cleaned = 1; XBT_DEBUG("SIMIX_clean called. Simulation's over."); if (!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."); + 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); /* Exit the SIMIX network module */ - SIMIX_network_exit(); + SIMIX_mailbox_exit(); xbt_heap_free(simix_timers); simix_timers = NULL; @@ -310,15 +309,6 @@ void SIMIX_clean(void) surf_exit(); -#ifdef TIME_BENCH_AMDAHL - xbt_os_cputimer_stop(simix_global->timer_seq); - XBT_INFO("Amdahl timing informations. Sequential time: %f; Parallel time: %f", - xbt_os_timer_elapsed(simix_global->timer_seq), - xbt_os_timer_elapsed(simix_global->timer_par)); - xbt_os_timer_free(simix_global->timer_seq); - xbt_os_timer_free(simix_global->timer_par); -#endif - xbt_mallocator_free(simix_global->synchro_mallocator); xbt_free(simix_global); simix_global = NULL; @@ -361,9 +351,8 @@ static int process_syscall_color(void *p) */ void SIMIX_run(void) { - if(MC_record_path) { - MC_record_replay_init(); - MC_record_replay_from_string(MC_record_path); + if (MC_record_path) { + simgrid::mc::replay(MC_record_path); return; } @@ -377,23 +366,12 @@ void SIMIX_run(void) do { XBT_DEBUG("New Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); -#ifdef TIME_BENCH_PER_SR - smx_ctx_raw_new_sr(); -#endif while (!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)); /* Run all processes that are ready to run, possibly in parallel */ -#ifdef TIME_BENCH_AMDAHL - xbt_os_cputimer_stop(simix_global->timer_seq); - xbt_os_cputimer_resume(simix_global->timer_par); -#endif SIMIX_process_runall(); -#ifdef TIME_BENCH_AMDAHL - xbt_os_cputimer_stop(simix_global->timer_par); - xbt_os_cputimer_resume(simix_global->timer_seq); -#endif /* 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); @@ -514,14 +492,12 @@ void SIMIX_run(void) } /* Autorestart all process */ - if(host_that_restart) { - char *hostname = NULL; - xbt_dynar_foreach(host_that_restart,iter,hostname) { - XBT_INFO("Restart processes on host: %s",hostname); - SIMIX_host_autorestart(sg_host_by_name(hostname)); - } - xbt_dynar_reset(host_that_restart); + char *hostname = NULL; + xbt_dynar_foreach(host_that_restart,iter,hostname) { + XBT_INFO("Restart processes on host: %s",hostname); + SIMIX_host_autorestart(sg_host_by_name(hostname)); } + xbt_dynar_reset(host_that_restart); /* Clean processes to destroy */ SIMIX_process_empty_trash(); @@ -533,7 +509,7 @@ void SIMIX_run(void) if (xbt_swag_size(simix_global->process_list) != 0) { - TRACE_end(); + TRACE_end(); XBT_CRITICAL("Oops ! Deadlock or code not perfectly clean."); SIMIX_display_process_status(); @@ -562,12 +538,12 @@ smx_timer_t SIMIX_timer_set(double date, void (*function)(void*), void *arg) } /** @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); + xbt_heap_rm_elm(simix_timers, timer, timer->date); } /** @brief Returns the date at which the timer will trigger (or 0 if NULL timer) */ double SIMIX_timer_get_date(smx_timer_t timer) { - return timer?timer->date:0; + return timer?timer->date:0; } /** @@ -702,5 +678,5 @@ xbt_dict_t SIMIX_asr_get_properties(const char *name) int SIMIX_is_maestro() { - return SIMIX_process_self() == simix_global->maestro_process; -} \ No newline at end of file + return simix_global==NULL /*SimDag*/|| SIMIX_process_self() == simix_global->maestro_process; +}