forked from Minki/linux
perf trace: Improve event processing exit
We need to differentiate SIGCHLD from SIGINT, the later should cause as immediate as possible exit, while the former should wait to process the events that may be perceived in the ring buffer after the SIGCHLD is handled. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-vf6n57ewm3mjy2sz6r491hus@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
c522739d72
commit
ba209f8563
@ -1098,10 +1098,12 @@ static size_t trace__fprintf_tstamp(struct trace *trace, u64 tstamp, FILE *fp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool done = false;
|
static bool done = false;
|
||||||
|
static bool interrupted = false;
|
||||||
|
|
||||||
static void sig_handler(int sig __maybe_unused)
|
static void sig_handler(int sig)
|
||||||
{
|
{
|
||||||
done = true;
|
done = true;
|
||||||
|
interrupted = sig == SIGINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
|
static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
|
||||||
@ -1771,24 +1773,23 @@ again:
|
|||||||
handler = evsel->handler.func;
|
handler = evsel->handler.func;
|
||||||
handler(trace, evsel, &sample);
|
handler(trace, evsel, &sample);
|
||||||
|
|
||||||
if (done)
|
if (interrupted)
|
||||||
goto out_unmap_evlist;
|
goto out_disable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trace->nr_events == before) {
|
if (trace->nr_events == before) {
|
||||||
if (done)
|
int timeout = done ? 100 : -1;
|
||||||
goto out_unmap_evlist;
|
|
||||||
|
|
||||||
poll(evlist->pollfd, evlist->nr_fds, -1);
|
if (poll(evlist->pollfd, evlist->nr_fds, timeout) > 0)
|
||||||
|
goto again;
|
||||||
|
} else {
|
||||||
|
goto again;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (done)
|
out_disable:
|
||||||
perf_evlist__disable(evlist);
|
perf_evlist__disable(evlist);
|
||||||
else
|
|
||||||
goto again;
|
|
||||||
|
|
||||||
out_unmap_evlist:
|
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (trace->summary)
|
if (trace->summary)
|
||||||
trace__fprintf_thread_summary(trace, trace->output);
|
trace__fprintf_thread_summary(trace, trace->output);
|
||||||
|
Loading…
Reference in New Issue
Block a user