ok with new tracer
[lttv.git] / ltt / branches / poly / lttv / lttv / state.c
index 92d5af7267f6c15f52189f2e7aa9fe621717cbaf..00c37cb86149d5166749e71d9fe4c83962d87b51 100644 (file)
@@ -47,9 +47,8 @@
 GQuark
     LTT_FACILITY_KERNEL,
     LTT_FACILITY_KERNEL_ARCH,
-    LTT_FACILITY_PROCESS,
+    LTT_FACILITY_LIST,
     LTT_FACILITY_FS,
-    LTT_FACILITY_STATEDUMP,
     LTT_FACILITY_USER_GENERIC;
 
 /* Events Quarks */
@@ -63,13 +62,13 @@ GQuark
     LTT_EVENT_IRQ_EXIT,
     LTT_EVENT_SOFT_IRQ_ENTRY,
     LTT_EVENT_SOFT_IRQ_EXIT,
-    LTT_EVENT_SCHEDCHANGE,
-    LTT_EVENT_FORK,
-    LTT_EVENT_KERNEL_THREAD,
-    LTT_EVENT_EXIT,
-    LTT_EVENT_FREE,
+    LTT_EVENT_SCHED_SCHEDULE,
+    LTT_EVENT_PROCESS_FORK,
+    LTT_EVENT_KTHREAD_CREATE,
+    LTT_EVENT_PROCESS_EXIT,
+    LTT_EVENT_PROCESS_FREE,
     LTT_EVENT_EXEC,
-    LTT_EVENT_ENUM_PROCESS_STATE,
+    LTT_EVENT_PROCESS_STATE,
     LTT_EVENT_STATEDUMP_END,
     LTT_EVENT_FUNCTION_ENTRY,
     LTT_EVENT_FUNCTION_EXIT,
@@ -82,13 +81,14 @@ GQuark
     LTT_FIELD_TRAP_ID,
     LTT_FIELD_IRQ_ID,
     LTT_FIELD_SOFT_IRQ_ID,
-    LTT_FIELD_OUT,
-    LTT_FIELD_IN,
-    LTT_FIELD_OUT_STATE,
+    LTT_FIELD_PREV_PID,
+    LTT_FIELD_NEXT_PID,
+    LTT_FIELD_PREV_STATE,
     LTT_FIELD_PARENT_PID,
     LTT_FIELD_CHILD_PID,
     LTT_FIELD_PID,
     LTT_FIELD_TGID,
+    LTT_FIELD_CHILD_TGID,
     LTT_FIELD_FILENAME,
     LTT_FIELD_NAME,
     LTT_FIELD_TYPE,
@@ -1436,7 +1436,7 @@ create_name_tables(LttvTraceState *tcs)
     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_ARCH,
         LTT_EVENT_TRAP_ENTRY,
         LTT_FIELD_TRAP_ID, 0, 0,
         NULL, NULL, &h)) {
@@ -2165,8 +2165,8 @@ static gboolean schedchange(void *hook_data, void *call_data)
         process->state->change = s->parent.timestamp;
       }
       
-      if(state_out == 32)
-         exit_process(s, process); /* EXIT_DEAD */
+      if(state_out == 32 || state_out == 128)
+         exit_process(s, process); /* EXIT_DEAD || TASK_DEAD */
             /* see sched.h for states */
     }
   }
@@ -2257,7 +2257,8 @@ static gboolean process_fork(void *hook_data, void *call_data)
   return FALSE;
 }
 
