aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-record.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2013-10-15 10:27:33 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-10-21 16:33:24 -0400
commit6a4d98d787b38a130a67e78b64182b419899623a (patch)
treebd72dfaa6b4e93b0d304320dd373d0150724e29d /tools/perf/builtin-record.c
parentf5fc14124c5cefdd052a2b2a6a3f0ed531540113 (diff)
perf tools: Add perf_data_file__open interface to data object
Adding perf_data_file__open interface to data object to open the perf.data file for both read and write. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1381847254-28809-3-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r--tools/perf/builtin-record.c34
1 files changed, 1 insertions, 33 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 4ea46ffbfc1c..428e28f3e677 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -345,8 +345,6 @@ out:
345 345
346static int __cmd_record(struct perf_record *rec, int argc, const char **argv) 346static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
347{ 347{
348 struct stat st;
349 int flags;
350 int err, feat; 348 int err, feat;
351 unsigned long waking = 0; 349 unsigned long waking = 0;
352 const bool forks = argc > 0; 350 const bool forks = argc > 0;
@@ -355,7 +353,6 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
355 struct perf_record_opts *opts = &rec->opts; 353 struct perf_record_opts *opts = &rec->opts;
356 struct perf_evlist *evsel_list = rec->evlist; 354 struct perf_evlist *evsel_list = rec->evlist;
357 struct perf_data_file *file = &rec->file; 355 struct perf_data_file *file = &rec->file;
358 const char *output_name = file->path;
359 struct perf_session *session; 356 struct perf_session *session;
360 bool disabled = false; 357 bool disabled = false;
361 358
@@ -367,35 +364,6 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
367 signal(SIGUSR1, sig_handler); 364 signal(SIGUSR1, sig_handler);
368 signal(SIGTERM, sig_handler); 365 signal(SIGTERM, sig_handler);
369 366
370 if (!output_name) {
371 if (!fstat(STDOUT_FILENO, &st) && S_ISFIFO(st.st_mode))
372 file->is_pipe = true;
373 else
374 file->path = output_name = "perf.data";
375 }
376 if (output_name) {
377 if (!strcmp(output_name, "-"))
378 file->is_pipe = true;
379 else if (!stat(output_name, &st) && st.st_size) {
380 char oldname[PATH_MAX];
381 snprintf(oldname, sizeof(oldname), "%s.old",
382 output_name);
383 unlink(oldname);
384 rename(output_name, oldname);
385 }
386 }
387
388 flags = O_CREAT|O_RDWR|O_TRUNC;
389
390 if (file->is_pipe)
391 file->fd = STDOUT_FILENO;
392 else
393 file->fd = open(output_name, flags, S_IRUSR | S_IWUSR);
394 if (file->fd < 0) {
395 perror("failed to create output file");
396 return -1;
397 }
398
399 session = perf_session__new(file, false, NULL); 367 session = perf_session__new(file, false, NULL);
400 if (session == NULL) { 368 if (session == NULL) {
401 pr_err("Not enough memory for reading perf file header\n"); 369 pr_err("Not enough memory for reading perf file header\n");
@@ -586,7 +554,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
586 fprintf(stderr, 554 fprintf(stderr,
587 "[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n", 555 "[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
588 (double)rec->bytes_written / 1024.0 / 1024.0, 556 (double)rec->bytes_written / 1024.0 / 1024.0,
589 output_name, 557 file->path,
590 rec->bytes_written / 24); 558 rec->bytes_written / 24);
591 559
592 return 0; 560 return 0;