function to extract cpu_id
[lttngtop.git] / src / common.c
index e59de36c8157ffb6512f6f3a01872978f9fbe098..f628ed56d5961673017aef03c3f256913b23f080 100644 (file)
 #include <string.h>
 #include "common.h"
 
+uint64_t get_cpu_id(struct bt_ctf_event *event)
+{
+       struct definition *scope;
+       uint64_t cpu_id;
+
+       scope = bt_ctf_get_top_level_scope(event, BT_STREAM_PACKET_CONTEXT);
+       cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(event, scope, "cpu_id"));
+       if (bt_ctf_field_get_error()) {
+               fprintf(stderr, "[error] get cpu_id\n");
+               return -1ULL;
+       }
+
+       return cpu_id;
+}
+
 struct processtop *find_process_tid(struct lttngtop *ctx, int tid, char *comm)
 {
        gint i;
@@ -46,13 +61,15 @@ struct processtop* add_proc(struct lttngtop *ctx, int tid, char *comm,
                newproc->tid = tid;
                newproc->birth = timestamp;
                newproc->process_files_table = g_ptr_array_new();
+               newproc->files_history = g_new0(struct file_history, 1);
+               newproc->files_history->next = NULL;
+               newproc->totalfileread = 0;
+               newproc->totalfilewrite = 0;
+               newproc->fileread = 0;
+               newproc->filewrite = 0;
+               newproc->syscall_info = NULL;
                newproc->threads = g_ptr_array_new();
-               newproc->perf = g_hash_table_new(g_direct_hash, g_direct_equal);
-               newproc->iostream = g_new0(struct iostream, 1);
-               newproc->iostream->ret_read = 0;
-               newproc->iostream->ret_write = 0;
-               newproc->iostream->ret_total = 0;
-               newproc->iostream->syscall_info = NULL;
+               newproc->perf = g_hash_table_new(g_str_hash, g_str_equal);
                g_ptr_array_add(ctx->process_table, newproc);
        }
        newproc->comm = strdup(comm);
@@ -118,7 +135,7 @@ struct cputime* add_cpu(int cpu)
        newcpu = g_new0(struct cputime, 1);
        newcpu->id = cpu;
        newcpu->current_task = NULL;
-       newcpu->perf = g_hash_table_new(g_direct_hash, g_direct_equal);
+       newcpu->perf = g_hash_table_new(g_str_hash, g_str_equal);
 
        g_ptr_array_add(lttngtop.cpu_table, newcpu);
 
@@ -176,7 +193,7 @@ void copy_perf_counter(gpointer key, gpointer value, gpointer new_table)
        newperf->count = ((struct perfcounter *) value)->count;
        newperf->visible = ((struct perfcounter *) value)->visible;
        newperf->sort = ((struct perfcounter *) value)->sort;
-       g_hash_table_insert((GHashTable *) new_table, key, newperf);
+       g_hash_table_insert((GHashTable *) new_table, strdup(key), newperf);
 }
 
 void rotate_perfcounter() {
@@ -190,15 +207,24 @@ void rotate_perfcounter() {
 
 void cleanup_processtop()
 {
-       gint i;
+       gint i, j;
        struct processtop *tmp;
+       struct files *tmpf; /* a temporary file */
 
        for (i = 0; i < lttngtop.process_table->len; i++) {
                tmp = g_ptr_array_index(lttngtop.process_table, i);
                tmp->totalcpunsec = 0;
                tmp->threadstotalcpunsec = 0;
-               tmp->iostream->ret_read = 0;
-               tmp->iostream->ret_write = 0;
+               tmp->fileread = 0;
+               tmp->filewrite = 0;
+
+               for (j = 0; j < tmp->process_files_table->len; j++) {
+                       tmpf = g_ptr_array_index(tmp->process_files_table, j);
+                       if (tmpf != NULL) {
+                               tmpf->read = 0;
+                               tmpf->write = 0;
+                       }
+               }
        }
 }
 
@@ -217,7 +243,7 @@ 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_direct_hash, g_direct_equal);
+       dst->perf_list = g_hash_table_new(g_str_hash, g_str_equal);
 
        rotate_cputime(end);
 
@@ -230,31 +256,32 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end)
                new->threads = g_ptr_array_new();
                new->comm = strdup(tmp->comm);
                new->process_files_table = g_ptr_array_new();