-/* We stamp a newly created process as kernel_thread */
+/* We stamp a newly created process as kernel_thread.
+ * The thread should not be running yet. */
 static gboolean process_kernel_thread(void *hook_data, void *call_data)
 {
   LttvTracefileState *s = (LttvTracefileState *)call_data;
@@ -2274,7 +2275,10 @@ static gboolean process_kernel_thread(void *hook_data, void *call_data)
   s->parent.target_pid = pid;
 
   process = lttv_state_find_process(ts, ANY_CPU, pid);
-  es = &g_array_index(process->execution_stack, LttvExecutionState, 0);
+  process->execution_stack = 
+    g_array_set_size(process->execution_stack, 1);
+  es = process->state =
+    &g_array_index(process->execution_stack, LttvExecutionState, 0);
   es->t = LTTV_STATE_SYSCALL;
   process->type = LTTV_STATE_KERNEL_THREAD;
 
@@ -2362,6 +2366,7 @@ static gboolean process_exec(void *hook_data, void *call_data)
   guint cpu = s->cpu;
   LttvProcessState *process = ts->running_process[cpu];
 
+#if 0//how to use a sequence that must be transformed in a string
   /* PID of the process to release */
   guint64 name_len = ltt_event_field_element_number(e, thf->f1);
   //name = ltt_event_get_string(e, thf->f1);
@@ -2371,10 +2376,12 @@ static gboolean process_exec(void *hook_data, void *call_data)
   gchar *null_term_name = g_new(gchar, name_len+1);
   memcpy(null_term_name, name_begin, name_len);
   null_term_name[name_len] = '\0';
-
   process->name = g_quark_from_string(null_term_name);
+#endif //0
+
+  process->name = ltt_event_get_string(e, thf->f1);
   process->brand = LTTV_STATE_UNBRANDED;
-  g_free(null_term_name);
+  //g_free(null_term_name);
   return FALSE;
 }
 
@@ -2427,7 +2434,9 @@ static void fix_process(gpointer key, gpointer value,
         es->s = LTTV_STATE_RUN;
 
       if(process->execution_stack->len == 1) {
-        /* Still in user mode, means never scheduled */
+        /* Still in bottom unknown mode, means never did a system call
+        * May be either in user mode, syscall mode, running or waiting.*/
+       /* FIXME : we may be tagging syscall mode when being user mode */
         process->execution_stack =
           g_array_set_size(process->execution_stack, 2);
         es = process->state = &g_array_index(process->execution_stack, 
@@ -2438,7 +2447,8 @@ static void fix_process(gpointer key, gpointer value,
         //g_assert(timestamp->tv_sec != 0);
         es->change = *timestamp;
         es->cum_cpu_time = ltt_time_zero;
-        es->s = LTTV_STATE_WAIT;
+       if(es->s == LTTV_STATE_WAIT_FORK)
+          es->s = LTTV_STATE_WAIT;
       }
     }
   }
@@ -2679,13 +2689,13 @@ void lttv_state_add_event_hooks(LttvTracesetState *self)
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_ENTRY,
+        LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_ENTRY,
         LTT_FIELD_TRAP_ID, 0, 0,
         trap_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_EXIT,
+        LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_EXIT,
         0, 0, 0, 
         trap_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
@@ -2715,32 +2725,32 @@ void lttv_state_add_event_hooks(LttvTracesetState *self)
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_PROCESS, LTT_EVENT_SCHEDCHANGE,
-        LTT_FIELD_OUT, LTT_FIELD_IN, LTT_FIELD_OUT_STATE,
+        LTT_FACILITY_KERNEL, LTT_EVENT_SCHED_SCHEDULE,
+        LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV_STATE,
         schedchange, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_PROCESS, LTT_EVENT_FORK,
-        LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, LTT_FIELD_TGID,
+        LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FORK,
+        LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, LTT_FIELD_CHILD_TGID,
         process_fork, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_PROCESS, LTT_EVENT_KERNEL_THREAD,
+        LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_KTHREAD_CREATE,
         LTT_FIELD_PID, 0, 0,
         process_kernel_thread, NULL, &g_array_index(hooks, LttvTraceHook,
           hn++));
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_PROCESS, LTT_EVENT_EXIT,
+        LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT,
         LTT_FIELD_PID, 0, 0,
         process_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
     
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_PROCESS, LTT_EVENT_FREE,
+        LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FREE,
         LTT_FIELD_PID, 0, 0,
         process_free, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
