On 2/26/13 2:41 AM, chenggang wrote:

---8<---

diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 5cd13d7..91d2848 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -327,8 +327,8 @@ int perf_event__synthesize_thread_map(struct perf_tool 
*tool,
        err = 0;
        for (thread = 0; thread < threads->nr; ++thread) {
                if (__event__synthesize_thread(comm_event, mmap_event,
-                                              threads->map[thread], 0,
-                                              process, tool, machine)) {
+                                              thread_map__get_pid(threads,
+                                              thread), 0, process, tool,
+                                              machine)) {

ouch, that needs to be easier on the eyes. Use an intermediate variable for the thread_map__get_pid(threads, thread).

                        err = -1;
                        break;
                }
@@ -337,12 +337,14 @@ int perf_event__synthesize_thread_map(struct perf_tool 
*tool,
                 * comm.pid is set to thread group id by
                 * perf_event__synthesize_comm
                 */
-               if ((int) comm_event->comm.pid != threads->map[thread]) {
+               if ((int) comm_event->comm.pid
+                   != thread_map__get_pid(threads, thread)) {

ditto. intermediate variable will make that easier to read.

                        bool need_leader = true;

                        /* is thread group leader in thread_map? */
                        for (j = 0; j < threads->nr; ++j) {
-                               if ((int) comm_event->comm.pid == 
threads->map[j]) {
+                               if ((int) comm_event->comm.pid
+                                   == thread_map__get_pid(threads, thread)) {

and again here. Now should that be j instead of thread? i.e,
     thread_map__get_pid(threads, j)

                                        need_leader = false;
                                        break;
                                }

---8<---

diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c
index 9b5f856..5f96fdf 100644
--- a/tools/perf/util/thread_map.c
+++ b/tools/perf/util/thread_map.c
@@ -19,9 +19,72 @@ static int filter(const struct dirent *dir)
                return 1;
  }

-struct thread_map *thread_map__new_by_pid(pid_t pid)
+struct thread_map *thread_map__init(void)
  {
        struct thread_map *threads;
+
+       threads = malloc(sizeof(*threads));
+       if (threads == NULL)
+               return NULL;
+
+       threads->nr = 0;
+       INIT_LIST_HEAD(&threads->head);
+       return threads;
+}
+
+void thread_map__delete(struct thread_map *threads)
+{
+       struct thread_pid *tp, *tmp;
+
+       list_for_each_entry_safe(tp, tmp, &threads->head, next) {
+               list_del(&tp->next);
+               free(tp);
+       }
+
+       free(threads);
+}
+
+int thread_map__append(struct thread_map *threads, pid_t pid)
+{
+       struct thread_pid *tp;
+
+       if (threads == NULL)
+               return -1;
+
+       list_for_each_entry(tp, &threads->head, next)
+               if (tp->pid == pid) /*The thread is exist*/
+                       return 1;

braces around multi-line statements

+
+       tp = malloc(sizeof(*tp));
+       if (tp == NULL)
+               return -1;
+
+       tp->pid = pid;
+       list_add_tail(&tp->next, &threads->head);
+       threads->nr++;
+
+       return 0; /*success*/
+}
+
+int thread_map__remove(struct thread_map *threads, int idx)
+{
+       struct thread_pid *tp;
+       int count = 0;
+
+       list_for_each_entry(tp, &threads->head, next)
+               if (count++ == idx) {
+                       list_del(&tp->next);
+                       free(tp);
+                       threads->nr--;
+                       return 0;
+               }

braces

+
+       return -1;
+}
+
+struct thread_map *thread_map__new_by_pid(pid_t pid)
+{
+       struct thread_map *threads = NULL;
        char name[256];
        int items;
        struct dirent **namelist = NULL;
@@ -32,40 +95,49 @@ struct thread_map *thread_map__new_by_pid(pid_t pid)
        if (items <= 0)
                return NULL;

-       threads = malloc(sizeof(*threads) + sizeof(pid_t) * items);
-       if (threads != NULL) {
+       threads = thread_map__init();
+       if (threads != NULL)
                for (i = 0; i < items; i++)
-                       threads->map[i] = atoi(namelist[i]->d_name);
-               threads->nr = items;
-       }
+                       if (thread_map__append(threads,
+                           atoi(namelist[i]->d_name)) == -1)
+                               goto out_free_threads;

braces; check the indentation too. I think the above 3 lines go under the 'if (threads != NULL)' check


        for (i=0; i<items; i++)
                free(namelist[i]);
        free(namelist);

        return threads;
+
+out_free_threads:
+       thread_map__delete(threads);
+       return NULL;
  }

  struct thread_map *thread_map__new_by_tid(pid_t tid)
  {
-       struct thread_map *threads = malloc(sizeof(*threads) + sizeof(pid_t));
+       struct thread_map *threads = NULL;

-       if (threads != NULL) {
-               threads->map[0] = tid;
-               threads->nr  = 1;
-       }
+       threads = thread_map__init();
+       if (threads != NULL)
+               if (thread_map__append(threads, tid) == -1)
+                       goto out_free_threads;

braces


        return threads;
+
+out_free_threads:
+       thread_map__delete(threads);
+       return NULL;
  }

  struct thread_map *thread_map__new_by_uid(uid_t uid)
  {
        DIR *proc;
-       int max_threads = 32, items, i;
+       int items, i;
        char path[256];
        struct dirent dirent, *next, **namelist = NULL;
-       struct thread_map *threads = malloc(sizeof(*threads) +
-                                           max_threads * sizeof(pid_t));
+       struct thread_map *threads = NULL;
+
+       threads = thread_map__init();
        if (threads == NULL)
                goto out;

@@ -73,11 +145,8 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
        if (proc == NULL)
                goto out_free_threads;

-       threads->nr = 0;
-
        while (!readdir_r(proc, &dirent, &next) && next) {
                char *end;
-               bool grow = false;
                struct stat st;
                pid_t pid = strtol(dirent.d_name, &end, 10);

@@ -97,30 +166,13 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
                if (items <= 0)
                        goto out_free_closedir;

-               while (threads->nr + items >= max_threads) {
-                       max_threads *= 2;
-                       grow = true;
-               }
-
-               if (grow) {
-                       struct thread_map *tmp;
-
-                       tmp = realloc(threads, (sizeof(*threads) +
-                                               max_threads * sizeof(pid_t)));
-                       if (tmp == NULL)
-                               goto out_free_namelist;
-
-                       threads = tmp;
-               }
-
                for (i = 0; i < items; i++)
-                       threads->map[threads->nr + i] = 
atoi(namelist[i]->d_name);
+                       if (thread_map__append(threads, atoi(namelist[i]->d_name) 
< 0))
+                               goto out_free_namelist;

                for (i = 0; i < items; i++)
                        free(namelist[i]);
                free(namelist);
-
-               threads->nr += items;
        }

  out_closedir:
@@ -129,7 +181,7 @@ out:
        return threads;

  out_free_threads:
-       free(threads);
+       thread_map__delete(threads);
        return NULL;

  out_free_namelist:
@@ -138,7 +190,7 @@ out_free_namelist:
        free(namelist);

  out_free_closedir:
-       free(threads);
+       thread_map__delete(threads);
        threads = NULL;
        goto out_closedir;
  }
@@ -156,11 +208,11 @@ struct thread_map *thread_map__new(pid_t pid, pid_t tid, 
uid_t uid)

  static struct thread_map *thread_map__new_by_pid_str(const char *pid_str)
  {
-       struct thread_map *threads = NULL, *nt;
+       struct thread_map *threads = NULL;
        char name[256];
-       int items, total_tasks = 0;
+       int items;
        struct dirent **namelist = NULL;
-       int i, j = 0;
+       int i;
        pid_t pid, prev_pid = INT_MAX;
        char *end_ptr;
        struct str_node *pos;
@@ -169,6 +221,10 @@ static struct thread_map *thread_map__new_by_pid_str(const 
char *pid_str)
        if (!slist)
                return NULL;

+       threads = thread_map__init();
+       if (threads == NULL)
+               return NULL;
+
        strlist__for_each(pos, slist) {
                pid = strtol(pos->s, &end_ptr, 10);

@@ -184,19 +240,12 @@ static struct thread_map 
*thread_map__new_by_pid_str(const char *pid_str)
                if (items <= 0)
                        goto out_free_threads;

-               total_tasks += items;
-               nt = realloc(threads, (sizeof(*threads) +
-                                      sizeof(pid_t) * total_tasks));
-               if (nt == NULL)
-                       goto out_free_namelist;
-
-               threads = nt;
+               for (i = 0; i < items; i++)
+                       if (thread_map__append(threads, atoi(namelist[i]->d_name)) 
< 0)
+                               goto out_free_namelist;

and more braces....


-               for (i = 0; i < items; i++) {
-                       threads->map[j++] = atoi(namelist[i]->d_name);
+               for (i = 0; i < items; i++)
                        free(namelist[i]);
-               }
-               threads->nr = total_tasks;
                free(namelist);
        }


---8<---

diff --git a/tools/perf/util/xyarray.c b/tools/perf/util/xyarray.c
index fc48bda..5777bc2 100644
--- a/tools/perf/util/xyarray.c
+++ b/tools/perf/util/xyarray.c
@@ -78,13 +78,13 @@ int xyarray__remove(struct xyarray *xy, int y)
  void xyarray__delete(struct xyarray *xy)
  {
        unsigned int i;
-       struct xyentry *entry;
+       struct xyentry *entry, *tmp;

        if (!xy)
                return;

        for (i = 0; i < xy->row_count; i++)
-               list_for_each_entry(entry, &xy->rows[i].head, next) {
+               list_for_each_entry_safe(entry, tmp, &xy->rows[i].head, next) {
                        list_del(&entry->next);
                        free(entry);
                }


These xyarray changes should be in the first patch.

David
--
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