Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
also save the cbps in SG, the same way I do in RL since a long time. I love calltree
[simgrid.git] / src / gras / gras.c
index 35b7980..28a5ead 100644 (file)
 #include "gras.h"
 #include "gras/process.h" /* FIXME: killme and put process_init in modinter */
 
-#include "portable.h" /* hexa_*() */
+#include "portable.h" /* hexa_*(); signalling stuff */
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras,XBT_LOG_ROOT_CAT,"All GRAS categories (cf. section \ref GRAS_API)");
 static int gras_running_process = 0;
 
+#if defined(HAVE_SIGNAL) && defined(HAVE_SIGNAL_H)
+static void gras_sigusr_handler(int sig) {
+   INFO0("SIGUSR1 received. Display the backtrace");
+   xbt_backtrace_display();
+}
+
+static void gras_sigint_handler(int sig) {
+   static double lastone = 0;
+   if (lastone == 0 || gras_os_time() - lastone > 5) {
+      lastone = gras_os_time();
+      xbt_backtrace_display();
+      fprintf(stderr,"\nBacktrace displayed because Ctrl-C was pressed. Press again (within 5 sec) to abort the process.\n");
+   } else {
+      exit(1);
+   }
+}
+#endif
+
 void gras_init(int *argc,char **argv) {
 
   VERB0("Initialize GRAS");
@@ -50,6 +68,10 @@ void gras_init(int *argc,char **argv) {
     gras_msg_init();
     gras_trp_init();
     gras_datadesc_init();
+#if defined(HAVE_SIGNAL) && defined(HAVE_SIGNAL_H)
+    signal(SIGUSR1,gras_sigusr_handler);
+    signal(SIGINT,gras_sigint_handler);
+#endif     
   }
 }