@@ -2759,13 +2769,13 @@ void lttv_state_add_event_hooks(LttvTracesetState *self)
 
      /* statedump-related hooks */
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_STATEDUMP, LTT_EVENT_ENUM_PROCESS_STATE,
+        LTT_FACILITY_LIST, LTT_EVENT_PROCESS_STATE,
         LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME,
         enum_process_state, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
 
     ret = lttv_trace_find_hook(ts->parent.t,
-        LTT_FACILITY_STATEDUMP, LTT_EVENT_STATEDUMP_END,
+        LTT_FACILITY_LIST, LTT_EVENT_STATEDUMP_END,
         0, 0, 0,
         statedump_end, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
     if(ret) hn--;
@@ -3455,9 +3465,8 @@ static void module_init()
   
   LTT_FACILITY_KERNEL     = g_quark_from_string("kernel");
   LTT_FACILITY_KERNEL_ARCH = g_quark_from_string("kernel_arch");
-  LTT_FACILITY_PROCESS    = g_quark_from_string("process");
   LTT_FACILITY_FS    = g_quark_from_string("fs");
-  LTT_FACILITY_STATEDUMP    = g_quark_from_string("statedump");
+  LTT_FACILITY_LIST = g_quark_from_string("list");
   LTT_FACILITY_USER_GENERIC    = g_quark_from_string("user_generic");
 
   
@@ -3469,13 +3478,13 @@ static void module_init()
   LTT_EVENT_IRQ_EXIT      = g_quark_from_string("irq_exit");
   LTT_EVENT_SOFT_IRQ_ENTRY     = g_quark_from_string("soft_irq_entry");
   LTT_EVENT_SOFT_IRQ_EXIT      = g_quark_from_string("soft_irq_exit");
-  LTT_EVENT_SCHEDCHANGE   = g_quark_from_string("schedchange");
-  LTT_EVENT_FORK          = g_quark_from_string("fork");
-  LTT_EVENT_KERNEL_THREAD = g_quark_from_string("kernel_thread");
-  LTT_EVENT_EXIT          = g_quark_from_string("exit");
-  LTT_EVENT_FREE          = g_quark_from_string("free");
+  LTT_EVENT_SCHED_SCHEDULE   = g_quark_from_string("sched_schedule");
+  LTT_EVENT_PROCESS_FORK          = g_quark_from_string("process_fork");
+  LTT_EVENT_KTHREAD_CREATE = g_quark_from_string("kthread_create");
+  LTT_EVENT_PROCESS_EXIT          = g_quark_from_string("process_exit");
+  LTT_EVENT_PROCESS_FREE          = g_quark_from_string("process_free");
   LTT_EVENT_EXEC          = g_quark_from_string("exec");
-  LTT_EVENT_ENUM_PROCESS_STATE  = g_quark_from_string("enumerate_process_state");
+  LTT_EVENT_PROCESS_STATE  = g_quark_from_string("process_state");
   LTT_EVENT_STATEDUMP_END  = g_quark_from_string("statedump_end");
   LTT_EVENT_FUNCTION_ENTRY  = g_quark_from_string("function_entry");
   LTT_EVENT_FUNCTION_EXIT  = g_quark_from_string("function_exit");
@@ -3486,13 +3495,14 @@ static void module_init()
   LTT_FIELD_TRAP_ID       = g_quark_from_string("trap_id");
   LTT_FIELD_IRQ_ID        = g_quark_from_string("irq_id");
   LTT_FIELD_SOFT_IRQ_ID        = g_quark_from_string("softirq_id");
-  LTT_FIELD_OUT           = g_quark_from_string("out");
-  LTT_FIELD_IN            = g_quark_from_string("in");
-  LTT_FIELD_OUT_STATE     = g_quark_from_string("out_state");
+  LTT_FIELD_PREV_PID            = g_quark_from_string("prev_pid");
+  LTT_FIELD_NEXT_PID           = g_quark_from_string("next_pid");
+  LTT_FIELD_PREV_STATE     = g_quark_from_string("prev_state");
   LTT_FIELD_PARENT_PID    = g_quark_from_string("parent_pid");
   LTT_FIELD_CHILD_PID     = g_quark_from_string("child_pid");
   LTT_FIELD_PID           = g_quark_from_string("pid");
   LTT_FIELD_TGID          = g_quark_from_string("tgid");
+  LTT_FIELD_CHILD_TGID    = g_quark_from_string("child_tgid");
   LTT_FIELD_FILENAME      = g_quark_from_string("filename");
   LTT_FIELD_NAME          = g_quark_from_string("name");
   LTT_FIELD_TYPE          = g_quark_from_string("type");
This page took 0.046056 seconds and 4 git commands to generate.