X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/90a471de6cd70b41223dd16a09fafe6ac3e18269..f9c51ec738ba10666fb0b5c79b23fb19c80aaae7:/src/simix/smx_global.cpp diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index 90a9c486c0..bfb56d5f0f 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -80,14 +80,13 @@ static void inthandler(int ignored) 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 can result from a programming error in your code or, although less likely,\n" - "from a bug in SimGrid itself. This can also be the sign of a bug in the OS or\n" - "in third-party libraries. Failing hardware can sometimes generate such errors\n" - "too.\n" - "Finally, if nothing of the above applies, this can result from a stack overflow.\n" - "Try to increase stack size with --cfg=contexts/stack_size (current size is %d KiB).\n", + fprintf(stderr, "Access violation detected.\n" + "This can result from a programming error in your code or, although less likely,\n" + "from a bug in SimGrid itself. This can also be the sign of a bug in the OS or\n" + "in third-party libraries. Failing hardware can sometimes generate such errors\n" + "too.\n" + "Finally, if nothing of the above applies, this can result from a stack overflow.\n" + "Try to increase stack size with --cfg=contexts/stack-size (current size is %d KiB).\n", smx_context_stack_size / 1024); if (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_debug)) { fprintf(stderr, "siginfo = {si_signo = %d, si_errno = %d, si_code = %d, si_addr = %p}\n", @@ -155,7 +154,7 @@ double SIMIX_timer_next() return xbt_heap_size(simix_timers) > 0 ? xbt_heap_maxkey(simix_timers) : -1.0; } -static void kill_process(smx_process_t process) +static void kill_process(smx_actor_t process) { SIMIX_process_kill(process, nullptr); } @@ -165,6 +164,8 @@ static std::function maestro_code; namespace simgrid { namespace simix { +simgrid::xbt::signal onDeadlock; + XBT_PUBLIC(void) set_maestro(std::function code) { maestro_code = std::move(code); @@ -175,6 +176,9 @@ XBT_PUBLIC(void) set_maestro(std::function code) void SIMIX_set_maestro(void (*code)(void*), void* data) { +#ifdef _WIN32 + INFO("WARNING, SIMIX_set_maestro is believed to not work on windows. Please help us investigating this issue if you need that feature"); +#endif maestro_code = std::bind(code, data); } @@ -197,8 +201,8 @@ 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_process_t), nullptr); - simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), nullptr); + 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_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 = nullptr; @@ -224,9 +228,8 @@ void SIMIX_global_init(int *argc, char **argv) sg_platf_init(); simgrid::surf::on_postparse.connect(SIMIX_post_create_environment); simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) { - SIMIX_host_create(&host); + host.extension_set(new simgrid::simix::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(); @@ -334,7 +337,7 @@ double SIMIX_get_clock() static int process_syscall_color(void *p) { - switch ((*(smx_process_t *)p)->simcall.call) { + switch ((*(smx_actor_t *)p)->simcall.call) { case SIMCALL_NONE: case SIMCALL_PROCESS_KILL: return 2; @@ -425,7 +428,7 @@ void SIMIX_run() } double time = 0; - smx_process_t process; + smx_actor_t process; do { XBT_DEBUG("New Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); @@ -531,24 +534,26 @@ void SIMIX_run() } while (again); /* Autorestart all process */ - char *hostname = nullptr; - unsigned int iter; - xbt_dynar_foreach(host_that_restart,iter,hostname) { - XBT_INFO("Restart processes on host: %s",hostname); - SIMIX_host_autorestart(sg_host_by_name(hostname)); + for (auto host: host_that_restart) { + XBT_INFO("Restart processes on host: %s", sg_host_get_name(host)); + SIMIX_host_autorestart(host); } - xbt_dynar_reset(host_that_restart); + host_that_restart.clear(); /* Clean processes to destroy */ SIMIX_process_empty_trash(); XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run)); + if (xbt_dynar_is_empty(simix_global->process_to_run) && + xbt_swag_size(simix_global->process_list) != 0) + simgrid::simix::onDeadlock(); + } while (time > -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run)); 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(); @@ -634,7 +639,7 @@ void SIMIX_display_process_status() return; } - smx_process_t process = nullptr; + smx_actor_t process = nullptr; int nbprocess = xbt_swag_size(simix_global->process_list); XBT_INFO("%d processes are still running, waiting for something.", nbprocess);