From aaecaa999a51da6f31979c3a98825545ce8e35c8 Mon Sep 17 00:00:00 2001 From: compudj Date: Tue, 13 Sep 2005 02:09:59 +0000 Subject: [PATCH] seek forward fix for good interaction with state.c git-svn-id: http://ltt.polymtl.ca/svn@1172 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/lttv/lttv/tracecontext.c | 32 ++++++++++--------- .../lttv/modules/gui/detailedevents/events.c | 29 +++++++++++++---- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index e634ca57..9eaec783 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -772,12 +772,14 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, last_ret = lttv_hooks_call_merge(tfc->event, tfc, lttv_hooks_by_id_get(tfc->event_by_id, id), tfc); +#if 0 + /* This is buggy : it won't work well with state computation */ if(unlikely(last_ret == 2)) { /* This is a case where we want to stay at this position and stop read. */ g_tree_insert(pqueue, tfc, tfc); return count - 1; } - +#endif //0 read_ret = ltt_tracefile_read(tfc->tf); @@ -1544,25 +1546,20 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) struct seek_forward_data *sd = (struct seek_forward_data*)hook_data; LttvTracefileContext *tfc = (LttvTracefileContext*)call_data; - if(sd->filter != NULL) { - if(!lttv_filter_tree_parse(sd->filter->head, + if(sd->filter == NULL || lttv_filter_tree_parse(sd->filter->head, ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) - return FALSE; - } - - - if(sd->event_count >= sd->n) - return 2; /* Stay at the same position */ - else { + tfc)) { sd->event_count++; - return FALSE; + if(sd->event_count >= sd->n) + return TRUE; } + return FALSE; } -/* Seek back n events forward from the current position +/* Seek back n events forward from the current position (1 to n) + * 0 is ok too, but it will actually do nothing. * * Parameters : * @self the trace set context @@ -1578,6 +1575,9 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, sd.event_count = 0; sd.n = n; sd.filter = filter; + + if(sd.event_count >= sd.n) return sd.event_count; + LttvHooks *hooks = lttv_hooks_new(); lttv_hooks_add(hooks, seek_forward_event_hook, &sd, LTTV_PRIO_DEFAULT); @@ -1585,13 +1585,15 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, lttv_process_traceset_begin(self, NULL, NULL, NULL, hooks, NULL); /* it will end on the end of traceset, or the fact that the - * hook returns 2. + * hook returns TRUE. */ lttv_process_traceset_middle(self, ltt_time_infinite, G_MAXUINT, NULL); /* Here, our position is either the end of traceset, or the exact position - * after n events : leave it like this. */ + * after n events : leave it like this. This might be placed on an event that + * will be filtered out, we don't care : all we know is that the following + * event filtered in will be the right one. */ lttv_process_traceset_end(self, NULL, NULL, NULL, hooks, NULL); diff --git a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c index 8b4656b9..074a07aa 100644 --- a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c +++ b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c @@ -1188,13 +1188,27 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) LttvTracesetContextPosition *pos = lttv_traceset_context_position_new(tsc); - /* Remember the beginning position */ + /* Remember the beginning position */ if(event_viewer_data->pos->len > 0) { LttvTracesetContextPosition *first_pos = - (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos, - 0); + (LttvTracesetContextPosition*)g_ptr_array_index( + event_viewer_data->pos, + 0); lttv_traceset_context_position_copy(pos, first_pos); - g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); + + if(relative_position > 0) { + LttTime first_event_time = + lttv_traceset_context_position_get_time( + pos); + lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, + first_event_time); + lttv_process_traceset_middle(tsc, ltt_time_infinite, + G_MAXUINT, + pos); + + } else if(relative_position <= 0) { + g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); + } } else { /* There is nothing in the list : simply seek to the time value. */ lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, @@ -1423,9 +1437,10 @@ gboolean update_current_time(void * hook_data, void * call_data) /* Little trick : seek 0 events forward to get the first event * that passes the filter. The trick is to have a match function that * returns 2 : it makes the read stop and keep the last position */ - guint count; - count = lttv_process_traceset_seek_n_forward(tsc, 0, - event_viewer_data->main_win_filter); + // We don't care : this will be taken care of by the _middle. + //guint count; + //count = lttv_process_traceset_seek_n_forward(tsc, 0, + // event_viewer_data->main_win_filter); #if 0 lttv_process_traceset_seek_time(tsc, *current_time); -- 2.34.1