From: Kan Liang <[email protected]>

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 <[email protected]>
---
 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

Reply via email to