X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fcputop.c;h=4596f28b674ddd3b0b0c4a2e43ccc2c45bdeb11b;hp=cdc1bdf1e0251875e008b231cf0db6b7fb37c328;hb=54645d5cab414bb3391837ef7acb919cf106c71f;hpb=1dec520a9e8e0654fa7fab2310a0191b2836d424 diff --git a/src/cputop.c b/src/cputop.c index cdc1bdf..4596f28 100644 --- a/src/cputop.c +++ b/src/cputop.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Julien Desfossez + * Copyright (C) 2011-2012 Julien Desfossez * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License Version 2 as @@ -10,10 +10,9 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include @@ -21,9 +20,10 @@ #include "lttngtoptypes.h" #include "common.h" #include "cputop.h" +#include "lttngtop.h" void update_cputop_data(unsigned long timestamp, int64_t cpu, int prev_pid, - int next_pid, char *prev_comm, char *next_comm) + int next_pid, char *prev_comm, char *next_comm, char *hostname) { struct cputime *tmpcpu; unsigned long elapsed; @@ -34,12 +34,14 @@ void update_cputop_data(unsigned long timestamp, int64_t cpu, int prev_pid, elapsed = timestamp - tmpcpu->task_start; tmpcpu->current_task->totalcpunsec += elapsed; tmpcpu->current_task->threadstotalcpunsec += elapsed; - if (tmpcpu->current_task->pid != tmpcpu->current_task->tid) + if (tmpcpu->current_task->threadparent && + tmpcpu->current_task->pid != tmpcpu->current_task->tid) tmpcpu->current_task->threadparent->threadstotalcpunsec += elapsed; } if (next_pid != 0) - tmpcpu->current_task = get_proc(<tngtop, next_pid, next_comm, timestamp); + tmpcpu->current_task = get_proc(<tngtop, next_pid, next_comm, + timestamp, hostname); else tmpcpu->current_task = NULL; @@ -49,11 +51,12 @@ void update_cputop_data(unsigned long timestamp, int64_t cpu, int prev_pid, enum bt_cb_ret handle_sched_switch(struct bt_ctf_event *call_data, void *private_data) { - struct definition *scope; + const struct bt_definition *scope; unsigned long timestamp; uint64_t cpu_id; char *prev_comm, *next_comm; int prev_tid, next_tid; + char *hostname = NULL; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) @@ -92,7 +95,7 @@ enum bt_cb_ret handle_sched_switch(struct bt_ctf_event *call_data, cpu_id = get_cpu_id(call_data); update_cputop_data(timestamp, cpu_id, prev_tid, next_tid, - prev_comm, next_comm); + prev_comm, next_comm, hostname); return BT_CB_OK; @@ -103,7 +106,7 @@ error: enum bt_cb_ret handle_sched_process_free(struct bt_ctf_event *call_data, void *private_data) { - struct definition *scope; + const struct bt_definition *scope; unsigned long timestamp; char *comm; int tid; @@ -121,7 +124,16 @@ enum bt_cb_ret handle_sched_process_free(struct bt_ctf_event *call_data, goto error; } - tid = get_context_tid(call_data); + tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_tid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing tid field\n"); + goto error; + } + if (tid == opt_exec_pid) { + quit = 1; + } + death_proc(<tngtop, tid, comm, timestamp); return BT_CB_OK; @@ -131,3 +143,55 @@ error: } +enum bt_cb_ret handle_sched_process_fork(struct bt_ctf_event *call_data, + void *private_data) +{ + const struct bt_definition *scope; + struct processtop *tmp; + int tid, *hash_tid, parent_pid; + unsigned long timestamp; + char *comm; + + timestamp = bt_ctf_get_timestamp(call_data); + if (timestamp == -1ULL) + goto error; + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, + scope, "_child_comm")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing procname context info\n"); + goto error; + } + + tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_child_tid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing child_tid field\n"); + goto error; + } + + parent_pid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_parent_pid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing parent_pid field\n"); + goto error; + } + + tmp = get_proc(<tngtop, tid, comm, timestamp, NULL); + + if (opt_child) { + hash_tid = lookup_filter_tid_list(parent_pid); + if (hash_tid) { + add_filter_tid_list(tmp); + } + } + + return BT_CB_OK; + +error: + return BT_CB_ERROR_STOP; + +} +