perf tools: Use atomic_t to implement thread__{get,put} refcnt
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: e1ed3a5b87ed6759e16ec93f16aae83d2cc77ca2 Gitweb: http://git.kernel.org/tip/e1ed3a5b87ed6759e16ec93f16aae83d2cc77ca2 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 7 Apr 2015 11:59:50 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 8 May 2015 16:16:23 -0300
perf tools: Use atomic_t to implement thread__{get,put} refcnt
Fixing bugs in 'perf top' where the used thread unsafe 'struct thread' refcount implementation was falling apart because we really use two threads.
Acked-by David Ahern <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/thread.c | 6 +++--- tools/perf/util/thread.h | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-)
tools/perf/util/thread.c +3 -3
@@ -53,7 +53,7 @@ struct thread *thread__new(pid_t pid, pid_t tid) goto err_thread;list_add (&comm->list, &thread->comm_list); - +atomic_set (&thread->refcnt,0 ); }return thread;
@@ -84,13 +84,13 @@ void thread__delete(struct thread *thread)struct thread *thread__get (struct thread *thread) { - ++thread->refcnt; +atomic_inc (&thread->refcnt);return thread; }void thread__put (struct thread *thread) { -if (thread && --thread->refcnt ==0 ) { +if (thread &&atomic_dec_and_test (&thread->refcnt)) {list_del_init (&thread->node);thread__delete (thread); }
tools/perf/util/thread.h +2 -1
@@ -1,6 +1,7 @@#ifndef __PERF_THREAD_H#define __PERF_THREAD_H +#include <linux/atomic.h> #include <linux/rbtree.h> #include <linux/list.h> #include <unistd.h>
@@ -21,7 +22,7 @@ struct thread {pid_t tid;pid_t ppid;int cpu; -int refcnt; +atomic_t refcnt;char shortname[3 ];bool comm_set;bool dead;/* if set thread has exited */