X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=89d792c5b86021a701b514eb06670b1c191d3230;hb=58c88a41c3beff0c4c6ff7d856ab2355820d9f16;hp=d455348f465b34c0383e387d8622c53c8a3573cc;hpb=a54f091ae0fcccfd434512ae4f81b7e34a49d373;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index d455348f..89d792c5 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -45,13 +45,14 @@ gint compare_tracefile(gconstpointer a, gconstpointer b) } 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) @@ -101,7 +102,7 @@ lttv_context_new_tracefile_context(LttvTracesetContext *self) ***************************************************************************/ 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); @@ -110,10 +111,10 @@ static void lttv_traceset_context_compute_time_span( 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; itraces[i]; @@ -122,17 +123,17 @@ static void lttv_traceset_context_compute_time_span( 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; } } } @@ -183,16 +184,16 @@ init(LttvTracesetContext *self, LttvTraceset *ts) tfc->tf = ltt_trace_per_cpu_tracefile_get(tc->t, j - nb_control); } tfc->t_context = tc; + tfc->e = ltt_event_new(); tfc->event = lttv_hooks_new(); tfc->event_by_id = lttv_hooks_by_id_new(); 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); } @@ -223,6 +224,7 @@ void fini(LttvTracesetContext *self) for(j = 0 ; j < nb_tracefile ; j++) { tfc = tc->tracefiles[j]; + ltt_event_destroy(tfc->e); lttv_hooks_destroy(tfc->event); lttv_hooks_by_id_destroy(tfc->event_by_id); g_object_unref(tfc->a); @@ -576,6 +578,44 @@ gboolean get_first(gpointer key, gpointer value, gpointer user_data) { } +/* Put all the tracefiles at the tracefile context position */ +void lttv_process_traceset_synchronize_tracefiles(LttvTracesetContext *self) +{ + guint iter_trace, nb_trace; + + LttvTraceContext *tc; + + nb_trace = lttv_traceset_number(self->ts); + + for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { + tc = self->traces[iter_trace]; + { + /* each trace */ + guint iter_tf, nb_tracefile; + + LttvTracefileContext *tfc; + + nb_tracefile = ltt_trace_control_tracefile_number(tc->t) + + ltt_trace_per_cpu_tracefile_number(tc->t); + + for(iter_tf = 0 ; iter_tf < nb_tracefile ; iter_tf++) { + tfc = tc->tracefiles[iter_tf]; + { + /* each tracefile */ + //ltt_tracefile_copy(tfc->tf_sync_data, tfc->tf); + LttEventPosition *ep = ltt_event_position_new(); + + ltt_event_position(tfc->e, ep); + + ltt_tracefile_seek_position(tfc->tf, ep); + g_free(ep); + } + } + } + } +} + + void lttv_process_traceset_begin(LttvTracesetContext *self, LttvHooks *before_traceset, @@ -599,7 +639,7 @@ void lttv_process_traceset_begin(LttvTracesetContext *self, /* 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; @@ -608,8 +648,6 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, LttvTracefileContext *tfc; - LttEvent *event; - unsigned count = 0; gboolean last_ret = FALSE; /* return value of the last hook list called */ @@ -622,9 +660,9 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, 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; } @@ -638,11 +676,10 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, if(last_ret == TRUE || count >= nb_events || - lttv_traceset_context_ctx_pos_compare(self, - end_position) >= 0 || + (end_position!=NULL&<tv_traceset_context_ctx_pos_compare(self, + end_position) == 0)|| ltt_time_compare(tfc->timestamp, end) >= 0) { - self->e = event; return count; } @@ -657,14 +694,9 @@ 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); - 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); + if(ltt_tracefile_read(tfc->tf, tfc->e) != NULL) { + tfc->timestamp = ltt_event_time(tfc->e); + g_tree_insert(pqueue, tfc, tfc); } } } @@ -693,7 +725,7 @@ void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start) LttvTracefileContext *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); @@ -701,11 +733,10 @@ void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start) for(i = 0 ; i < nb_tracefile ; i++) { tfc = self->tracefiles[i]; ltt_tracefile_seek_time(tfc->tf, start); - 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_remove(pqueue, tfc); + if(ltt_tracefile_read(tfc->tf, tfc->e) != NULL) { + tfc->timestamp = ltt_event_time(tfc->e); + g_tree_insert(pqueue, tfc, tfc); } } } @@ -719,15 +750,6 @@ void lttv_process_traceset_seek_time(LttvTracesetContext *self, LttTime start) 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]; @@ -736,6 +758,25 @@ void lttv_process_traceset_seek_time(LttvTracesetContext *self, LttTime start) } +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); + if(ltt_tracefile_read(tfc->tf, tfc->e) != NULL) { + tfc->timestamp = ltt_event_time(tfc->e); + g_tree_insert(pqueue, tfc, tfc); + } + + +} + gboolean lttv_process_trace_seek_position(LttvTraceContext *self, const LttvTraceContextPosition *pos) { @@ -753,13 +794,7 @@ gboolean lttv_process_trace_seek_position(LttvTraceContext *self, 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; @@ -782,15 +817,6 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, 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]); @@ -853,6 +879,12 @@ lttv_trace_find_hook(LttTrace *t, char *facility, char *event_type, } +LttvTracesetContextPosition *lttv_traceset_context_position_new() +{ + return g_new(LttvTracesetContextPosition,1); +} + + void lttv_traceset_context_position_save(const LttvTracesetContext *self, LttvTracesetContextPosition *pos) { @@ -865,6 +897,8 @@ void lttv_traceset_context_position_save(const LttvTracesetContext *self, 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); @@ -876,14 +910,21 @@ void lttv_traceset_context_position_save(const LttvTracesetContext *self, 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) @@ -897,8 +938,8 @@ 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); } @@ -906,6 +947,35 @@ void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *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) { @@ -979,3 +1049,19 @@ gint lttv_traceset_context_pos_pos_compare( } +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 = NULL; + + g_tree_foreach(pqueue, get_first, &tfc); + + return tfc; +}