X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=657664b721e93e9381085493b420312e4825ecd3;hb=76373d36bc73cd876b20a1ca173aeb35b1209d0c;hp=98ffffa7f29aea1d066c4174886bb8c0f101ddb9;hpb=1c4347f913692f7837cdfd141d1d67d6813398aa;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index 98ffffa7..657664b7 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -21,6 +21,7 @@ #endif #include +#include #include #include #include @@ -703,7 +704,7 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, //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 @@ -766,11 +767,23 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, 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); - - read_ret = ltt_tracefile_read(tfc->tf); +#if 0 + /* This is buggy : it won't work well with state computation */ + 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; + } +#endif //0 + read_ret = ltt_tracefile_read(tfc->tf); + + if(likely(!read_ret)) { //g_debug("An event is ready"); tfc->timestamp = ltt_event_time(e); @@ -1250,11 +1263,13 @@ gint lttv_traceset_context_pos_pos_compare( 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;itfcp->len;i++) { @@ -1409,8 +1424,8 @@ 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; - LttTime last_time = ltt_time_infinite; struct seek_back_data sd; LttvHooks *hooks = lttv_hooks_new(); @@ -1432,6 +1447,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); @@ -1440,14 +1456,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); @@ -1456,11 +1473,6 @@ 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; } - /* 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 @@ -1535,24 +1547,20 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) struct seek_forward_data *sd = (struct seek_forward_data*)hook_data; LttvTracefileContext *tfc = (LttvTracefileContext*)call_data; - if(sd->filter != NULL) { - if(!lttv_filter_tree_parse(sd->filter->head, + if(sd->filter == NULL || lttv_filter_tree_parse(sd->filter->head, ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) - return FALSE; + tfc)) { + sd->event_count++; + if(sd->event_count >= sd->n) + return TRUE; } - - sd->event_count++; - - if(sd->event_count >= sd->n) - return TRUE; - else - return FALSE; + return FALSE; } -/* Seek back n events forward from the current position +/* Seek back n events forward from the current position (1 to n) + * 0 is ok too, but it will actually do nothing. * * Parameters : * @self the trace set context @@ -1568,6 +1576,9 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, sd.event_count = 0; sd.n = n; sd.filter = filter; + + if(sd.event_count >= sd.n) return sd.event_count; + LttvHooks *hooks = lttv_hooks_new(); lttv_hooks_add(hooks, seek_forward_event_hook, &sd, LTTV_PRIO_DEFAULT); @@ -1581,7 +1592,9 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, G_MAXUINT, NULL); /* Here, our position is either the end of traceset, or the exact position - * after n events : leave it like this. */ + * after n events : leave it like this. This might be placed on an event that + * will be filtered out, we don't care : all we know is that the following + * event filtered in will be the right one. */ lttv_process_traceset_end(self, NULL, NULL, NULL, hooks, NULL);