diff options
Diffstat (limited to 'tools/perf/util/thread.c')
| -rw-r--r-- | tools/perf/util/thread.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 0a9ae8014729..dfd00c6dad6e 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -19,8 +19,10 @@ int thread__init_map_groups(struct thread *thread, struct machine *machine)  		thread->mg = map_groups__new(machine);  	} else {  		leader = __machine__findnew_thread(machine, pid, pid); -		if (leader) +		if (leader) {  			thread->mg = map_groups__get(leader->mg); +			thread__put(leader); +		}  	}  	return thread->mg ? 0 : -1; @@ -53,7 +55,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); +		atomic_set(&thread->refcnt, 1);  		RB_CLEAR_NODE(&thread->rb_node);  	} @@ -95,6 +97,10 @@ struct thread *thread__get(struct thread *thread)  void thread__put(struct thread *thread)  {  	if (thread && atomic_dec_and_test(&thread->refcnt)) { +		/* +		 * Remove it from the dead_threads list, as last reference +		 * is gone. +		 */  		list_del_init(&thread->node);  		thread__delete(thread);  	}  | 
