From: Kan Liang <kan.li...@intel.com>

Pass the thread idx to process function, which is used by the following
patch.

Signed-off-by: Kan Liang <kan.li...@intel.com>
---
 tools/perf/builtin-record.c     |  4 +-
 tools/perf/tests/dwarf-unwind.c |  3 +-
 tools/perf/util/event.c         | 98 ++++++++++++++++++++++++++---------------
 tools/perf/util/event.h         |  9 ++--
 4 files changed, 72 insertions(+), 42 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index f53c1163..4ede9bf 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -922,7 +922,7 @@ static int __cmd_record(struct record *rec, int argc, const 
char **argv)
                tgid = perf_event__synthesize_comm(tool, event,
                                                   rec->evlist->workload.pid,
                                                   process_synthesized_event,
-                                                  machine);
+                                                  machine, NULL);
                free(event);
 
                if (tgid == -1)
@@ -942,7 +942,7 @@ static int __cmd_record(struct record *rec, int argc, const 
char **argv)
                perf_event__synthesize_namespaces(tool, event,
                                                  rec->evlist->workload.pid,
                                                  tgid, 
process_synthesized_event,
-                                                 machine);
+                                                 machine, NULL);
                free(event);
 
                perf_evlist__start_workload(rec->evlist);
diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
index 5ed2271..792c277 100644
--- a/tools/perf/tests/dwarf-unwind.c
+++ b/tools/perf/tests/dwarf-unwind.c
@@ -34,7 +34,8 @@ static int init_live_machine(struct machine *machine)
        pid_t pid = getpid();
 
        return perf_event__synthesize_mmap_events(NULL, &event, pid, pid,
-                                                 mmap_handler, machine, true, 
500);
+                                                 mmap_handler, machine,
+                                                 true, 500, NULL);
 }
 
 #define MAX_STACK 8
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index fd523ca7..43e1dfa 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -90,7 +90,8 @@ static const char *perf_ns__name(unsigned int id)
 static int perf_tool__process_synth_event(struct perf_tool *tool,
                                          union perf_event *event,
                                          struct machine *machine,
-                                         perf_event__handler_t process)
+                                         perf_event__handler_t process,
+                                         struct thread_info *thread)
 {
        struct perf_sample synth_sample = {
        .pid       = -1,
@@ -102,7 +103,7 @@ static int perf_tool__process_synth_event(struct perf_tool 
*tool,
        .cpumode   = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK,
        };
 
-       return process(tool, event, &synth_sample, machine, NULL);
+       return process(tool, event, &synth_sample, machine, thread);
 };
 
 /*
@@ -219,14 +220,16 @@ static int perf_event__prepare_comm(union perf_event 
*event, pid_t pid,
 pid_t perf_event__synthesize_comm(struct perf_tool *tool,
                                         union perf_event *event, pid_t pid,
                                         perf_event__handler_t process,
-                                        struct machine *machine)
+                                        struct machine *machine,
+                                        struct thread_info *thread)
 {
        pid_t tgid, ppid;
 
        if (perf_event__prepare_comm(event, pid, machine, &tgid, &ppid) != 0)
                return -1;
 
-       if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+       if (perf_tool__process_synth_event(tool, event, machine,
+                                          process, thread) != 0)
                return -1;
 
        return tgid;
@@ -249,7 +252,8 @@ int perf_event__synthesize_namespaces(struct perf_tool 
*tool,
                                      union perf_event *event,
                                      pid_t pid, pid_t tgid,
                                      perf_event__handler_t process,
-                                     struct machine *machine)
+                                     struct machine *machine,
+                                     struct thread_info *thread)
 {
        u32 idx;
        struct perf_ns_link_info *ns_link_info;
@@ -278,7 +282,8 @@ int perf_event__synthesize_namespaces(struct perf_tool 
*tool,
                        (NR_NAMESPACES * sizeof(struct perf_ns_link_info)) +
                        machine->id_hdr_size);
 
-       if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+       if (perf_tool__process_synth_event(tool, event, machine,
+                                          process, thread) != 0)
                return -1;
 
        return 0;
@@ -288,7 +293,8 @@ static int perf_event__synthesize_fork(struct perf_tool 
*tool,
                                       union perf_event *event,
                                       pid_t pid, pid_t tgid, pid_t ppid,
                                       perf_event__handler_t process,
-                                      struct machine *machine)
+                                      struct machine *machine,
+                                      struct thread_info *thread)
 {
        memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);
 
@@ -310,7 +316,8 @@ static int perf_event__synthesize_fork(struct perf_tool 
*tool,
 
        event->fork.header.size = (sizeof(event->fork) + machine->id_hdr_size);
 
-       if (perf_tool__process_synth_event(tool, event, machine, process) != 0)
+       if (perf_tool__process_synth_event(tool, event, machine,
+                                          process, thread) != 0)
                return -1;
 
        return 0;
@@ -322,7 +329,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool 
*tool,
                                       perf_event__handler_t process,
                                       struct machine *machine,
                                       bool mmap_data,
-                                      unsigned int proc_map_timeout)
+                                      unsigned int proc_map_timeout,
+                                      struct thread_info *thread)
 {
        char filename[PATH_MAX];
        FILE *fp;
@@ -444,7 +452,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool 
*tool,
                event->mmap2.pid = tgid;
                event->mmap2.tid = pid;
 
-               if (perf_tool__process_synth_event(tool, event, machine, 
process) != 0) {
+               if (perf_tool__process_synth_event(tool, event, machine,
+                                                  process, thread) != 0) {
                        rc = -1;
                        break;
                }
@@ -502,7 +511,8 @@ int perf_event__synthesize_modules(struct perf_tool *tool,
 
                memcpy(event->mmap.filename, pos->dso->long_name,
                       pos->dso->long_name_len + 1);
-               if (perf_tool__process_synth_event(tool, event, machine, 
process) != 0) {
+               if (perf_tool__process_synth_event(tool, event, machine,
+                                                  process, NULL) != 0) {
                        rc = -1;
                        break;
                }
@@ -521,7 +531,8 @@ static int __event__synthesize_thread(union perf_event 
*comm_event,
                                      struct perf_tool *tool,
                                      struct machine *machine,
                                      bool mmap_data,
-                                     unsigned int proc_map_timeout)
+                                     unsigned int proc_map_timeout,
+                                     struct thread_info *thread)
 {
        char filename[PATH_MAX];
        DIR *tasks;
@@ -532,19 +543,22 @@ static int __event__synthesize_thread(union perf_event 
*comm_event,
        /* special case: only send one comm event using passed in pid */
        if (!full) {
                tgid = perf_event__synthesize_comm(tool, comm_event, pid,
-                                                  process, machine);
+                                                  process, machine, thread);
 
                if (tgid == -1)
                        return -1;
 
-               if (perf_event__synthesize_namespaces(tool, namespaces_event, 
pid,
-                                                     tgid, process, machine) < 
0)
+               if (perf_event__synthesize_namespaces(tool, namespaces_event,
+                                                     pid, tgid, process,
+                                                     machine, thread) < 0)
                        return -1;
 
 
-               return perf_event__synthesize_mmap_events(tool, mmap_event, 
pid, tgid,
-                                                         process, machine, 
mmap_data,
-                                                         proc_map_timeout);
+               return perf_event__synthesize_mmap_events(tool, mmap_event,
+                                                         pid, tgid, process,
+                                                         machine, mmap_data,
+                                                         proc_map_timeout,
+                                                         thread);
        }
 
        if (machine__is_default_guest(machine))
