correct process fork and exit in state.c
[lttv.git] / ltt / branches / poly / lttv / lttv / state.c
index aa235f2d27ee350580ec30ac8613198b9d900b72..05852dfb784d2c70bf44f34390ec6c9b5e610ba7 100644 (file)
@@ -448,7 +448,8 @@ static void state_restore(LttvTraceState *self, LttvAttribute *container)
     if(*(value.v_pointer) == NULL) tfcs->parent.e = NULL;
     else {
       ep = *(value.v_pointer);
-      lttv_process_tracefile_seek_position(tfcs->parent, ep);
+      g_assert(tfcs->parent.t_context != NULL);
+      lttv_process_tracefile_seek_position(LTTV_TRACEFILE_CONTEXT(tfcs), ep);
     }
   }
 }
@@ -472,6 +473,7 @@ static void state_saved_free(LttvTraceState *self, LttvAttribute *container)
 
   tracefiles_tree = lttv_attribute_find_subdir(container, 
       LTTV_STATE_TRACEFILES);
+  g_object_ref(G_OBJECT(tracefiles_tree));
   lttv_attribute_remove_by_name(container, LTTV_STATE_TRACEFILES);
 
   type = lttv_attribute_get_by_name(container, LTTV_STATE_PROCESSES, 
@@ -495,7 +497,7 @@ static void state_saved_free(LttvTraceState *self, LttvAttribute *container)
     g_assert(type == LTTV_POINTER);
     if(*(value.v_pointer) != NULL) g_free(*(value.v_pointer));
   }
-  lttv_attribute_recursive_free(tracefiles_tree);
+  g_object_unref(G_OBJECT(tracefiles_tree));
 }
 
 
@@ -522,7 +524,6 @@ static void free_saved_state(LttvTraceState *self)
   }
 
   lttv_attribute_remove_by_name(self->parent.t_a, LTTV_STATE_SAVED_STATES);
-  lttv_attribute_recursive_free(saved_states);
 }
 
 
@@ -985,8 +986,19 @@ static gboolean schedchange(void *hook_data, void *call_data)
 }
 
 
-static gboolean process_fork(void *hook_data, void *call_data)
+static gboolean process_fork(LttvTraceHook *trace_hook, LttvTracefileState *s)
 {
+  LttField *f;
+  guint child_pid;
+
+  /* Child PID */
+  f = trace_hook->f3;
+  child_pid = ltt_event_get_unsigned(s->parent.e, f);
+
+  lttv_state_create_process(s, s->process, child_pid);
+
+  return FALSE;
+#if 0
   LttField *f = ((LttvTraceHook *)hook_data)->f1;
 
   LttvTracefileState *s = (LttvTracefileState *)call_data;
@@ -996,17 +1008,43 @@ static gboolean process_fork(void *hook_data, void *call_data)
   child_pid = ltt_event_get_unsigned(s->parent.e, f);
   lttv_state_create_process(s, s->process, child_pid);
   return FALSE;
+#endif //0
 }
 
 
-static gboolean process_exit(void *hook_data, void *call_data)
+static gboolean process_exit(LttvTraceHook *trace_hook, LttvTracefileState *s)
 {
+  if(s->process != NULL) {
+    s->process->state->s = LTTV_STATE_EXIT;
+  }
+  return FALSE;
+#if 0
   LttvTracefileState *s = (LttvTracefileState *)call_data;
 
   if(s->process != NULL) {
     s->process->state->s = LTTV_STATE_EXIT;
   }
   return FALSE;
+#endif //0
+}
+
+gboolean process(void *hook_data, void *call_data)
+{
+  LttvTraceHook *trace_hook = (LttvTraceHook *)hook_data;
+  LttField *f = trace_hook->f1;
+
+  LttvTracefileState *s = (LttvTracefileState *)call_data;
+  
+  guint sub_id = ltt_event_get_unsigned(s->parent.e, f);
+
+  /* CHECK : do not hardcode the sub_id values here ? */
+  if(sub_id == 2) {
+    return process_fork(trace_hook, s);
+  } else if(sub_id == 3) {
+    return process_exit(trace_hook, s);
+  }
+  return 0;
 }
 
 
@@ -1057,12 +1095,17 @@ void lttv_state_add_event_hooks(LttvTracesetState *self)
     lttv_trace_find_hook(ts->parent.t, "core", "schedchange", "in", "out", 
         "out_state", schedchange, &g_array_index(hooks, LttvTraceHook, 6));
 
+    lttv_trace_find_hook(ts->parent.t, "core", "process", "event_sub_id", 
+        "event_data1", "event_data2", process,
+        &g_array_index(hooks, LttvTraceHook, 7));
+
+#if 0
     lttv_trace_find_hook(ts->parent.t, "core", "process_fork", "child_pid", 
         NULL, NULL, process_fork, &g_array_index(hooks, LttvTraceHook, 7));
 
     lttv_trace_find_hook(ts->parent.t, "core", "process_exit", NULL, NULL, 
         NULL, process_exit, &g_array_index(hooks, LttvTraceHook, 8));
-
+#endif //0
     /* Add these hooks to each event_by_id hooks list */
 
     nb_tracefile = ltt_trace_control_tracefile_number(ts->parent.t) +
@@ -1233,6 +1276,15 @@ void lttv_state_save_add_event_hooks(LttvTracesetState *self)
   }
 }
 
+gint lttv_state_save_hook_add_event_hooks(void *hook_data, void *call_data)
+{
+  LttvTracesetState *tss = (LttvTracesetState*)(call_data);
+
+  lttv_state_save_add_event_hooks(tss);
+
+  return 0;
+}
+
 
 void lttv_state_save_remove_event_hooks(LttvTracesetState *self)
 {
@@ -1268,6 +1320,14 @@ void lttv_state_save_remove_event_hooks(LttvTracesetState *self)
   }
 }
 
+gint lttv_state_save_hook_remove_event_hooks(void *hook_data, void *call_data)
+{
+  LttvTracesetState *tss = (LttvTracesetState*)(call_data);
+
+  lttv_state_save_remove_event_hooks(tss);
+
+  return 0;
+}
 
 void lttv_state_traceset_seek_time_closest(LttvTracesetState *self, LttTime t)
 {
This page took 0.023898 seconds and 4 git commands to generate.