Introducing thread_map__new_event function to create
struct thread_map object from thread_map event.

Link: http://lkml.kernel.org/n/tip-0gu5uv3g51p4mzul93bhh...@git.kernel.org
Signed-off-by: Jiri Olsa <jo...@kernel.org>
---
 tools/perf/tests/thread-map.c | 14 ++++++++++++++
 tools/perf/util/thread_map.c  | 27 +++++++++++++++++++++++++++
 tools/perf/util/thread_map.h  |  3 +++
 3 files changed, 44 insertions(+)

diff --git a/tools/perf/tests/thread-map.c b/tools/perf/tests/thread-map.c
index 0facd9fa3458..da7b047d3ada 100644
--- a/tools/perf/tests/thread-map.c
+++ b/tools/perf/tests/thread-map.c
@@ -47,10 +47,24 @@ static int process_event(struct perf_tool *tool 
__maybe_unused,
                         struct machine *machine __maybe_unused)
 {
        struct thread_map_event *map = &event->thread_map;
+       struct thread_map *threads;
 
        TEST_ASSERT_VAL("wrong nr",   map->nr == 1);
        TEST_ASSERT_VAL("wrong pid",  map->data[0].pid == (u64) getpid());
        TEST_ASSERT_VAL("wrong comm", !strcmp(map->data[0].comm, "perf"));
+
+       threads = thread_map__new_event(&event->thread_map);
+       TEST_ASSERT_VAL("failed to alloc map", threads);
+
+       TEST_ASSERT_VAL("wrong nr", threads->nr == 1);
+       TEST_ASSERT_VAL("wrong pid",
+                       thread_map__pid(threads, 0) == getpid());
+       TEST_ASSERT_VAL("wrong comm",
+                       thread_map__comm(threads, 0) &&
+                       !strcmp(thread_map__comm(threads, 0), "perf"));
+       TEST_ASSERT_VAL("wrong refcnt",
+                       atomic_read(&threads->refcnt) == 1);
+       thread_map__put(threads);
        return 0;
 }
 
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c
index da7646d767fe..34d44df2fb1e 100644
--- a/tools/perf/util/thread_map.c
+++ b/tools/perf/util/thread_map.c
@@ -13,6 +13,7 @@
 #include "thread_map.h"
 #include "util.h"
 #include "debug.h"
+#include "event.h"
 
 /* Skip "." and ".." directories */
 static int filter(const struct dirent *dir)
@@ -407,3 +408,29 @@ void thread_map__read_comms(struct thread_map *threads)
        for (i = 0; i < threads->nr; ++i)
                comm_init(threads, i);
 }
+
+static void thread_map__copy_event(struct thread_map *threads,
+                                  struct thread_map_event *event)
+{
+       unsigned i;
+
+       threads->nr = (int) event->nr;
+
+       for (i = 0; i < event->nr; i++) {
+               thread_map__set_pid(threads, i, (pid_t) event->data[i].pid);
+               threads->map[i].comm = strndup(event->data[i].comm, 16);
+       }
+
+       atomic_set(&threads->refcnt, 1);
+}
+
+struct thread_map *thread_map__new_event(struct thread_map_event *event)
+{
+       struct thread_map *threads;
+
+       threads = thread_map__alloc(event->nr);
+       if (threads)
+               thread_map__copy_event(threads, event);
+
+       return threads;
+}
diff --git a/tools/perf/util/thread_map.h b/tools/perf/util/thread_map.h
index af679d8a50f8..85e4c7c4fbde 100644
--- a/tools/perf/util/thread_map.h
+++ b/tools/perf/util/thread_map.h
@@ -16,11 +16,14 @@ struct thread_map {
        struct thread_map_data map[];
 };
 
+struct thread_map_event;
+
 struct thread_map *thread_map__new_dummy(void);
 struct thread_map *thread_map__new_by_pid(pid_t pid);
 struct thread_map *thread_map__new_by_tid(pid_t tid);
 struct thread_map *thread_map__new_by_uid(uid_t uid);
 struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid);
+struct thread_map *thread_map__new_event(struct thread_map_event *event);
 
 struct thread_map *thread_map__get(struct thread_map *map);
 void thread_map__put(struct thread_map *map);
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to