@@ -572,25 +586,30 @@ static int __event__synthesize_thread(union perf_event 
*comm_event,
                                             &tgid, &ppid) != 0)
                        break;
 
-               if (perf_event__synthesize_fork(tool, fork_event, _pid, tgid,
-                                               ppid, process, machine) < 0)
+               if (perf_event__synthesize_fork(tool, fork_event, _pid,
+                                               tgid, ppid, process,
+                                               machine, thread) < 0)
                        break;
 
-               if (perf_event__synthesize_namespaces(tool, namespaces_event, 
_pid,
-                                                     tgid, process, machine) < 
0)
+               if (perf_event__synthesize_namespaces(tool, namespaces_event,
+                                                     _pid, tgid, process,
+                                                     machine, thread) < 0)
                        break;
 
                /*
                 * Send the prepared comm event
                 */
-               if (perf_tool__process_synth_event(tool, comm_event, machine, 
process) != 0)
+               if (perf_tool__process_synth_event(tool, comm_event, machine,
+                                                  process, thread) != 0)
                        break;
 
                rc = 0;
                if (_pid == pid) {
                        /* process the parent's maps too */
-                       rc = perf_event__synthesize_mmap_events(tool, 
mmap_event, pid, tgid,
-                                               process, machine, mmap_data, 
proc_map_timeout);
+                       rc = perf_event__synthesize_mmap_events(tool,
+                                               mmap_event, pid, tgid,
+                                               process, machine, mmap_data,
+                                               proc_map_timeout, thread);
                        if (rc)
                                break;
                }