-               new->perf = g_hash_table_new(g_direct_hash, g_direct_equal);
+               new->perf = g_hash_table_new(g_str_hash, g_str_equal);
                g_hash_table_foreach(tmp->perf, copy_perf_counter, new->perf);
 
-               new->iostream = g_new0(struct iostream, 1);
-               memcpy(new->iostream, tmp->iostream, sizeof(struct iostream));
                /* compute the stream speed */
-               if (end - start != 0)
-               {
-                       time = (end - start)/NSEC_PER_SEC;
-                       new->iostream->ret_read = new->iostream->ret_read/(time);
-                       new->iostream->ret_write = new->iostream->ret_write/(time);
+               if (end - start != 0) {
+                       time = (end - start) / NSEC_PER_SEC;
+                       new->fileread = new->fileread/(time);
+                       new->filewrite = new->filewrite/(time);
                }
 
                for (j = 0; j < tmp->process_files_table->len; j++) {
                        tmpfile = g_ptr_array_index(tmp->process_files_table, j);
-                       newfile = g_new0(struct files, 1);
-
-                       memcpy(newfile, tmpfile, sizeof(struct files));
-
-                       newfile->name = strdup(tmpfile->name);
-                       newfile->ref = new;
-
-                       g_ptr_array_add(new->process_files_table, newfile);
-                       g_ptr_array_add(dst->files_table, newfile);
 
+                       newfile = malloc(sizeof(struct files));
+
+                       if (tmpfile != NULL) {
+                               memcpy(newfile, tmpfile, sizeof(struct files));
+                               newfile->name = strdup(tmpfile->name);
+                               newfile->ref = new;
+                               g_ptr_array_add(new->process_files_table,
+                                               newfile);
+                               g_ptr_array_add(dst->files_table, newfile);
+                       } else {
+                               g_ptr_array_add(new->process_files_table, NULL);
+                               g_ptr_array_add(dst->files_table, NULL);
+                       }
                        /*
                         * if the process died during the last period, we remove all
                         * files associated with if after the copy
@@ -272,9 +299,11 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end)
                 */
                if (tmp->death > 0 && tmp->death < end) {
                        g_ptr_array_remove(lttngtop.process_table, tmp);
+                       /* FIXME : TRUE does not mean clears the object in it */
                        g_ptr_array_free(tmp->threads, TRUE);
                        free(tmp->comm);
                        g_ptr_array_free(tmp->process_files_table, TRUE);
+                       /* FIXME : clear elements */
                        g_hash_table_destroy(tmp->perf);
                        g_free(tmp);
                }
@@ -285,7 +314,7 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end)
                tmpcpu = g_ptr_array_index(lttngtop.cpu_table, i);
                newcpu = g_new0(struct cputime, 1);
                memcpy(newcpu, tmpcpu, sizeof(struct cputime));
-               newcpu->perf = g_hash_table_new(g_direct_hash, g_direct_equal);
+               newcpu->perf = g_hash_table_new(g_str_hash, g_str_equal);
                g_hash_table_foreach(tmpcpu->perf, copy_perf_counter, newcpu->perf);
                /*
                 * note : we don't care about the current process pointer in the copy
@@ -293,6 +322,7 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end)
                 */
                g_ptr_array_add(dst->cpu_table, newcpu);
        }
+       /* FIXME : better algo */
        /* create the threads index if required */
        for (i = 0; i < dst->process_table->len; i++) {
                tmp = g_ptr_array_index(dst->process_table, i);
This page took 0.028888 seconds and 4 git commands to generate.