Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix some doxygen warnings.
[simgrid.git] / src / simix / smx_global.cpp
index 37ebaba..bf34320 100644 (file)
@@ -29,6 +29,7 @@
 #endif
 
 #include <boost/heap/fibonacci_heap.hpp>
+#include <csignal>
 
 XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, "Logging specific to SIMIX (kernel)");
@@ -95,7 +96,7 @@ static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/)
     }
 #endif /* HAVE_SMPI */
   }
-  raise(signum);
+  std::raise(signum);
 }
 
 char sigsegv_stack[SIGSTKSZ];   /* alternate stack for SIGSEGV handler */
@@ -158,6 +159,8 @@ namespace simix {
 
 simgrid::xbt::signal<void()> onDeadlock;
 
+simgrid::config::Flag<double> breakpoint{"simix/breakpoint",
+                                         "When non-negative, raise a SIGTRAP after given (simulated) time", -1.0};
 }
 }
 
@@ -198,7 +201,7 @@ void SIMIX_global_init(int *argc, char **argv)
     simgrid::kernel::actor::create_maestro(maestro_code);
 
     /* Prepare to display some more info when dying on Ctrl-C pressing */
-    signal(SIGINT, inthandler);
+    std::signal(SIGINT, inthandler);
 
 #ifndef _WIN32
     install_segvhandler();
@@ -395,6 +398,16 @@ void SIMIX_run()
   do {
     XBT_DEBUG("New Schedule Round; size(queue)=%zu", simix_global->process_to_run.size());
 
+    if (simgrid::simix::breakpoint >= 0.0 && time >= simgrid::simix::breakpoint) {
+      XBT_DEBUG("Breakpoint reached (%g)", simgrid::simix::breakpoint.get());
+      simgrid::simix::breakpoint = -1.0;
+#ifdef SIGTRAP
+      std::raise(SIGTRAP);
+#else
+      std::raise(SIGABRT);
+#endif
+    }
+
     SIMIX_execute_tasks();
 
     while (not simix_global->process_to_run.empty()) {