X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=dd59a15a192332a9ae2f6fcf34a7586a05435458;hb=1193dd6805ea06edbd8336d6dfc01056802816ac;hp=5e7ad28292f2310d6d61de14931caffa63af5ba6;hpb=9ba3aaaf37afbed48801f7ac2223915b3237a5df;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index 5e7ad282..dd59a15a 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -134,6 +134,8 @@ static void lttv_traceset_context_compute_time_span( trace = tc->t; ltt_trace_time_span_get(trace, &s, &e); + tc->time_span.start_time = s; + tc->time_span.end_time = e; if(i==0){ time_span->start_time = s; @@ -679,7 +681,7 @@ void lttv_process_traceset_begin(LttvTracesetContext *self, } -enum read_state { LAST_NONE, LAST_OK, LAST_EMPTY }; +//enum read_state { LAST_NONE, LAST_OK, LAST_EMPTY }; /* Note : a _middle must be preceded from a _seek or another middle */ guint lttv_process_traceset_middle(LttvTracesetContext *self, @@ -699,7 +701,7 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, guint read_ret; - enum read_state last_read_state = LAST_NONE; + //enum read_state last_read_state = LAST_NONE; gboolean last_ret = FALSE; /* return value of the last hook list called */ @@ -753,19 +755,19 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, g_tree_foreach(pqueue, test_tree, tfc); #endif //DEBUG + e = ltt_tracefile_get_event(tfc->tf); - if(last_read_state != LAST_EMPTY) { - /* Only call hooks if the last read has given an event or if we are at the - * first pass (not if last read returned end of tracefile) */ - count++; - - fac_id = ltt_event_facility_id(e); - ev_id = ltt_event_eventtype_id(e); - id = GET_HOOK_ID(fac_id, ev_id); - last_ret = lttv_hooks_call_merge(tfc->event, tfc, - lttv_hooks_by_id_get(tfc->event_by_id, id), tfc); - } + //if(last_read_state != LAST_EMPTY) { + /* Only call hooks if the last read has given an event or if we are at the + * first pass (not if last read returned end of tracefile) */ + count++; + + fac_id = ltt_event_facility_id(e); + ev_id = ltt_event_eventtype_id(e); + id = GET_HOOK_ID(fac_id, ev_id); + last_ret = lttv_hooks_call_merge(tfc->event, tfc, + lttv_hooks_by_id_get(tfc->event_by_id, id), tfc); read_ret = ltt_tracefile_read(tfc->tf); @@ -781,12 +783,12 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, g_tree_foreach(pqueue, test_tree, NULL); #endif //DEBUG - last_read_state = LAST_OK; + //last_read_state = LAST_OK; } else { tfc->timestamp = ltt_time_infinite; if(read_ret == ERANGE) { - last_read_state = LAST_EMPTY; + // last_read_state = LAST_EMPTY; g_debug("End of trace"); } else g_error("Error happened in lttv_process_traceset_middle"); @@ -833,7 +835,7 @@ void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start) for(i = 0 ; i < nb_tracefile ; i++) { tfc = &g_array_index(self->tracefiles, LttvTracefileContext*, i); - //g_tree_remove(pqueue, *tfc); + g_tree_remove(pqueue, *tfc); ret = ltt_tracefile_seek_time((*tfc)->tf, start); if(ret == EPERM) g_error("error in lttv_process_trace_seek_time seek"); @@ -864,8 +866,8 @@ void lttv_process_traceset_seek_time(LttvTracesetContext *self, LttTime start) LttvTraceContext *tc; - g_tree_destroy(self->pqueue); - self->pqueue = g_tree_new(compare_tracefile); + //g_tree_destroy(self->pqueue); + //self->pqueue = g_tree_new(compare_tracefile); nb_trace = lttv_traceset_number(self->ts); for(i = 0 ; i < nb_trace ; i++) { @@ -879,16 +881,33 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, const LttvTracesetContextPosition *pos) { guint i; - - /* If a position is set, seek the traceset to this position */ + /* If a position is set, seek the traceset to this position */ if(ltt_time_compare(pos->timestamp, ltt_time_infinite) != 0) { - g_tree_destroy(self->pqueue); - self->pqueue = g_tree_new(compare_tracefile); + + /* Test to see if the traces has been added to the trace set : + * It should NEVER happen. Clear all positions if a new trace comes in. */ + /* FIXME I know this test is not optimal : should keep a number of + * tracefiles variable in the traceset.. eventually */ + guint num_traces = lttv_traceset_number(self->ts); + guint tf_count = 0; + for(i=0; itraces[i]->tracefiles; + guint j; + guint num_tracefiles = tracefiles->len; + for(j=0;jtfcp->len); + + + //g_tree_destroy(self->pqueue); + //self->pqueue = g_tree_new(compare_tracefile); for(i=0;itfcp->len; i++) { LttvTracefileContextPosition *tfcp = &g_array_index(pos->tfcp, LttvTracefileContextPosition, i); - + + g_tree_remove(self->pqueue, tfcp->tfc); if(tfcp->used == TRUE) { if(ltt_tracefile_seek_position(tfcp->tfc->tf, tfcp->event) != 0) @@ -1229,13 +1248,15 @@ gint lttv_traceset_context_pos_pos_compare( const LttvTracesetContextPosition *pos2) { int i, j; - int ret; + 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;itfcp->len;i++) { @@ -1326,7 +1347,7 @@ static gint seek_back_event_hook(void *hook_data, void* call_data) LttvTracesetContext *tsc = tfc->t_context->ts_context; LttvTracesetContextPosition *pos; - if(sd->filter != NULL) { + if(sd->filter != NULL && sd->filter->head != NULL) { if(!lttv_filter_tree_parse(sd->filter->head, ltt_tracefile_get_event(tfc->tf), tfc->tf, @@ -1390,6 +1411,7 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self, LttvTracesetContextPosition *saved_pos = lttv_traceset_context_position_new(self); LttTime time; + LttTime asked_time; LttTime time_offset; struct seek_back_data sd; LttvHooks *hooks = lttv_hooks_new(); @@ -1412,6 +1434,7 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self, 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); @@ -1420,14 +1443,15 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self, 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);