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);
return process;
}
-
LttvProcessState *lttv_state_find_process(LttvTracefileState *tfs,
guint pid)
{
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)
{
}
-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;
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);
}
}