@@ -633,9 +652,10 @@ int perf_event__synthesize_thread_map(struct perf_tool 
*tool,
        for (thread = 0; thread < threads->nr; ++thread) {
                if (__event__synthesize_thread(comm_event, mmap_event,
                                               fork_event, namespaces_event,
-                                              thread_map__pid(threads, 
thread), 0,
-                                              process, tool, machine,
-                                              mmap_data, proc_map_timeout)) {
+                                              thread_map__pid(threads, thread),
+                                              0, process, tool, machine,
+                                              mmap_data, proc_map_timeout,
+                                              NULL)) {
                        err = -1;
                        break;
                }
@@ -658,10 +678,13 @@ int perf_event__synthesize_thread_map(struct perf_tool 
*tool,
                        /* if not, generate events for it */
                        if (need_leader &&
                            __event__synthesize_thread(comm_event, mmap_event,
-                                                      fork_event, 
namespaces_event,
+                                                      fork_event,
+                                                      namespaces_event,
                                                       comm_event->comm.pid, 0,
                                                       process, tool, machine,
-                                                      mmap_data, 
proc_map_timeout)) {
+                                                      mmap_data,
+                                                      proc_map_timeout,
+                                                      NULL)) {
                                err = -1;
                                break;
                        }
@@ -684,8 +707,8 @@ static int __perf_event__synthesize_threads(struct 
perf_tool *tool,
                                            bool mmap_data,
                                            unsigned int proc_map_timeout,
                                            struct dirent **dirent,
-                                           int start,
-                                           int num)
+                                           int start, int num,
+                                           struct thread_info *thread)
 {
        union perf_event *comm_event, *mmap_event, *fork_event;
        union perf_event *namespaces_event;
@@ -727,7 +750,7 @@ static int __perf_event__synthesize_threads(struct 
perf_tool *tool,
                __event__synthesize_thread(comm_event, mmap_event, fork_event,
                                           namespaces_event, pid, 1, process,
                                           tool, machine, mmap_data,
-                                          proc_map_timeout);
+                                          proc_map_timeout, thread);
        }
        err = 0;
 
@@ -751,6 +774,7 @@ struct synthesize_threads_arg {
        struct dirent **dirent;
        int num;
        int start;
+       struct thread_info thread;
 };
 
 static void *synthesize_threads_worker(void *arg)
@@ -760,7 +784,7 @@ static void *synthesize_threads_worker(void *arg)
        __perf_event__synthesize_threads(args->tool, args->process,
                                         args->machine, args->mmap_data,
                                         args->proc_map_timeout, args->dirent,
-                                        args->start, args->num);
+                                        args->start, args->num, &args->thread);
        return NULL;
 }
 
@@ -799,7 +823,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
                err = __perf_event__synthesize_threads(tool, process,
                                                       machine, mmap_data,
                                                       proc_map_timeout,
-                                                      dirent, base, n);
+                                                      dirent, base, n, NULL);
                goto free_dirent;
        }
        if (thread_nr > n)
@@ -822,6 +846,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
                args[i].mmap_data = mmap_data;
                args[i].proc_map_timeout = proc_map_timeout;
                args[i].dirent = dirent;
+               args[i].thread.idx = i;
        }
        for (i = 0; i < m; i++) {
                args[i].num = num_per_thread + 1;
@@ -940,7 +965,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool 
*tool,
        event->mmap.len   = map->end - event->mmap.start;
        event->mmap.pid   = machine->pid;
 
-       err = perf_tool__process_synth_event(tool, event, machine, process);
+       err = perf_tool__process_synth_event(tool, event, machine,
+                                            process, NULL);
        free(event);
 
        return err;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 200f3f8..6e7b08b3 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -785,13 +785,15 @@ int perf_event__synthesize_sample(union perf_event 
*event, u64 type,
 pid_t perf_event__synthesize_comm(struct perf_tool *tool,
                                  union perf_event *event, pid_t pid,
                                  perf_event__handler_t process,
-                                 struct machine *machine);
+                                 struct machine *machine,
+                                 struct thread_info *thread);
 
 int perf_event__synthesize_namespaces(struct perf_tool *tool,
                                      union perf_event *event,
                                      pid_t pid, pid_t tgid,
                                      perf_event__handler_t process,
-                                     struct machine *machine);
+                                     struct machine *machine,
+                                     struct thread_info *thread);
 
 int perf_event__synthesize_mmap_events(struct perf_tool *tool,
                                       union perf_event *event,
@@ -799,7 +801,8 @@ int perf_event__synthesize_mmap_events(struct perf_tool 
*tool,
                                       perf_event__handler_t process,
                                       struct machine *machine,
                                       bool mmap_data,
-                                      unsigned int proc_map_timeout);
+                                      unsigned int proc_map_timeout,
+                                      struct thread_info *thread);
 
 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
-- 
2.7.4

Reply via email to