git-svn-id: http://ltt.polymtl.ca/svn@489 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / lttv / main / state.c
index dbdb11ce8b7f51b39f972f423fbd626ba526e461..0fa74a1c47ca25774bffca668d822a4235936575 100644 (file)
@@ -1,3 +1,21 @@
+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2003-2004 Michel Dagenais
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, 
+ * MA 02111-1307, USA.
+ */
+
 
 #include <lttv/state.h>
 #include <ltt/facility.h>
@@ -112,6 +130,8 @@ init(LttvTracesetState *self, LttvTraceset *ts)
     tc = self->parent.traces[i];
     tcs = (LttvTraceState *)tc;
     tcs->save_interval = 100000;
+    tcs->recompute_state_in_seek = TRUE;
+    tcs->saved_state_ready = FALSE;
     fill_name_tables(tcs);
 
     nb_control = ltt_trace_control_tracefile_number(tc->t);
@@ -565,7 +585,6 @@ static LttvProcessState *create_process(LttvTracefileState *tfs,
   return process;
 }
 
-
 LttvProcessState *lttv_state_find_process(LttvTracefileState *tfs, 
     guint pid)
 {
@@ -576,6 +595,19 @@ LttvProcessState *lttv_state_find_process(LttvTracefileState *tfs,
   return process;
 }
 
+LttvProcessState *lttv_state_find_process_from_trace(LttvTraceState *ts, 
+    guint pid)
+{
+  LttvProcessState *process = g_hash_table_lookup(ts->processes, 
+      GUINT_TO_POINTER(pid));
+  //We do not create a process at this level, because we can be called
+  //from outside of state.c, and therefore cannot assume a tracefile
+  //exists.
+  //if(process == NULL) process = create_process_from_trace(ts, NULL, pid);
+  return process;
+}
+
+
 
 static void exit_process(LttvTracefileState *tfs, LttvProcessState *process) 
 {
@@ -965,7 +997,7 @@ void lttv_state_save_remove_event_hooks(LttvTracesetState *self)
 }
 
 
-void lttv_state_restore_closest_state(LttvTracesetState *self, LttTime t)
+void lttv_state_traceset_seek_time_closest(LttvTracesetState *self, LttTime t)
 {
   LttvTraceset *traceset = self->parent.ts;
 
@@ -987,31 +1019,44 @@ void lttv_state_restore_closest_state(LttvTracesetState *self, LttTime t)
   for(i = 0 ; i < nb_trace ; i++) {
     tcs = (LttvTraceState *)self->parent.traces[i];
 
-    saved_states_tree = lttv_attribute_find_subdir(tcs->parent.t_a,
-        LTTV_STATE_SAVED_STATES);
-    min_pos = -1;
-    max_pos = lttv_attribute_get_number(saved_states_tree) - 1;
-    mid_pos = max_pos / 2;
-    while(min_pos < max_pos) {
-      type = lttv_attribute_get(saved_states_tree, mid_pos, &name, &value);
-      g_assert(type == LTTV_GOBJECT);
-      saved_state_tree = *((LttvAttribute **)(value.v_gobject));
-      type = lttv_attribute_get_by_name(saved_state_tree, LTTV_STATE_TIME, 
-          &value);
-      g_assert(type == LTTV_TIME);
-      if(ltt_time_compare(*(value.v_time), t) < 0) {
-        min_pos = mid_pos;
-        closest_tree = saved_state_tree;
-      }
-      else max_pos = mid_pos - 1;
+    if(tcs->recompute_state_in_seek) {
+      if(tcs->saved_state_available) {
+        saved_states_tree = lttv_attribute_find_subdir(tcs->parent.t_a,
+            LTTV_STATE_SAVED_STATES);
+        min_pos = -1;
+        max_pos = lttv_attribute_get_number(saved_states_tree) - 1;
+        mid_pos = max_pos / 2;
+        while(min_pos < max_pos) {
+          type = lttv_attribute_get(saved_states_tree, mid_pos, &name, &value);
+          g_assert(type == LTTV_GOBJECT);
+          saved_state_tree = *((LttvAttribute **)(value.v_gobject));
+          type = lttv_attribute_get_by_name(saved_state_tree, LTTV_STATE_TIME, 
+              &value);
+          g_assert(type == LTTV_TIME);
+          if(ltt_time_compare(*(value.v_time), t) < 0) {
+            min_pos = mid_pos;
+            closest_tree = saved_state_tree;
+          }
+          else max_pos = mid_pos - 1;
+
+          mid_pos = (min_pos + max_pos + 1) / 2;
+        }
+
+        /* restore the closest earlier saved state */
+        if(min_pos != -1) lttv_state_restore(tcs, closest_tree);
 
-      mid_pos = (min_pos + max_pos + 1) / 2;
+      }
+      /* There is no saved state yet we want to have it. Restart at T0 */
+      else {
+        restore_init_state(tcs);
+        lttv_process_trace_seek_time(&(tcs->parent), ltt_time_zero);
+      }
     }
-    if(min_pos == -1) {
+    /* We want to seek quickly without restoring/updating the state */
+    else {
       restore_init_state(tcs);
-      lttv_process_trace_seek_time(&(tcs->parent), ltt_time_zero);
+      lttv_process_trace_seek_time(&(tcs->parent), t);
     }
-    else lttv_state_restore(tcs, closest_tree);
   }
 }
 
This page took 0.02418 seconds and 4 git commands to generate.