Used event_by_id
[lttv.git] / ltt / branches / poly / lttv / lttv / state.c
index 07ecfc46603e30cd67d76d11d5f141fb182e945e..3084b429c668e5430f678a0191908e91987e4107 100644 (file)
@@ -510,8 +510,7 @@ static void copy_process_state(gpointer key, gpointer value,gpointer user_data)
     g_array_index(new_process->user_stack, guint64, i) =
         g_array_index(process->user_stack, guint64, i);
   }
-  new_process->current_function = &g_array_index(new_process->user_stack, 
-      guint64, new_process->user_stack->len - 1);
+  new_process->current_function = process->current_function;
   g_hash_table_insert(new_processes, new_process, new_process);
 }
 
@@ -865,85 +864,91 @@ create_name_tables(LttvTraceState *tcs)
     name_tables->eventtype_names[i] = g_quark_from_string(fe_name->str);    
   }
 #endif //0
-  if(lttv_trace_find_hook(tcs->parent.t,
+  if(!lttv_trace_find_hook(tcs->parent.t,
       LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY,
       LTT_FIELD_SYSCALL_ID, 0, 0,
-      NULL, NULL, &h))
-    return;
-  
-  thf = lttv_trace_hook_get_first(&h);
-  
-  t = ltt_field_type(thf->f1);
-  nb = ltt_type_element_number(t);
-  
-  lttv_trace_hook_destroy(&h);
+      NULL, NULL, &h)) {
+               
+               thf = lttv_trace_hook_get_first(&h);
+               
+               t = ltt_field_type(thf->f1);
+               nb = ltt_type_element_number(t);
+               
+               lttv_trace_hook_destroy(&h);
 
-  name_tables->syscall_names = g_new(GQuark, nb);
-  name_tables->nb_syscalls = nb;
+               name_tables->syscall_names = g_new(GQuark, nb);
+               name_tables->nb_syscalls = nb;
 
-  for(i = 0 ; i < nb ; i++) {
-    name_tables->syscall_names[i] = ltt_enum_string_get(t, i);
-  }
+               for(i = 0 ; i < nb ; i++) {
+                       name_tables->syscall_names[i] = ltt_enum_string_get(t, i);
+               }
 
-  //name_tables->syscall_names = g_new(GQuark, 256);
-  //for(i = 0 ; i < 256 ; i++) {
-  //  g_string_printf(fe_name, "syscall %d", i);
-  //  name_tables->syscall_names[i] = g_quark_from_string(fe_name->str);
-  //}
+               //name_tables->syscall_names = g_new(GQuark, 256);
+               //for(i = 0 ; i < 256 ; i++) {
+               //  g_string_printf(fe_name, "syscall %d", i);
+               //  name_tables->syscall_names[i] = g_quark_from_string(fe_name->str);
+               //}
+       } else {
+               name_tables->syscall_names = NULL;
+               name_tables->nb_syscalls = 0;
+       }
 
-  if(lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL,
+  if(!lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL,
         LTT_EVENT_TRAP_ENTRY,
         LTT_FIELD_TRAP_ID, 0, 0,
-        NULL, NULL, &h))
-    return;
+        NULL, NULL, &h)) {
 
-  thf = lttv_trace_hook_get_first(&h);
+               thf = lttv_trace_hook_get_first(&h);
 
-  t = ltt_field_type(thf->f1);
-  //nb = ltt_type_element_number(t);
+               t = ltt_field_type(thf->f1);
+               //nb = ltt_type_element_number(t);
 
-  lttv_trace_hook_destroy(&h);
+               lttv_trace_hook_destroy(&h);
 
-  /*
-  name_tables->trap_names = g_new(GQuark, nb);
-  for(i = 0 ; i < nb ; i++) {
-    name_tables->trap_names[i] = g_quark_from_string(
-        ltt_enum_string_get(t, i));
-  }
-  */
+               /*
+               name_tables->trap_names = g_new(GQuark, nb);
+               for(i = 0 ; i < nb ; i++) {
+                       name_tables->trap_names[i] = g_quark_from_string(
+                                       ltt_enum_string_get(t, i));
+               }
+               */
 
-  name_tables->trap_names = g_new(GQuark, 256);
-  for(i = 0 ; i < 256 ; i++) {
-    g_string_printf(fe_name, "trap %d", i);
-    name_tables->trap_names[i] = g_quark_from_string(fe_name->str);
-  }
+               name_tables->trap_names = g_new(GQuark, 256);
+               for(i = 0 ; i < 256 ; i++) {
+                       g_string_printf(fe_name, "trap %d", i);
+                       name_tables->trap_names[i] = g_quark_from_string(fe_name->str);
+               }
+       } else {
+               name_tables->trap_names = NULL;
+       }
 
