Fix first restoration point and set the right state when we pop from syscall
[lttv.git] / lttv / lttv / state.c
index ffe3ba1a4178b56e10acf7a1ec56e7ca117ec3aa..d019c810da5afb9715bf770af7fea6c80397eab7 100644 (file)
 #include <lttv/state.h>
 #include <lttv/compiler.h>
 #include <lttv/traceset.h>
+#include <lttv/trace.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
+#include <babeltrace/babeltrace.h>
 
 #define PREALLOCATED_EXECUTION_STACK 10
 
@@ -409,7 +411,7 @@ static void restore_init_state(LttvTraceState *self)
 
        start_time = ltt_time_from_uint64(
                            bt_trace_handle_get_timestamp_begin(self->trace->traceset->context, 
-                                                               self->trace->id));
+                                                               self->trace->id,BT_CLOCK_REAL));
 
 
        //lttv_process_trace_seek_time(&self->parent, ltt_time_zero);
@@ -2145,9 +2147,16 @@ static void pop_state(LttvEvent *event,
 
        process->execution_stack =
                        g_array_set_size(process->execution_stack, depth - 1);
+
        process->state = &g_array_index(process->execution_stack, LttvExecutionState,
                        depth - 2);
        process->state->change = lttv_event_get_timestamp(event);
+
+       if((process->state->t == LTTV_STATE_MODE_UNKNOWN) && (t == LTTV_STATE_SYSCALL)) {
+               //Force state at running
+               process->state->t = LTTV_STATE_USER_MODE;
+               process->state->s = LTTV_STATE_RUN;
+       }
 }
 
 struct search_result {
@@ -2439,7 +2448,7 @@ static gboolean irq_entry(void *hook_data, void *call_data)
        ts = event->state;
 
        nt = ts->name_tables;
-       irq = lttv_event_get_long_unsigned(event, "irq");
+       irq = lttv_event_get_long(event, "irq");
 
        expand_irq_table(ts, irq);
 
@@ -2751,7 +2760,7 @@ static gboolean sched_try_wakeup(void *hook_data, void *call_data)
        ts = event->state;
 
        woken_pid = lttv_event_get_long(event, "tid");
-       woken_cpu = lttv_event_get_long_unsigned(event, "target_cpu");
+       woken_cpu = lttv_event_get_long(event, "target_cpu");
 
        timestamp = lttv_event_get_timestamp(event);
        process = lttv_state_find_process_or_create(
@@ -2901,7 +2910,7 @@ static gboolean process_fork(void *hook_data, void *call_data)
        /* Skip Parent PID param */
 
        /* Child PID */
-       child_pid = lttv_event_get_long_unsigned(event, "child_tid");
+       child_pid = lttv_event_get_long(event, "child_tid");
        //ts->target_pid = child_pid;
 
        /* Child TGID */
@@ -3014,7 +3023,7 @@ static gboolean process_exit(void *hook_data, void *call_data)
        ts = event->state;
        process = ts->running_process[cpu];
 
-       pid = lttv_event_get_long_unsigned(event, "tid");
+       pid = lttv_event_get_long(event, "tid");
        //s->parent.target_pid = pid;
 
        // FIXME : Add this test in the "known state" section
@@ -3044,7 +3053,7 @@ static gboolean process_free(void *hook_data, void *call_data)
        process = ts->running_process[cpu];
 
        /* PID of the process to release */
-       release_pid = lttv_event_get_long_unsigned(event, "_tid");
+       release_pid = lttv_event_get_long(event, "_tid");
        //s->parent.target_pid = release_pid;
 
        g_assert(release_pid != 0);
@@ -3297,18 +3306,18 @@ static gboolean enum_process_state(void *hook_data, void *call_data)
        timestamp = lttv_event_get_timestamp(event);
 
        /* PID */
-       pid = lttv_event_get_long_unsigned(event, "tid");
+       pid = lttv_event_get_long(event, "tid");
        //s->parent.target_pid = pid;
 
        /* Parent PID */
-       parent_pid = lttv_event_get_long_unsigned(event, "ppid");
+       parent_pid = lttv_event_get_long(event, "ppid");
 
        /* Command name */
        command = lttv_event_get_string(event, "name");
 
        /* type */
        
-       type = lttv_event_get_long_unsigned(event, "type");
+       type = lttv_event_get_long(event, "type");
 
        //FIXME: type is rarely used, enum must match possible types.
 
@@ -3317,9 +3326,8 @@ static gboolean enum_process_state(void *hook_data, void *call_data)
        /* Skip submode 5th param */
 
        /* Skip status 6th param */
-
        /* TGID */
-       tgid = lttv_event_get_long_unsigned(event, "pid");
+       tgid = lttv_event_get_long(event, "pid");
        
        if(pid == 0) {
                nb_cpus = lttv_trace_get_num_cpu(ts->trace);
@@ -3462,7 +3470,8 @@ void lttv_state_add_event_hooks(LttvTraceset *traceset)
        lttv_hooks_add(event_hook,schedchange , NULL, LTTV_PRIO_STATE); 
        lttv_hooks_add(event_hook,sched_try_wakeup , NULL, LTTV_PRIO_STATE);    
        lttv_hooks_add(event_hook,process_exit , NULL, LTTV_PRIO_STATE);        
-       lttv_hooks_add(event_hook,process_free , NULL, LTTV_PRIO_STATE);        
+       lttv_hooks_add(event_hook,process_free , NULL, LTTV_PRIO_STATE);
+       lttv_hooks_add(event_hook,process_fork , NULL, LTTV_PRIO_STATE);        
        lttv_hooks_add(event_hook,process_exec , NULL, LTTV_PRIO_STATE);        
        lttv_hooks_add(event_hook,enum_process_state , NULL, LTTV_PRIO_STATE);  
        lttv_hooks_add(event_hook,statedump_end , NULL, LTTV_PRIO_STATE);       
@@ -4172,11 +4181,12 @@ void lttv_state_traceset_seek_time_closest(LttvTraceset *traceset, LttTime t)
        LttvAttribute *saved_states_tree, *saved_state_tree, *closest_tree = NULL;
        
        LttTime closest_tree_time, restored_time;
+       guint first_restored_time = 1;
 
        //g_tree_destroy(self->parent.pqueue);
        //self->parent.pqueue = g_tree_new(compare_tracefile);
 
-       g_info("Entering seek_time_closest for time %lu.%lu", t.tv_sec, t.tv_nsec);
+       g_debug("Entering seek_time_closest for time %lu.%lu", t.tv_sec, t.tv_nsec);
 
        nb_trace = lttv_traceset_number(traceset);
        for(i = 0 ; i < nb_trace ; i++) {
@@ -4213,8 +4223,8 @@ void lttv_state_traceset_seek_time_closest(LttvTraceset *traceset, LttTime t)
 
                        /* restore the closest earlier saved state */
                        if(min_pos != -1) {
-                               if(ltt_time_compare(restored_time, closest_tree_time) == 0) {
-                                       
+                               if(first_restored_time || (ltt_time_compare(restored_time, closest_tree_time) == 0)) {
+                                       first_restored_time = 0;
                                        lttv_state_restore(tstate, closest_tree);
                                        
                                        restored_time = closest_tree_time;
This page took 0.025488 seconds and 4 git commands to generate.