//enum read_state last_read_state = LAST_NONE;
- gboolean last_ret = FALSE; /* return value of the last hook list called */
+ gint last_ret = 0; /* return value of the last hook list called */
/* Get the next event from the pqueue, call its hooks,
reinsert in the pqueue the following event from the same tracefile
fac_id = ltt_event_facility_id(e);
ev_id = ltt_event_eventtype_id(e);
id = GET_HOOK_ID(fac_id, ev_id);
+ /* Hooks :
+ * return values : 0 : continue read, 1 : go to next position and stop read,
+ * 2 : stay at the current position and stop read */
last_ret = lttv_hooks_call_merge(tfc->event, tfc,
lttv_hooks_by_id_get(tfc->event_by_id, id), tfc);
+
+ 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;
+ }
read_ret = ltt_tracefile_read(tfc->tf);
-
+
+
if(likely(!read_ret)) {
//g_debug("An event is ready");
tfc->timestamp = ltt_event_time(e);
int i, j;
int ret = 0;
- if(pos1->tfcp->len == 0) {
- if(pos2->tfcp->len == 0) return 0;
- else return 1;
+ if(ltt_time_compare(pos1->timestamp, ltt_time_infinite) == 0) {
+ if(ltt_time_compare(pos2->timestamp, ltt_time_infinite) == 0)
+ return 0;
+ else
+ return 1;
}
- if(pos2->tfcp->len == 0)
+ if(ltt_time_compare(pos2->timestamp, ltt_time_infinite) == 0)
return -1;
for(i=0;i<pos1->tfcp->len;i++) {
LttvTracesetContextPosition *saved_pos =
lttv_traceset_context_position_new(self);
LttTime time;
+ LttTime asked_time;
LttTime time_offset;
- LttTime last_time = ltt_time_infinite;
struct seek_back_data sd;
LttvHooks *hooks = lttv_hooks_new();
if(ltt_time_compare(time, self->time_span.end_time) > 0) {
time = self->time_span.end_time;
}
+ asked_time = time;
time_offset = first_offset;
lttv_hooks_add(hooks, seek_back_event_hook, &sd, LTTV_PRIO_DEFAULT);
while(1) {
/* stop criteria : - n events found
- * - time < beginning of trace */
- if(ltt_time_compare(time, self->time_span.start_time) < 0) break;
+ * - asked_time < beginning of trace */
+ if(ltt_time_compare(asked_time, self->time_span.start_time) < 0) break;
lttv_traceset_context_position_copy(end_pos, next_iter_end_pos);
/* We must seek the traceset back to time - time_offset */
/* this time becomes the new reference time */
time = ltt_time_sub(time, time_offset);
+ asked_time = time;
time_seeker(self, time);
lttv_traceset_context_position_save(self, next_iter_end_pos);
if(ltt_time_compare(time, self->time_span.end_time) > 0) {
time = self->time_span.end_time;
}
- /* if we have the same time twice, it means we are at the beginning of the
- * trace, and we seek back at the same position */
- if(ltt_time_compare(last_time, time) == 0
- && ltt_time_compare(time, self->time_span.start_time) == 0) break;
- last_time = time;
/* Process the traceset, calling a hook which adds events
* to the array, overwriting the tail. It changes first_event and
return FALSE;
}
- sd->event_count++;
if(sd->event_count >= sd->n)
- return TRUE;
- else
+ return 2; /* Stay at the same position */
+ else {
+ sd->event_count++;
return FALSE;
+ }
}
/* Seek back n events forward from the current position
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 TRUE.
+ * hook returns 2.
*/
lttv_process_traceset_middle(self, ltt_time_infinite,
G_MAXUINT, NULL);