-  if(lttv_trace_find_hook(tcs->parent.t,
+  if(!lttv_trace_find_hook(tcs->parent.t,
         LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY,
         LTT_FIELD_IRQ_ID, 0, 0,
-        NULL, NULL, &h))
-    return;
-  
-  thf = lttv_trace_hook_get_first(&h);
-  
-  t = ltt_field_type(thf->f1);
-  //nb = ltt_type_element_number(t);
-
-  lttv_trace_hook_destroy(&h);
+        NULL, NULL, &h)) {
+               
+               thf = lttv_trace_hook_get_first(&h);
+               
+               t = ltt_field_type(thf->f1);
+               //nb = ltt_type_element_number(t);
 
-  /*
-  name_tables->irq_names = g_new(GQuark, nb);
-  for(i = 0 ; i < nb ; i++) {
-    name_tables->irq_names[i] = g_quark_from_string(ltt_enum_string_get(t, i));
-  }
-  */
+               lttv_trace_hook_destroy(&h);
 
-  name_tables->irq_names = g_new(GQuark, 256);
-  for(i = 0 ; i < 256 ; i++) {
-    g_string_printf(fe_name, "irq %d", i);
-    name_tables->irq_names[i] = g_quark_from_string(fe_name->str);
-  }
+               /*
+               name_tables->irq_names = g_new(GQuark, nb);
+               for(i = 0 ; i < nb ; i++) {
+                       name_tables->irq_names[i] = g_quark_from_string(ltt_enum_string_get(t, i));
+               }
+               */
 
+               name_tables->irq_names = g_new(GQuark, 256);
+               for(i = 0 ; i < 256 ; i++) {
+                       g_string_printf(fe_name, "irq %d", i);
+                       name_tables->irq_names[i] = g_quark_from_string(fe_name->str);
+               }
+       } else {
+               name_tables->irq_names = NULL;
+       }
   /*
   name_tables->soft_irq_names = g_new(GQuark, nb);
   for(i = 0 ; i < nb ; i++) {
@@ -995,11 +1000,11 @@ free_name_tables(LttvTraceState *tcs)
   *(v.v_pointer) = NULL;
 
  // g_free(name_tables->eventtype_names);
-  g_free(name_tables->syscall_names);
-  g_free(name_tables->trap_names);
-  g_free(name_tables->irq_names);
-  g_free(name_tables->soft_irq_names);
-  g_free(name_tables);
+  if(name_tables->syscall_names) g_free(name_tables->syscall_names);
+  if(name_tables->trap_names) g_free(name_tables->trap_names);
+  if(name_tables->irq_names) g_free(name_tables->irq_names);
+  if(name_tables->soft_irq_names) g_free(name_tables->soft_irq_names);
+  if(name_tables) g_free(name_tables);
 } 
 
 #ifdef HASH_TABLE_DEBUG
@@ -1046,10 +1051,33 @@ static void push_state(LttvTracefileState *tfs, LttvExecutionMode t,
   es->t = t;
   es->n = state_id;
   es->entry = es->change = tfs->parent.timestamp;
+       es->cum_cpu_time = ltt_time_zero;
   es->s = process->state->s;
   process->state = es;
 }
 
+/* pop state
+ * return 1 when empty, else 0 */
+int lttv_state_pop_state_cleanup(LttvProcessState *process, 
+               LttvTracefileState *tfs)
+{ 
+       guint cpu = tfs->cpu;
+  LttvTraceState *ts = (LttvTraceState*)tfs->parent.t_context;
+
+  guint depth = process->execution_stack->len;
+
+  if(depth == 1){
+    return 1;
+  }
+
+  process->execution_stack = 
+    g_array_set_size(process->execution_stack, depth - 1);
+  process->state = &g_array_index(process->execution_stack, LttvExecutionState,
+      depth - 2);
+  process->state->change = tfs->parent.timestamp;
+       
+       return 0;
+}
 
 static void pop_state(LttvTracefileState *tfs, LttvExecutionMode t)
 {
@@ -1193,6 +1221,7 @@ lttv_state_create_process(LttvTraceState *tcs, LttvProcessState *parent,
   es->entry = *timestamp;
   //g_assert(timestamp->tv_sec != 0);
   es->change = *timestamp;
+       es->cum_cpu_time = ltt_time_zero;
   es->s = LTTV_STATE_RUN;
 
   es = process->state = &g_array_index(process->execution_stack, 
@@ -1202,6 +1231,7 @@ lttv_state_create_process(LttvTraceState *tcs, LttvProcessState *parent,
   es->entry = *timestamp;
   //g_assert(timestamp->tv_sec != 0);
   es->change = *timestamp;
+       es->cum_cpu_time = ltt_time_zero;
   es->s = LTTV_STATE_WAIT_FORK;
        
        /* Allocate an empty function call stack. If it's empty, use 0x0. */
@@ -1416,8 +1446,7 @@ static void push_function(LttvTracefileState *tfs, guint64 funcptr)
     
   new_func = &g_array_index(process->user_stack, guint64, depth);
        *new_func = funcptr;
-  process->current_function = 
-               g_array_index(process->user_stack, guint64, depth - 1);
+  process->current_function = funcptr;
 }
 
 static void pop_function(LttvTracefileState *tfs, guint64 funcptr)
@@ -1426,7 +1455,6 @@ static void pop_function(LttvTracefileState *tfs, guint64 funcptr)
   LttvTraceState *ts = (LttvTraceState*)tfs->parent.t_context;
   LttvProcessState *process = ts->running_process[cpu];
 
-  guint depth = process->user_stack->len;
   if(process->current_function != funcptr){
     g_info("Different functions (%lu.%09lu): ignore it\n",
         tfs->parent.timestamp.tv_sec, tfs->parent.timestamp.tv_nsec);
@@ -1439,6 +1467,7 @@ static void pop_function(LttvTracefileState *tfs, guint64 funcptr)
                    g_quark_to_string(process->state->s));
     return;
   }
+  guint depth = process->user_stack->len;
 
   if(depth == 0){
     g_info("Trying to pop last function on stack (%lu.%09lu): ignore it\n",
This page took 0.026336 seconds and 4 git commands to generate.