perf thread_map: Add thread_map__new_event function
authorJiri Olsa <jolsa@kernel.org>
Sun, 25 Oct 2015 14:51:21 +0000 (15:51 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 17 Dec 2015 17:38:16 +0000 (14:38 -0300)
Introducing the thread_map__new_event function to create a struct
thread_map object from a thread_map event.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Kan Liang <kan.liang@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445784728-21732-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/thread-map.c
tools/perf/util/thread_map.c
tools/perf/util/thread_map.h

index ac5be2578367383ed5d0876bfe79129be1032487..fccde848fe9c0d0d67f1d6081b7e09ed7fc05610 100644 (file)
@@ -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->entries[0].pid == (u64) getpid());
        TEST_ASSERT_VAL("wrong comm", !strcmp(map->entries[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;
 }
 
index 371fb28fe5b1b95481c910cb2bf56068fe0509e2..08afc69099538f66172968dc3827fd9b7b40d5c2 100644 (file)
@@ -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)
@@ -409,3 +410,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->entries[i].pid);
+               threads->map[i].comm = strndup(event->entries[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;
+}
index af679d8a50f852ebb3457491f5dc4b96f6520743..85e4c7c4fbde1fd5455ed0fa58375aac3934b445 100644 (file)
@@ -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);