static struct task_desc *register_pid(unsigned long pid, const char *comm) { struct task_desc *task; BUG_ON(pid >= MAX_PID); task = pid_to_task[pid]; if (task) return task; task = zalloc(sizeof(*task)); task->pid = pid; task->nr = nr_tasks; strcpy(task->comm, comm); /* * every task starts in sleeping state - this gets ignored * if there's no wakeup pointing to this sleep state: */ add_sched_event_sleep(task, 0, 0); pid_to_task[pid] = task; nr_tasks++; tasks = realloc(tasks, nr_tasks*sizeof(struct task_task *)); BUG_ON(!tasks); tasks[task->nr] = task; if (verbose) printf("registered task #%ld, PID %ld (%s)\n", nr_tasks, pid, comm); return task; }
static struct task_desc *register_pid(struct perf_sched *sched, unsigned long pid, const char *comm) { struct task_desc *task; static int pid_max; if (sched->pid_to_task == NULL) { if (sysctl__read_int("kernel/pid_max", &pid_max) < 0) pid_max = MAX_PID; BUG_ON((sched->pid_to_task = calloc(pid_max, sizeof(struct task_desc *))) == NULL); } if (pid >= (unsigned long)pid_max) { BUG_ON((sched->pid_to_task = realloc(sched->pid_to_task, (pid + 1) * sizeof(struct task_desc *))) == NULL); while (pid >= (unsigned long)pid_max) sched->pid_to_task[pid_max++] = NULL; } task = sched->pid_to_task[pid]; if (task) return task; task = zalloc(sizeof(*task)); task->pid = pid; task->nr = sched->nr_tasks; strcpy(task->comm, comm); /* * every task starts in sleeping state - this gets ignored * if there's no wakeup pointing to this sleep state: */ add_sched_event_sleep(sched, task, 0, 0); sched->pid_to_task[pid] = task; sched->nr_tasks++; sched->tasks = realloc(sched->tasks, sched->nr_tasks * sizeof(struct task_desc *)); BUG_ON(!sched->tasks); sched->tasks[task->nr] = task; if (verbose) printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm); return task; }