1#include "../perf.h" 2#include <stdlib.h> 3#include <stdio.h> 4#include <string.h> 5#include "session.h" 6#include "thread.h" 7#include "util.h" 8#include "debug.h" 9 10struct thread *thread__new(pid_t pid, pid_t tid) 11{ 12 struct thread *self = zalloc(sizeof(*self)); 13 14 if (self != NULL) { 15 map_groups__init(&self->mg); 16 self->pid_ = pid; 17 self->tid = tid; 18 self->ppid = -1; 19 self->comm = malloc(32); 20 if (self->comm) 21 snprintf(self->comm, 32, ":%d", self->tid); 22 } 23 24 return self; 25} 26 27void thread__delete(struct thread *self) 28{ 29 map_groups__exit(&self->mg); 30 free(self->comm); 31 free(self); 32} 33 34int thread__set_comm(struct thread *self, const char *comm) 35{ 36 int err; 37 38 if (self->comm) 39 free(self->comm); 40 self->comm = strdup(comm); 41 err = self->comm == NULL ? -ENOMEM : 0; 42 if (!err) { 43 self->comm_set = true; 44 } 45 return err; 46} 47 48int thread__comm_len(struct thread *self) 49{ 50 if (!self->comm_len) { 51 if (!self->comm) 52 return 0; 53 self->comm_len = strlen(self->comm); 54 } 55 56 return self->comm_len; 57} 58 59size_t thread__fprintf(struct thread *thread, FILE *fp) 60{ 61 return fprintf(fp, "Thread %d %s\n", thread->tid, thread->comm) + 62 map_groups__fprintf(&thread->mg, verbose, fp); 63} 64 65void thread__insert_map(struct thread *self, struct map *map) 66{ 67 map_groups__fixup_overlappings(&self->mg, map, verbose, stderr); 68 map_groups__insert(&self->mg, map); 69} 70 71int thread__fork(struct thread *self, struct thread *parent) 72{ 73 int i; 74 75 if (parent->comm_set) { 76 if (self->comm) 77 free(self->comm); 78 self->comm = strdup(parent->comm); 79 if (!self->comm) 80 return -ENOMEM; 81 self->comm_set = true; 82 } 83 84 for (i = 0; i < MAP__NR_TYPES; ++i) 85 if (map_groups__clone(&self->mg, &parent->mg, i) < 0) 86 return -ENOMEM; 87 88 self->ppid = parent->tid; 89 90 return 0; 91} 92