X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fcommon.c;h=5cc9bca14aff3342fa33baefb88f26599acaafb0;hp=d4f89f3e8970e69e5ef60cf81beebb540727f6fe;hb=094632060f50c0a268794c70e0650167c5c51fb8;hpb=3439955e838cd626b61ca36e37f80a104966a8fe diff --git a/src/common.c b/src/common.c index d4f89f3..5cc9bca 100644 --- a/src/common.c +++ b/src/common.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 @@ -21,7 +21,7 @@ #include #include "common.h" -uint64_t get_cpu_id(const struct ctf_event_definition *event) +uint64_t get_cpu_id(const struct bt_ctf_event *event) { const struct definition *scope; uint64_t cpu_id; @@ -36,7 +36,7 @@ uint64_t get_cpu_id(const struct ctf_event_definition *event) return cpu_id; } -uint64_t get_context_tid(const struct ctf_event_definition *event) +uint64_t get_context_tid(const struct bt_ctf_event *event) { const struct definition *scope; uint64_t tid; @@ -52,7 +52,7 @@ uint64_t get_context_tid(const struct ctf_event_definition *event) return tid; } -uint64_t get_context_pid(const struct ctf_event_definition *event) +uint64_t get_context_pid(const struct bt_ctf_event *event) { const struct definition *scope; uint64_t pid; @@ -68,7 +68,7 @@ uint64_t get_context_pid(const struct ctf_event_definition *event) return pid; } -uint64_t get_context_ppid(const struct ctf_event_definition *event) +uint64_t get_context_ppid(const struct bt_ctf_event *event) { const struct definition *scope; uint64_t ppid; @@ -84,7 +84,7 @@ uint64_t get_context_ppid(const struct ctf_event_definition *event) return ppid; } -char *get_context_comm(const struct ctf_event_definition *event) +char *get_context_comm(const struct bt_ctf_event *event) { const struct definition *scope; char *comm; @@ -360,11 +360,9 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end) dst->process_table = g_ptr_array_new(); dst->files_table = g_ptr_array_new(); dst->cpu_table = g_ptr_array_new(); - dst->perf_list = g_hash_table_new(g_str_hash, g_str_equal); rotate_cputime(end); - g_hash_table_foreach(lttngtop.perf_list, copy_perf_counter, dst->perf_list); for (i = 0; i < lttngtop.process_table->len; i++) { tmp = g_ptr_array_index(lttngtop.process_table, i); new = g_new0(struct processtop, 1); @@ -462,3 +460,72 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end) return dst; } + +enum bt_cb_ret handle_statedump_process_state(struct bt_ctf_event *call_data, + void *private_data) +{ + const struct definition *scope; + struct processtop *proc; + unsigned long timestamp; + int64_t pid, tid; + char *procname; + + timestamp = bt_ctf_get_real_timestamp(call_data); + if (timestamp == -1ULL) + goto error; + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + pid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_pid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing pid context info\n"); + goto error; + } + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_tid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing tid context info\n"); + goto error; + } + + /* + * FIXME + * I first tried with bt_ctf_get_string but doesn`t work at all + * It couldn`t find the field _name because it is an integer in + * the metadata and not a string like _filename for the + * statedump_file_descriptor + */ + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + procname = bt_ctf_get_char_array(bt_ctf_get_field(call_data, + scope, "_name")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing process name context info\n"); + goto error; + } + + proc = find_process_tid(<tngtop, tid, procname); + if (proc == NULL) + proc = add_proc(<tngtop, tid, procname, timestamp); + + free(proc->comm); + proc->comm = strdup(procname); + proc->pid = pid; + + /* + * FIXME + * I would like to free procname because it is duplicated + * when the process is created but it segfaults... + * + * free(procname); + */ + + return BT_CB_OK; + +error: + return BT_CB_ERROR_STOP; +}