diff options
Diffstat (limited to 'tools/perf/util/event.c')
| -rw-r--r-- | tools/perf/util/event.c | 30 | 
1 files changed, 22 insertions, 8 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 6715b193872..eaaee22628e 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -1,6 +1,7 @@  #include <linux/types.h>  #include "event.h"  #include "debug.h" +#include "machine.h"  #include "sort.h"  #include "string.h"  #include "strlist.h" @@ -702,10 +703,10 @@ size_t perf_event__fprintf_task(union perf_event *event, FILE *fp)  		       event->fork.ppid, event->fork.ptid);  } -int perf_event__process_task(struct perf_tool *tool __maybe_unused, +int perf_event__process_fork(struct perf_tool *tool __maybe_unused,  			     union perf_event *event,  			     struct perf_sample *sample __maybe_unused, -			      struct machine *machine) +			     struct machine *machine)  {  	struct thread *thread = machine__findnew_thread(machine, event->fork.tid);  	struct thread *parent = machine__findnew_thread(machine, event->fork.ptid); @@ -713,11 +714,6 @@ int perf_event__process_task(struct perf_tool *tool __maybe_unused,  	if (dump_trace)  		perf_event__fprintf_task(event, stdout); -	if (event->header.type == PERF_RECORD_EXIT) { -		machine__remove_thread(machine, thread); -		return 0; -	} -  	if (thread == NULL || parent == NULL ||  	    thread__fork(thread, parent) < 0) {  		dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n"); @@ -727,6 +723,22 @@ int perf_event__process_task(struct perf_tool *tool __maybe_unused,  	return 0;  } +int perf_event__process_exit(struct perf_tool *tool __maybe_unused, +			     union perf_event *event, +			     struct perf_sample *sample __maybe_unused, +			     struct machine *machine) +{ +	struct thread *thread = machine__find_thread(machine, event->fork.tid); + +	if (dump_trace) +		perf_event__fprintf_task(event, stdout); + +	if (thread != NULL) +		machine__remove_thread(machine, thread); + +	return 0; +} +  size_t perf_event__fprintf(union perf_event *event, FILE *fp)  {  	size_t ret = fprintf(fp, "PERF_RECORD_%s", @@ -761,8 +773,10 @@ int perf_event__process(struct perf_tool *tool, union perf_event *event,  		perf_event__process_mmap(tool, event, sample, machine);  		break;  	case PERF_RECORD_FORK: +		perf_event__process_fork(tool, event, sample, machine); +		break;  	case PERF_RECORD_EXIT: -		perf_event__process_task(tool, event, sample, machine); +		perf_event__process_exit(tool, event, sample, machine);  		break;  	case PERF_RECORD_LOST:  		perf_event__process_lost(tool, event, sample, machine);  |