Currently report and stat catch SIGINT (and others) without altering
their exit state. This means that things like:
   while :; do perf stat ./foo ; done
Loops become hard-to-interrupt, because bash never sees perf terminate
due to interruption. Fix this.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
 }
 
 static volatile int done = 0;
+static volatile int signr = -1;
 
 static void sig_handler(int sig)
 {
        done = 1;
+       signr = sig;
+}
+
+static void sig_atexit(void)
+{
+       if (signr == -1)
+               return;
+
+       signal(signr, SIG_DFL);
+       kill(getpid(), signr);
 }
 
 static void pid_synthesize_comm_event(pid_t pid, int full)
        } else for (i = 0; i < nr_cpus; i++)
                open_counters(i, target_pid);
 
+       atexit(sig_atexit);
        signal(SIGCHLD, sig_handler);
        signal(SIGINT, sig_handler);
 
 
        return 0;
 }
 
+static volatile int signr = -1;
+
 static void skip_signal(int signo)
 {
+       signr = signo;
+}
+
+static void sig_atexit(void)
+{
+       if (signr == -1)
+               return;
+
+       signal(signr, SIG_DFL);
+       kill(getpid(), signr);
 }
 
 static const char * const stat_usage[] = {
         * What we want is for Ctrl-C to work in the exec()-ed
         * task, but being ignored by perf stat itself:
         */
+       atexit(sig_atexit);
        signal(SIGINT,  skip_signal);
        signal(SIGALRM, skip_signal);
        signal(SIGABRT, skip_signal);