perf tools: Make stat/record print fatal signals of the target program
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / tools / perf / builtin-record.c
index 6b0519f885e4ecc436e9344a3c2f94865eafbd92..042117f8fffa3a3ef949237bf7ebcbebc974386a 100644 (file)
@@ -73,6 +73,7 @@ static off_t                  post_processing_offset;
 
 static struct perf_session     *session;
 static const char              *cpu_list;
+static const char               *progname;
 
 static void advance_output(size_t size)
 {
@@ -137,17 +138,29 @@ static void mmap_read(struct perf_mmap *md)
 
 static volatile int done = 0;
 static volatile int signr = -1;
+static volatile int child_finished = 0;
 
 static void sig_handler(int sig)
 {
+       if (sig == SIGCHLD)
+               child_finished = 1;
+
        done = 1;
        signr = sig;
 }
 
 static void sig_atexit(void)
 {
-       if (child_pid > 0)
-               kill(child_pid, SIGTERM);
+       int status;
+
+       if (child_pid > 0) {
+               if (!child_finished)
+                       kill(child_pid, SIGTERM);
+
+               wait(&status);
+               if (WIFSIGNALED(status))
+                       psignal(WTERMSIG(status), progname);
+       }
 
        if (signr == -1 || signr == SIGUSR1)
                return;
@@ -445,6 +458,8 @@ static int __cmd_record(int argc, const char **argv)
        char buf;
        struct machine *machine;
 
+       progname = argv[0];
+
        page_size = sysconf(_SC_PAGE_SIZE);
 
        atexit(sig_atexit);