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);
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
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);
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);
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,
/* 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);