Reset selected_line while switching to process_details view and back
[lttngtop.git] / src / lttngtop.c
index 107e228a42178069a087378484af1b9bdc1c459a..fa412ae6313b8fb98a54c6caecdef466e6a7ab33 100644 (file)
@@ -150,7 +150,7 @@ error:
 struct perfcounter *get_perf_counter(const char *name, struct processtop *proc,
                struct cputime *cpu)
 {
-       struct perfcounter *ret, *global;
+       struct perfcounter *ret;
        GHashTable *table;
 
        if (proc)
@@ -169,16 +169,6 @@ struct perfcounter *get_perf_counter(const char *name, struct processtop *proc,
        ret->visible = 1;
        g_hash_table_insert(table, (gpointer) strdup(name), ret);
 
-       global = g_hash_table_lookup(global_perf_liszt, (gpointer) name);
-       if (!global) {
-               global = g_new0(struct perfcounter, 1);
-               memcpy(global, ret, sizeof(struct perfcounter));
-               /* by default, sort on the first perf context */
-               if (g_hash_table_size(global_perf_liszt) == 0)
-                       global->sort = 1;
-               g_hash_table_insert(global_perf_liszt, (gpointer) strdup(name), global);
-       }
-
 end:
        return ret;
 
@@ -200,13 +190,17 @@ void update_perf_value(struct processtop *proc, struct cputime *cpu,
 }
 
 void extract_perf_counter_scope(const struct bt_ctf_event *event,
-               const struct definition *scope,
+               const struct bt_definition *scope,
                struct processtop *proc,
                struct cputime *cpu)
 {
-       struct definition const * const *list = NULL;
+       struct bt_definition const * const *list = NULL;
+       const struct bt_definition *field;
        unsigned int count;
-       int i, ret;
+       struct perfcounter *perfcounter;
+       GHashTableIter iter;
+       gpointer key;
+       int ret;
 
        if (!scope)
                goto end;
@@ -215,13 +209,17 @@ void extract_perf_counter_scope(const struct bt_ctf_event *event,
        if (ret < 0)
                goto end;
 
-       for (i = 0; i < count; i++) {
-               const char *name = bt_ctf_field_name(list[i]);
-               if (strncmp(name, "perf_", 5) == 0) {
-                       int value = bt_ctf_get_uint64(list[i]);
+       if (count == 0)
+               goto end;
+
+       g_hash_table_iter_init(&iter, global_perf_liszt);
+       while (g_hash_table_iter_next (&iter, &key, (gpointer) &perfcounter)) {
+               field = bt_ctf_get_field(event, scope, (char *) key);
+               if (field) {
+                       int value = bt_ctf_get_uint64(field);
                        if (bt_ctf_field_get_error())
                                continue;
-                       update_perf_value(proc, cpu, name, value);
+                       update_perf_value(proc, cpu, (char *) key, value);
                }
        }
 
@@ -232,7 +230,7 @@ end:
 void update_perf_counter(struct processtop *proc, const struct bt_ctf_event *event)
 {
        struct cputime *cpu;
-       const struct definition *scope;
+       const struct bt_definition *scope;
 
        cpu = get_cpu(get_cpu_id(event));
 
@@ -453,7 +451,7 @@ end_iter:
  */
 int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
                const char *format_str,
-               void (*packet_seek)(struct stream_pos *pos,
+               void (*packet_seek)(struct bt_stream_pos *pos,
                        size_t offset, int whence))
 {
        FTS *tree;
@@ -536,27 +534,40 @@ static int check_field_requirements(const struct bt_ctf_field_decl *const * fiel
                int *procname_check, int *ppid_check)
 {
        int j;
+       struct perfcounter *global;
+       const char *name;
 
        for (j = 0; j < field_cnt; j++) {
+               name = bt_ctf_get_decl_field_name(field_list[j]);
                if (*tid_check == 0) {
-                       if (strncmp(bt_ctf_get_decl_field_name(field_list[j]), "tid", 3) == 0) {
+                       if (strncmp(name, "tid", 3) == 0)
                                (*tid_check)++;
-                       }
                }
                if (*pid_check == 0) {
-                       if (strncmp(bt_ctf_get_decl_field_name(field_list[j]), "pid", 3) == 0)
+                       if (strncmp(name, "pid", 3) == 0)
                                (*pid_check)++;
                }
                if (*ppid_check == 0) {
-                       if (strncmp(bt_ctf_get_decl_field_name(field_list[j]), "ppid", 4) == 0)
+                       if (strncmp(name, "ppid", 4) == 0)
                                (*ppid_check)++;
                }
                if (*procname_check == 0) {
-                       if (strncmp(bt_ctf_get_decl_field_name(field_list[j]), "procname", 8) == 0)
+                       if (strncmp(name, "procname", 8) == 0)
                                (*procname_check)++;
                }
+               if (strncmp(name, "perf_", 5) == 0) {
+                       global = g_hash_table_lookup(global_perf_liszt, (gpointer) name);
+                       if (!global) {
+                               global = g_new0(struct perfcounter, 1);
+                               /* by default, sort on the first perf context */
+                               if (g_hash_table_size(global_perf_liszt) == 0)
+                                       global->sort = 1;
+                               global->visible = 1;
+                               g_hash_table_insert(global_perf_liszt, (gpointer) strdup(name), global);
+                       }
+               }
        }
-       /* if all checks are OK, no need to continue the checks */
+
        if (*tid_check == 1 && *pid_check == 1 && *ppid_check == 1 &&
                        *procname_check == 1)
                return 0;
@@ -588,24 +599,18 @@ int check_requirements(struct bt_context *ctx)
                ret = check_field_requirements(field_list, field_cnt,
                                &tid_check, &pid_check, &procname_check,
                                &ppid_check);
-               if (ret == 0)
-                       goto end;
 
                bt_ctf_get_decl_fields(evt_list[i], BT_EVENT_CONTEXT,
                                &field_list, &field_cnt);
                ret = check_field_requirements(field_list, field_cnt,
                                &tid_check, &pid_check, &procname_check,
                                &ppid_check);
-               if (ret == 0)
-                       goto end;
 
                bt_ctf_get_decl_fields(evt_list[i], BT_STREAM_PACKET_CONTEXT,
                                &field_list, &field_cnt);
                ret = check_field_requirements(field_list, field_cnt,
                                &tid_check, &pid_check, &procname_check,
                                &ppid_check);
-               if (ret == 0)
-                       goto end;
        }
 
        if (tid_check == 0) {
@@ -625,7 +630,6 @@ int check_requirements(struct bt_context *ctx)
                fprintf(stderr, "[error] missing procname context information\n");
        }
 
-end:
        return ret;
 }
 
This page took 0.024824 seconds and 4 git commands to generate.