}
struct _LttvTraceContextPosition {
- LttEventPosition **tf_pos; /* Position in each trace */
+ LttEventPosition **tf_pos; /* Position in each tracefile */
guint nb_tracefile; /* Number of tracefiles (check) */
};
struct _LttvTracesetContextPosition {
- LttvTraceContextPosition *t_pos; /* Position in each trace */
+ LttvTraceContextPosition *t_pos; /* Position in each trace */
guint nb_trace; /* Number of traces (check) */
+ LttTime timestamp; /* Current time at the saved position */
};
void lttv_context_init(LttvTracesetContext *self, LttvTraceset *ts)
***************************************************************************/
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;
}
}
}
tfc->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
}
}
+ self->pqueue = g_tree_new(compare_tracefile);
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);
}
/* Note : a _middle must be preceded from a _seek or another middle */
guint lttv_process_traceset_middle(LttvTracesetContext *self,
LttTime end,
- unsigned nb_events,
+ guint nb_events,
const LttvTracesetContextPosition *end_position)
{
GTree *pqueue = self->pqueue;
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 ||
- lttv_traceset_context_ctx_pos_compare(self,
- end_position) >= 0 ||
+ if(last_ret == TRUE ||
+ count >= nb_events ||
+ ((end_position==NULL)?FALSE:(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]);
}
+LttvTracesetContextPosition *ltt_traceset_context_position_new()
+{
+ return g_new(LttvTracesetContextPosition,1);
+}
+
+
void lttv_traceset_context_position_save(const LttvTracesetContext *self,
LttvTracesetContextPosition *pos)
{
LttEvent *event;
+ LttTime timestamp = self->time_span.end_time;
+
pos->nb_trace = nb_trace = lttv_traceset_number(self->ts);
pos->t_pos = g_new(LttvTraceContextPosition, nb_trace);
pos->t_pos[iter_trace].tf_pos = g_new(LttEventPosition*, nb_tracefile);
for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) {
- pos->t_pos[iter_trace].tf_pos[iter_tracefile]
- = ltt_event_position_new();
tfc = tc->tracefiles[iter_tracefile];
event = tfc->e;
- ltt_event_position(event,
- pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+ if(event!=NULL) {
+ pos->t_pos[iter_trace].tf_pos[iter_tracefile]
+ = ltt_event_position_new();
+ ltt_event_position(event,
+ pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+ } else {
+ pos->t_pos[iter_trace].tf_pos[iter_tracefile] = NULL;
+ }
+ if(ltt_time_compare(tfc->timestamp, timestamp) < 0)
+ timestamp = tfc->timestamp;
}
}
+ pos->timestamp = timestamp;
}
void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos)
for(iter_tracefile = 0; iter_tracefile <
pos->t_pos[iter_trace].nb_tracefile;
iter_tracefile++) {
-
- g_free(pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+ if(pos->t_pos[iter_trace].tf_pos[iter_tracefile] != NULL)
+ g_free(pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
}
g_free(pos->t_pos[iter_trace].tf_pos);
}
}
+void lttv_traceset_context_position_copy(LttvTracesetContextPosition *dest,
+ const LttvTracesetContextPosition *src)
+{
+ guint nb_trace, nb_tracefile;
+ guint iter_trace, iter_tracefile;
+
+ nb_trace = dest->nb_trace = src->nb_trace;
+ dest->t_pos = g_new(LttvTraceContextPosition, nb_trace);
+
+ for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) {
+
+ nb_tracefile = dest->t_pos[iter_trace].nb_tracefile =
+ src->t_pos[iter_trace].nb_tracefile;
+
+ for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) {
+ dest->t_pos[iter_trace].tf_pos[iter_tracefile] =
+ ltt_event_position_new();
+ if(src->t_pos[iter_trace].tf_pos[iter_tracefile] != NULL)
+ ltt_event_position_copy(
+ dest->t_pos[iter_trace].tf_pos[iter_tracefile],
+ src->t_pos[iter_trace].tf_pos[iter_tracefile]);
+ else
+ dest->t_pos[iter_trace].tf_pos[iter_tracefile] = NULL;
+ }
+ }
+
+ dest->timestamp = src->timestamp;
+}
+
gint lttv_traceset_context_ctx_pos_compare(const LttvTracesetContext *self,
const LttvTracesetContextPosition *pos)
{
}
+LttTime lttv_traceset_context_position_get_time(
+ const LttvTracesetContextPosition *pos)
+{
+ return pos->timestamp;
+}
+
+
+LttvTracefileContext *lttv_traceset_context_get_current_tfc(LttvTracesetContext *self)
+{
+ GTree *pqueue = self->pqueue;
+ LttvTracefileContext *tfc;
+
+ g_tree_foreach(pqueue, get_first, &tfc);
+
+ return tfc;
+}