-/* Copyright (c) 2007-2015. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2007-2017. 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. */
"Minimal Working Example (MWE) reproducing your problem and a full backtrace\n"
"of the fault captured with gdb or valgrind.\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",
- siginfo->si_signo, siginfo->si_errno, siginfo->si_code, siginfo->si_addr);
- }
} else if (siginfo->si_signo == SIGSEGV) {
fprintf(stderr, "Segmentation fault.\n");
#if HAVE_SMPI
*/
static void install_segvhandler()
{
- stack_t stack, old_stack;
+ stack_t stack;
+ stack_t old_stack;
stack.ss_sp = sigsegv_stack;
stack.ss_size = sizeof sigsegv_stack;
stack.ss_flags = 0;
sigaltstack(&old_stack, nullptr);
}
- struct sigaction action, old_action;
+ struct sigaction action;
+ struct sigaction old_action;
action.sa_sigaction = &segvhandler;
action.sa_flags = SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
sigemptyset(&action.sa_mask);
});
simgrid::surf::storageCreatedCallbacks.connect([](simgrid::surf::Storage* storage) {
- const char* name = storage->getName();
+ const char* name = storage->cname();
// TODO, create sg_storage_by_name
sg_storage_t s = xbt_lib_get_elm_or_null(storage_lib, name);
xbt_assert(s != nullptr, "Storage not found for name %s", name);
#if HAVE_SMPI
if (SIMIX_process_count()>0){
- if(smpi_process_initialized()){
+ if(smpi_process()->initialized()){
xbt_die("Process exited without calling MPI_Finalize - Killing simulation");
}else{
XBT_WARN("Process called exit when leaving - Skipping cleanups");
/* Clean processes to destroy */
SIMIX_process_empty_trash();
- XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run));
+ XBT_DEBUG("### time %f, #processes %zu, #to_run %lu", time, simix_global->process_list.size(),
+ xbt_dynar_length(simix_global->process_to_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());
+ SIMIX_process_kill(dmon, simix_global->maestro_process);
+ }
if (xbt_dynar_is_empty(simix_global->process_to_run) &&
!simix_global->process_list.empty())