better hash functions in state.c and processlist.c
[lttv.git] / ltt / branches / poly / lttv / lttv / state.c
index e96247403559b6455ce010745ecbcc9db9f5500d..2ff087f48d335aef3363dcd593445f0bf7bbe598 100644 (file)
@@ -41,6 +41,7 @@ LttvProcessStatus
   LTTV_STATE_UNNAMED,
   LTTV_STATE_WAIT_FORK,
   LTTV_STATE_WAIT_CPU,
+  LTTV_STATE_EXIT,
   LTTV_STATE_ZOMBIE,
   LTTV_STATE_WAIT,
   LTTV_STATE_RUN;
@@ -96,7 +97,8 @@ void lttv_state_state_saved_free(LttvTraceState *self,
 
 guint process_hash(gconstpointer key) 
 {
-  return ((const LttvProcessState *)key)->pid;
+  guint pid = ((const LttvProcessState *)key)->pid;
+  return (pid>>8 ^ pid>>4 ^ pid>>2 ^ pid) ;
 }
 
 
@@ -969,7 +971,9 @@ static gboolean schedchange(void *hook_data, void *call_data)
       g_assert(s->process->pid == 0);
     }
 
-    if(s->process->state->s != LTTV_STATE_ZOMBIE) {
+    if(s->process->state->s == LTTV_STATE_EXIT) {
+      s->process->state->s = LTTV_STATE_ZOMBIE;
+    } else {
       if(state_out == 0) s->process->state->s = LTTV_STATE_WAIT_CPU;
       else s->process->state->s = LTTV_STATE_WAIT;
     } /* FIXME : we do not remove process here, because the kernel
@@ -1008,6 +1012,7 @@ static gboolean process_fork(LttvTraceHook *trace_hook, LttvTracefileState *s)
      */
     exit_process(s, zombie_process);
   }
+  g_assert(s->process->pid != child_pid);
   lttv_state_create_process(s, s->process, child_pid);
 
   return FALSE;
@@ -1017,7 +1022,7 @@ static gboolean process_fork(LttvTraceHook *trace_hook, LttvTracefileState *s)
 static gboolean process_exit(LttvTraceHook *trace_hook, LttvTracefileState *s)
 {
   if(s->process != NULL) {
-    s->process->state->s = LTTV_STATE_ZOMBIE;
+    s->process->state->s = LTTV_STATE_EXIT;
   }
   return FALSE;
 }
@@ -1571,6 +1576,7 @@ static void module_init()
   LTTV_STATE_SUBMODE_UNKNOWN = g_quark_from_string("unknown submode");
   LTTV_STATE_SUBMODE_NONE = g_quark_from_string("(no submode)");
   LTTV_STATE_WAIT_CPU = g_quark_from_string("wait for cpu");
+  LTTV_STATE_EXIT = g_quark_from_string("exiting");
   LTTV_STATE_ZOMBIE = g_quark_from_string("zombie");
   LTTV_STATE_WAIT = g_quark_from_string("wait for I/O");
   LTTV_STATE_RUN = g_quark_from_string("running");
This page took 0.023766 seconds and 4 git commands to generate.