提交 ba209f85 编写于 作者: A Arnaldo Carvalho de Melo

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.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 c522739d
......@@ -1098,10 +1098,12 @@ static size_t trace__fprintf_tstamp(struct trace *trace, u64 tstamp, FILE *fp)
}
static bool done = false;
static bool interrupted = false;
static void sig_handler(int sig __maybe_unused)
static void sig_handler(int sig)
{
done = true;
interrupted = sig == SIGINT;
}
static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
......@@ -1771,24 +1773,23 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
handler = evsel->handler.func;
handler(trace, evsel, &sample);
if (done)
goto out_unmap_evlist;
if (interrupted)
goto out_disable;
}
}
if (trace->nr_events == before) {
if (done)
goto out_unmap_evlist;
int timeout = done ? 100 : -1;
poll(evlist->pollfd, evlist->nr_fds, -1);
if (poll(evlist->pollfd, evlist->nr_fds, timeout) > 0)
goto again;
} else {
goto again;
}
if (done)
perf_evlist__disable(evlist);
else
goto again;
out_disable:
perf_evlist__disable(evlist);
out_unmap_evlist:
if (!err) {
if (trace->summary)
trace__fprintf_thread_summary(trace, trace->output);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册