[PATCH V3 4/6] perf tools: add perf_data_file__open_tmp
From: kan . liang
Date: Fri Oct 20 2017 - 16:10:54 EST
From: Kan Liang <Kan.liang@xxxxxxxxx>
And an interface for perf_data_file to open tmp file.
Automatically generate the tmp file name if it's not assigned. The name
cannot be const char. Introduce char *tmp_path for it.
The tmp file will be deleted after close.
It will be used as per-thread file to temporarily store event synthesizd
result in the following patch.
Signed-off-by: Kan Liang <Kan.liang@xxxxxxxxx>
---
tools/perf/util/data.c | 26 ++++++++++++++++++++++++++
tools/perf/util/data.h | 2 ++
2 files changed, 28 insertions(+)
diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
index 1123b30..cd6fdf9 100644
--- a/tools/perf/util/data.c
+++ b/tools/perf/util/data.c
@@ -139,9 +139,35 @@ int perf_data_file__open(struct perf_data_file *file)
return open_file(file);
}
+int perf_data_file__open_tmp(struct perf_data_file *file)
+{
+ int fd;
+
+ if (!file->tmp_path &&
+ (asprintf(&file->tmp_path, "perf.tmp.XXXXXX") < 0))
+ goto err;
+
+ fd = mkstemp(file->tmp_path);
+ if (fd < 0) {
+ free(file->tmp_path);
+ goto err;
+ }
+
+ file->fd = fd;
+ return 0;
+err:
+ file->tmp_path = NULL;
+ return -1;
+}
+
void perf_data_file__close(struct perf_data_file *file)
{
close(file->fd);
+ if (file->tmp_path) {
+ unlink(file->tmp_path);
+ free(file->tmp_path);
+ file->tmp_path = NULL;
+ }
}
ssize_t perf_data_file__write(struct perf_data_file *file,
diff --git a/tools/perf/util/data.h b/tools/perf/util/data.h
index ae510ce..892b3d5 100644
--- a/tools/perf/util/data.h
+++ b/tools/perf/util/data.h
@@ -10,6 +10,7 @@ enum perf_data_mode {
struct perf_data_file {
const char *path;
+ char *tmp_path;
int fd;
bool is_pipe;
bool force;
@@ -43,6 +44,7 @@ static inline unsigned long perf_data_file__size(struct perf_data_file *file)
}
int perf_data_file__open(struct perf_data_file *file);
+int perf_data_file__open_tmp(struct perf_data_file *file);
void perf_data_file__close(struct perf_data_file *file);
ssize_t perf_data_file__write(struct perf_data_file *file,
void *buf, size_t size);
--
2.7.4