Temporary fix for large IRQ tables
[lttv.git] / lttv / lttv / state.c
index 5c6f77c095c6f331d85183bc2f3653fcfa54b148..27adae2c1abdd1a22322621c79bcee799411e286 100644 (file)
@@ -136,7 +136,9 @@ GQuark
     LTT_FIELD_ADDRESS,
     LTT_FIELD_SYMBOL,
     LTT_FIELD_IP,
-    LTT_FIELD_FD;
+    LTT_FIELD_FD,
+    LTT_FIELD_STATE,
+    LTT_FIELD_CPU_ID;
 
 LttvExecutionMode
   LTTV_STATE_MODE_UNKNOWN,
@@ -2055,10 +2057,12 @@ create_name_tables(LttvTraceState *tcs)
       name_tables->irq_names[i] = g_quark_from_string(ltt_enum_string_get(t, i));
     }
     */
+    /* FIXME: LttvIRQState *irq_states should become a g_array */
+    /* temp fix: increase from 256 to 512 default size */
 
-    name_tables->nb_irqs = 256;
-    name_tables->irq_names = g_new(GQuark, 256);
-    for(i = 0 ; i < 256 ; i++) {
+    name_tables->nb_irqs = 512;
+    name_tables->irq_names = g_new(GQuark, 512);
+    for(i = 0 ; i < 512 ; i++) {
       g_string_printf(fe_name, "irq %d", i);
       name_tables->irq_names[i] = g_quark_from_string(fe_name->str);
     }
@@ -2933,6 +2937,30 @@ static gboolean dump_softirq(void *hook_data, void *call_data)
   return FALSE;
 }
 
+static gboolean sched_try_wakeup(void *hook_data, void *call_data)
+{
+  LttvTracefileState *s = (LttvTracefileState *)call_data;
+  LttEvent *e = ltt_tracefile_get_event(s->parent.tf);
+  LttvTraceHook *th = (LttvTraceHook *)hook_data;
+  LttvProcessState *process;
+  gint woken_pid;
+  guint woken_cpu;
+
+  woken_pid = ltt_event_get_int(e, lttv_trace_get_hook_field(th, 0));
+  woken_cpu = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1));
+
+  process = lttv_state_find_process_or_create(
+                  (LttvTraceState*)s->parent.t_context,
+                  woken_cpu, woken_pid,
+                  &s->parent.timestamp);
+  process->state->s = LTTV_STATE_WAIT_CPU;
+  process->state->change = s->parent.timestamp;
+
+  g_debug("Wakeup: process %d on CPU %u\n", woken_pid, woken_cpu);
+
+  return FALSE;
+}
+
 static gboolean schedchange(void *hook_data, void *call_data)
 {
   LttvTracefileState *s = (LttvTracefileState *)call_data;
@@ -3638,6 +3666,12 @@ void lttv_state_add_event_hooks(LttvTracesetState *self)
          LTT_FIELD_PREV_STATE),
         schedchange, NULL, &hooks);
 
+    lttv_trace_find_hook(ts->parent.t,
+       LTT_CHANNEL_KERNEL,
+       LTT_EVENT_SCHED_TRY_WAKEUP,              
+       FIELD_ARRAY(LTT_FIELD_PID, LTT_FIELD_CPU_ID, LTT_FIELD_STATE),
+       sched_try_wakeup, NULL, &hooks);
+
     lttv_trace_find_hook(ts->parent.t,
         LTT_CHANNEL_KERNEL,
         LTT_EVENT_PROCESS_FORK,
@@ -4484,6 +4518,8 @@ static void module_init()
   LTT_FIELD_SYMBOL        = g_quark_from_string("symbol");
   LTT_FIELD_IP            = g_quark_from_string("ip");
   LTT_FIELD_FD            = g_quark_from_string("fd");
+  LTT_FIELD_STATE         = g_quark_from_string("state");
+  LTT_FIELD_CPU_ID        = g_quark_from_string("cpu_id");
   
   LTTV_CPU_UNKNOWN = g_quark_from_string("unknown");
   LTTV_CPU_IDLE = g_quark_from_string("idle");
This page took 0.024113 seconds and 4 git commands to generate.