X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fcommon.c;h=5bbbf992d0adc34279e6ed7ea16eec2bc86e60f8;hp=b18eafd554569fa14f26dfa9135246406884def4;hb=0d91c12a62aa85d1d1d8b5478e81d38e06f2cc00;hpb=59288610ca44efca4b68b954b7ffccd06fecd2b7 diff --git a/src/common.c b/src/common.c index b18eafd..5bbbf99 100644 --- a/src/common.c +++ b/src/common.c @@ -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_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; +}