***************************************************************************/
static void lttv_traceset_context_compute_time_span(
LttvTracesetContext *self,
- TimeInterval time_span)
+ TimeInterval *time_span)
{
LttvTraceset * traceset = self->ts;
int numTraces = lttv_traceset_number(traceset);
LttvTraceContext *tc;
LttTrace * trace;
- time_span.startTime.tv_sec = 0;
- time_span.startTime.tv_nsec = 0;
- time_span.endTime.tv_sec = 0;
- time_span.endTime.tv_nsec = 0;
+ time_span->start_time.tv_sec = 0;
+ time_span->start_time.tv_nsec = 0;
+ time_span->end_time.tv_sec = 0;
+ time_span->end_time.tv_nsec = 0;
for(i=0; i<numTraces;i++){
tc = self->traces[i];
ltt_trace_time_span_get(trace, &s, &e);
if(i==0){
- time_span.startTime = s;
- time_span.endTime = e;
+ time_span->start_time = s;
+ time_span->end_time = e;
}else{
- if(s.tv_sec < time_span.startTime.tv_sec
- || (s.tv_sec == time_span.startTime.tv_sec
- && s.tv_nsec < time_span.startTime.tv_nsec))
- time_span.startTime = s;
- if(e.tv_sec > time_span.endTime.tv_sec
- || (e.tv_sec == time_span.endTime.tv_sec
- && e.tv_nsec > time_span.endTime.tv_nsec))
- time_span.endTime = e;
+ if(s.tv_sec < time_span->start_time.tv_sec
+ || (s.tv_sec == time_span->start_time.tv_sec
+ && s.tv_nsec < time_span->start_time.tv_nsec))
+ time_span->start_time = s;
+ if(e.tv_sec > time_span->end_time.tv_sec
+ || (e.tv_sec == time_span->end_time.tv_sec
+ && e.tv_nsec > time_span->end_time.tv_nsec))
+ time_span->end_time = e;
}
}
}
}
}
lttv_process_traceset_seek_time(self, null_time);
- lttv_traceset_context_compute_time_span(self, self->time_span);
- self->e = NULL;
+ lttv_traceset_context_compute_time_span(self, &self->time_span);
self->pqueue = g_tree_new(compare_tracefile);
}
unsigned count = 0;
+ gboolean last_ret = FALSE; /* 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
unless the tracefile is finished or the event is later than the
while(TRUE) {
tfc = NULL;
g_tree_foreach(pqueue, get_first, &tfc);
+ /* End of traceset : tfc is NULL */
if(tfc == NULL)
{
- self->e = event;
return count;
}
* break the loop.
*/
- if(count >= nb_events ||
+ if(last_ret == TRUE ||
+ count >= nb_events ||
lttv_traceset_context_ctx_pos_compare(self,
end_position) >= 0 ||
ltt_time_compare(tfc->timestamp, end) >= 0)
{
- self->e = event;
return count;
}
count++;
id = ltt_event_eventtype_id(tfc->e);
- lttv_hooks_call_merge(tfc->event, tfc,
+ last_ret = lttv_hooks_call_merge(tfc->event, tfc,
lttv_hooks_by_id_get(tfc->event_by_id, id), tfc);
event = ltt_tracefile_read(tfc->tf);
if(event != NULL) {
tfc->e = event;
tfc->timestamp = ltt_event_time(event);
- if(tfc->timestamp.tv_sec < end.tv_sec ||
- (tfc->timestamp.tv_sec == end.tv_sec &&
- tfc->timestamp.tv_nsec <= end.tv_nsec))
- g_tree_insert(pqueue, tfc, tfc);
+ g_tree_insert(pqueue, tfc, tfc);
}
}
}
LttEvent *event;
+ GTree *pqueue = self->ts_context->pqueue;
+
nb_tracefile = ltt_trace_control_tracefile_number(self->t) +
ltt_trace_per_cpu_tracefile_number(self->t);
for(i = 0 ; i < nb_tracefile ; i++) {
tfc = self->tracefiles[i];
ltt_tracefile_seek_time(tfc->tf, start);
+ g_tree_remove(pqueue, tfc);
event = ltt_tracefile_read(tfc->tf);
tfc->e = event;
if(event != NULL) {
tfc->timestamp = ltt_event_time(event);
- g_tree_insert(self->ts_context->pqueue, tfc, tfc);
+ g_tree_insert(pqueue, tfc, tfc);
}
}
}
LttvTracefileContext *tfc;
- /* Empty the pqueue */
-
- while(TRUE){
- tfc = NULL;
- g_tree_foreach(self->pqueue, get_first, &tfc);
- if(tfc == NULL) break;
- g_tree_remove(self->pqueue, &(tfc->timestamp));
- }
-
nb_trace = lttv_traceset_number(self->ts);
for(i = 0 ; i < nb_trace ; i++) {
tc = self->traces[i];
}
+gboolean lttv_process_tracefile_seek_position(LttvTracefileContext *self,
+ const LttEventPosition *pos)
+{
+ LttvTracefileContext *tfc = self;
+
+ LttEvent *event;
+
+ GTree *pqueue = self->t_context->ts_context->pqueue;
+
+ ltt_tracefile_seek_position(tfc->tf, pos);
+ g_tree_remove(pqueue, tfc);
+ event = ltt_tracefile_read(tfc->tf);
+ tfc->e = event;
+ if(event != NULL) {
+ tfc->timestamp = ltt_event_time(event);
+ g_tree_insert(pqueue, tfc, tfc);
+ }
+
+
+}
+
gboolean lttv_process_trace_seek_position(LttvTraceContext *self,
const LttvTraceContextPosition *pos)
{
for(i = 0 ; i < nb_tracefile ; i++) {
tfc = self->tracefiles[i];
- ltt_tracefile_seek_position(tfc->tf, pos->tf_pos[i]);
- event = ltt_tracefile_read(tfc->tf);
- tfc->e = event;
- if(event != NULL) {
- tfc->timestamp = ltt_event_time(event);
- g_tree_insert(self->ts_context->pqueue, tfc, tfc);
- }
+ lttv_process_tracefile_seek_position(tfc, pos->tf_pos[i]);
}
return TRUE;
if(nb_trace != pos->nb_trace)
return FALSE; /* Error */
- /* Empty the pqueue */
-
- while(TRUE){
- tfc = NULL;
- g_tree_foreach(self->pqueue, get_first, &tfc);
- if(tfc == NULL) break;
- g_tree_remove(self->pqueue, &(tfc->timestamp));
- }
-
for(i = 0 ; i < nb_trace ; i++) {
tc = self->traces[i];
sum_ret = sum_ret && lttv_process_trace_seek_position(tc, &pos->t_pos[i]);