On Wed, Dec 24, 2014 at 04:15:10PM +0900, Namhyung Kim wrote:

SNIP

>  
>  static void machine__remove_thread(struct machine *machine, struct thread 
> *th)
>  {
> +     struct rb_node **p = &machine->dead_threads.rb_node;
> +     struct rb_node *parent = NULL;
> +     struct thread *pos;
> +
>       machine->last_match = NULL;
>       rb_erase(&th->rb_node, &machine->threads);
> +
> +     th->dead = true;
> +
>       /*
>        * We may have references to this thread, for instance in some 
> hist_entry
> -      * instances, so just move them to a separate list.
> +      * instances, so just move them to a separate list in rbtree.
>        */
> -     list_add_tail(&th->node, &machine->dead_threads);
> +     while (*p != NULL) {
> +             parent = *p;
> +             pos = rb_entry(parent, struct thread, rb_node);
> +
> +             if (pos->tid == th->tid) {
> +                     list_add_tail(&th->node, &pos->node);
> +                     return;
> +             }

hum, why is this 'new list' in thread object necessary? why not
to store all in the tree?


> +
> +             if (th->tid < pos->tid)
> +                     p = &(*p)->rb_left;
> +             else
> +                     p = &(*p)->rb_right;
> +     }
> +

SNIP

> diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h
> index 0b6dcd70bc8b..413f28cf689b 100644
> --- a/tools/perf/util/thread.h
> +++ b/tools/perf/util/thread.h
> @@ -11,10 +11,8 @@
>  struct thread_stack;
>  
>  struct thread {
> -     union {
> -             struct rb_node   rb_node;
> -             struct list_head node;
> -     };
> +     struct rb_node          rb_node;
> +     struct list_head        node;
>       struct map_groups       *mg;
>       pid_t                   pid_; /* Not all tools update this */
>       pid_t                   tid;
> @@ -22,7 +20,8 @@ struct thread {
>       int                     cpu;
>       char                    shortname[3];
>       bool                    comm_set;
> -     bool                    dead; /* if set thread has exited */
> +     bool                    exited; /* if set thread has exited */
> +     bool                    dead; /* thread is in dead_threads list */

looks like this also changes the logic (new exited flag),
not just the dead threads storage wheel

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