X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=970da06454407f05b1bea32c6f0b9c5ffc3c5084;hb=e05fc742955a6cef80d4e2ab88dd589bace6b6c8;hp=30a30ba36970f4e56818d48c25efc5137edc0c29;hpb=eed2ef37f908daf7b3f884b5d8f91dad03f10526;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index 30a30ba3..970da064 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -26,11 +26,12 @@ #include #include #include +#include -static gint compare_tracefile(gconstpointer a, gconstpointer b) +gint compare_tracefile(gconstpointer a, gconstpointer b) { gint comparison = 0; @@ -38,7 +39,7 @@ static gint compare_tracefile(gconstpointer a, gconstpointer b) const LttvTracefileContext *trace_b = (const LttvTracefileContext *)b; if(likely(trace_a != trace_b)) { - comparison = ltt_time_compare(trace_a->timestamp, trace_b->timestamp); + comparison = ltt_time_compare(trace_b->timestamp, trace_a->timestamp); if(unlikely(comparison == 0)) { if(trace_a->index < trace_b->index) comparison = -1; else if(trace_a->index > trace_b->index) comparison = 1; @@ -51,14 +52,10 @@ static gint compare_tracefile(gconstpointer a, gconstpointer b) return comparison; } -struct _LttvTraceContextPosition { - LttEventPosition **tf_pos; /* Position in each tracefile */ - guint nb_tracefile; /* Number of tracefiles (check) */ -}; - struct _LttvTracesetContextPosition { - LttvTraceContextPosition *t_pos; /* Position in each trace */ - guint nb_trace; /* Number of traces (check) */ + GArray *ep; /* Array of LttEventPosition */ + GArray *tfc; /* Array of corresponding + TracefileContext* */ LttTime timestamp; /* Current time at the saved position */ }; @@ -168,11 +165,11 @@ static void init_tracefile_context(LttTracefile *tracefile, static void init(LttvTracesetContext *self, LttvTraceset *ts) { - guint i, j, nb_trace, nb_control, nb_per_cpu, nb_tracefile; + guint i, j, nb_trace; LttvTraceContext *tc; - GData *tracefiles_groups; + GData **tracefiles_groups; struct compute_tracefile_group_args args; @@ -191,15 +188,18 @@ init(LttvTracesetContext *self, LttvTraceset *ts) tc->t = lttv_trace(tc->vt); tc->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); tc->t_a = lttv_trace_attribute(tc->vt); + tc->tracefiles = g_array_sized_new(FALSE, TRUE, + sizeof(LttvTracefileContext*), 10); tracefiles_groups = ltt_trace_get_tracefiles_groups(tc->t); + if(tracefiles_groups != NULL) { + args.func = (ForEachTraceFileFunc)init_tracefile_context; + args.func_args = tc; - args.func = (ForEachTraceFileFunc)init_tracefile_context; - args.func_args = tc; - - g_datalist_foreach(&tracefiles_groups, - (GDataForeachFunc)compute_tracefile_group, - &args); + g_datalist_foreach(tracefiles_groups, + (GDataForeachFunc)compute_tracefile_group, + &args); + } #if 0 nb_control = ltt_trace_control_tracefile_number(tc->t); @@ -243,12 +243,10 @@ void fini(LttvTracesetContext *self) LttvTraceContext *tc; - LttvTracefileContext *tfc; + LttvTracefileContext **tfc; LttvTraceset *ts = self->ts; - //FIXME : segfault - g_tree_destroy(self->pqueue); g_object_unref(self->a); @@ -262,11 +260,11 @@ void fini(LttvTracesetContext *self) nb_tracefile = tc->tracefiles->len; for(j = 0 ; j < nb_tracefile ; j++) { - tfc = &g_array_index(tc->tracefiles, LttvTracefileContext, j); - lttv_hooks_destroy(tfc->event); - lttv_hooks_by_id_destroy(tfc->event_by_id); - g_object_unref(tfc->a); - g_object_unref(tfc); + tfc = &g_array_index(tc->tracefiles, LttvTracefileContext*, j); + lttv_hooks_destroy((*tfc)->event); + lttv_hooks_by_id_destroy((*tfc)->event_by_id); + g_object_unref((*tfc)->a); + g_object_unref(*tfc); } g_array_free(tc->tracefiles, TRUE); g_object_unref(tc); @@ -341,15 +339,15 @@ void lttv_trace_context_add_hooks(LttvTraceContext *self, { guint i, nb_tracefile; - LttvTracefileContext *tfc; + LttvTracefileContext **tfc; lttv_hooks_call(before_trace, self); nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); - lttv_tracefile_context_add_hooks(tfc, + tfc = &g_array_index(self->tracefiles, LttvTracefileContext*, i); + lttv_tracefile_context_add_hooks(*tfc, before_tracefile, event, event_by_id); @@ -366,13 +364,13 @@ void lttv_trace_context_remove_hooks(LttvTraceContext *self, { guint i, nb_tracefile; - LttvTracefileContext *tfc; + LttvTracefileContext **tfc; nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); - lttv_tracefile_context_remove_hooks(tfc, + tfc = &g_array_index(self->tracefiles, LttvTracefileContext*, i); + lttv_tracefile_context_remove_hooks(*tfc, after_tracefile, event, event_by_id); @@ -386,18 +384,19 @@ void lttv_tracefile_context_add_hooks(LttvTracefileContext *self, LttvHooks *event, LttvHooksById *event_by_id) { - guint i; + guint i, index; LttvHooks *hook; lttv_hooks_call(before_tracefile, self); lttv_hooks_add_list(self->event, event); - if(event_by_id != NULL) - for(i = 0; i < lttv_hooks_by_id_max_id(event_by_id); i++) { - hook = lttv_hooks_by_id_find(self->event_by_id, i); - lttv_hooks_add_list(hook, lttv_hooks_by_id_get(event_by_id, i)); + if(event_by_id != NULL) { + for(i = 0; i < event_by_id->array->len; i++) { + index = g_array_index(event_by_id->array, guint, i); + hook = lttv_hooks_by_id_find(self->event_by_id, index); + lttv_hooks_add_list(hook, lttv_hooks_by_id_get(event_by_id, index)); } - + } } void lttv_tracefile_context_remove_hooks(LttvTracefileContext *self, @@ -405,18 +404,19 @@ void lttv_tracefile_context_remove_hooks(LttvTracefileContext *self, LttvHooks *event, LttvHooksById *event_by_id) { - guint i; + guint i, index; LttvHooks *hook; - lttv_hooks_remove_list(self->event, event); - if(event_by_id != NULL) - for(i = 0; i < lttv_hooks_by_id_max_id(event_by_id); i++) { - hook = lttv_hooks_by_id_get(self->event_by_id, i); + if(event_by_id != NULL) { + for(i = 0; i < event_by_id->array->len; i++) { + index = g_array_index(event_by_id->array, guint, i); + hook = lttv_hooks_by_id_get(self->event_by_id, index); if(hook != NULL) - lttv_hooks_remove_list(hook, lttv_hooks_by_id_get(event_by_id, i)); + lttv_hooks_remove_list(hook, lttv_hooks_by_id_get(event_by_id, index)); } + } lttv_hooks_call(after_tracefile, self); } @@ -613,45 +613,27 @@ lttv_tracefile_context_get_type(void) static gboolean get_first(gpointer key, gpointer value, gpointer user_data) { + g_assert(key == value); *((LttvTracefileContext **)user_data) = (LttvTracefileContext *)value; return TRUE; } +static gboolean test_tree(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; + LttvTracefileContext *tfc = (LttvTracefileContext *)key; - LttvTraceContext *tc; + g_debug("Tracefile name %s, time %lu.%lu, tfi %u, ti %u", + g_quark_to_string(ltt_tracefile_name(tfc->tf)), + tfc->timestamp.tv_sec, tfc->timestamp.tv_nsec, + tfc->index, tfc->t_context->index); - nb_trace = lttv_traceset_number(self->ts); + if(((LttvTracefileContext *)user_data) == (LttvTracefileContext *)value) { + g_assert(compare_tracefile(user_data, value) == 0); + } else + g_assert(compare_tracefile(user_data, value) != 0); - 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 = tc->tracefiles->len; - - for(iter_tf = 0 ; iter_tf < nb_tracefile ; iter_tf++) { - tfc = &g_array_index(tc->tracefiles, LttvTracefileContext, iter_tf); - { - /* each tracefile */ - //ltt_tracefile_copy(tfc->tf_sync_data, tfc->tf); - LttEventPosition *ep = ltt_event_position_new(); - - ltt_event_position(ltt_tracefile_get_event(tfc->tf), ep); - - ltt_tracefile_seek_position(tfc->tf, ep); - g_free(ep); - } - } - } - } + //g_assert(((LttvTracefileContext *)user_data) != (LttvTracefileContext *)value); + return FALSE; } @@ -683,7 +665,7 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, { GTree *pqueue = self->pqueue; - guint id; + guint fac_id, ev_id, id; LttvTracefileContext *tfc; @@ -691,6 +673,8 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, unsigned count = 0; + guint read_ret = FALSE; + gboolean last_ret = FALSE; /* return value of the last hook list called */ /* Get the next event from the pqueue, call its hooks, @@ -716,7 +700,7 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, */ if(unlikely(last_ret == TRUE || - count >= nb_events || + ((count >= nb_events) && (nb_events != G_MAXULONG)) || (end_position!=NULL&<tv_traceset_context_ctx_pos_compare(self, end_position) == 0)|| ltt_time_compare(end, tfc->timestamp) <= 0)) @@ -727,18 +711,41 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, /* Get the tracefile with an event for the smallest time found. If two or more tracefiles have events for the same time, hope that lookup and remove are consistent. */ - + +#ifdef DEBUG + g_debug("test tree before remove"); + g_tree_foreach(pqueue, test_tree, tfc); +#endif //DEBUG g_tree_remove(pqueue, tfc); + +#ifdef DEBUG + g_debug("test tree after remove"); + g_tree_foreach(pqueue, test_tree, tfc); +#endif //DEBUG + count++; e = ltt_tracefile_get_event(tfc->tf); - id = ltt_event_eventtype_id(e); + 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(likely(!ltt_tracefile_read(tfc->tf))) { + read_ret = ltt_tracefile_read(tfc->tf); + + if(likely(!read_ret)) { + g_debug("An event is ready"); tfc->timestamp = ltt_event_time(e); + g_tree_insert(pqueue, tfc, tfc); + } else { + tfc->timestamp = ltt_time_infinite; + + if(read_ret == ERANGE) + g_debug("End of trace"); + else + g_error("Error happened in lttv_process_traceset_middle"); } } } @@ -761,25 +768,35 @@ void lttv_process_traceset_end(LttvTracesetContext *self, event_by_id); } +/* Subtile modification : + * if tracefile has no event at or after the time requested, it is not put in + * the queue, as the next read would fail. */ void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start) { guint i, nb_tracefile; gint ret; - LttvTracefileContext *tfc; + LttvTracefileContext **tfc; GTree *pqueue = self->ts_context->pqueue; nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); - ret = ltt_tracefile_seek_time(tfc->tf, start); - if(ret) g_error("error in lttv_process_trace_seek_time seek"); - g_tree_remove(pqueue, tfc); - tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); - g_tree_insert(pqueue, tfc, tfc); + tfc = &g_array_index(self->tracefiles, LttvTracefileContext*, i); + + 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"); + + if(ret == 0) { /* not ERANGE especially */ + (*tfc)->timestamp = ltt_event_time(ltt_tracefile_get_event((*tfc)->tf)); + g_tree_insert(pqueue, (*tfc), (*tfc)); + } else { + (*tfc)->timestamp = ltt_time_infinite; + } } } @@ -798,62 +815,29 @@ void lttv_process_traceset_seek_time(LttvTracesetContext *self, LttTime start) } -gboolean lttv_process_tracefile_seek_position(LttvTracefileContext *self, - const LttEventPosition *pos) -{ - LttvTracefileContext *tfc = self; - - GTree *pqueue = self->t_context->ts_context->pqueue; - - ltt_tracefile_seek_position(tfc->tf, pos); - g_tree_remove(pqueue, tfc); - tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); - g_tree_insert(pqueue, tfc, tfc); - - return TRUE; -} - -gboolean lttv_process_trace_seek_position(LttvTraceContext *self, - const LttvTraceContextPosition *pos) -{ - guint i, nb_tracefile; - - LttvTracefileContext *tfc; - - nb_tracefile = self->tracefiles->len; - - if(nb_tracefile != pos->nb_tracefile) - return FALSE; /* Error */ - - for(i = 0 ; i < nb_tracefile ; i++) { - tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); - lttv_process_tracefile_seek_position(tfc, pos->tf_pos[i]); - } - - return TRUE; -} - - - gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, const LttvTracesetContextPosition *pos) { - guint i, nb_trace; - gboolean sum_ret = TRUE; - + guint i; LttvTraceContext *tc; + LttvTracefileContext *tfc; - nb_trace = lttv_traceset_number(self->ts); + g_tree_destroy(self->pqueue); + self->pqueue = g_tree_new(compare_tracefile); - if(nb_trace != pos->nb_trace) - return FALSE; /* Error */ - - 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]); + for(i=0;iep->len; i++) { + LttEventPosition **ep = &g_array_index(pos->ep, LttEventPosition*, i); + LttvTracefileContext **tfc = + &g_array_index(pos->tfc, LttvTracefileContext*, i); + if(*ep != NULL) { + g_assert(ltt_tracefile_seek_position((*tfc)->tf, *ep) == 0); + (*tfc)->timestamp = ltt_event_time(ltt_tracefile_get_event((*tfc)->tf)); + g_tree_insert(self->pqueue, (*tfc), (*tfc)); + } else { + (*tfc)->timestamp = ltt_time_infinite; + } } - - return sum_ret; + return TRUE; } @@ -912,12 +896,12 @@ lttv_trace_find_hook(LttTrace *t, GQuark facility, GQuark event, GArray *facilities; - guint i, fac_id; + guint i, fac_id, ev_id; LttvTraceHookByFacility *thf, *first_thf; facilities = ltt_trace_facility_get_by_name(t, facility); - + if(unlikely(facilities == NULL)) goto facility_error; th->fac_index = g_array_sized_new(FALSE, TRUE, @@ -933,14 +917,16 @@ lttv_trace_find_hook(LttTrace *t, GQuark facility, GQuark event, fac_id = g_array_index(facilities, guint, 0); f = ltt_trace_get_facility_by_num(t, fac_id); - et = ltt_facility_eventtype_get_by_name(f, ltt_eventtype_name(et)); + et = ltt_facility_eventtype_get_by_name(f, event); if(unlikely(et == NULL)) goto event_error; thf = &g_array_index(th->fac_index, LttvTraceHookByFacility, fac_id); - g_array_index(th->fac_list, LttvTraceHookByFacility*, 0) - = thf; + g_array_index(th->fac_list, LttvTraceHookByFacility*, 0) = thf; + + ev_id = ltt_eventtype_id(et); + thf->h = h; - thf->id = ltt_eventtype_id(et); + thf->id = GET_HOOK_ID(fac_id, ev_id); thf->f1 = find_field(et, field1); thf->f2 = find_field(et, field2); thf->f3 = find_field(et, field3); @@ -956,10 +942,10 @@ lttv_trace_find_hook(LttTrace *t, GQuark facility, GQuark event, if(unlikely(et == NULL)) goto event_error; thf = &g_array_index(th->fac_index, LttvTraceHookByFacility, fac_id); - g_array_index(th->fac_list, LttvTraceHookByFacility*, i) - = thf; + g_array_index(th->fac_list, LttvTraceHookByFacility*, i) = thf; + ev_id = ltt_eventtype_id(et); thf->h = h; - thf->id = ltt_eventtype_id(et); + thf->id = GET_HOOK_ID(fac_id, ev_id); thf->f1 = find_field(et, field1); if(check_fields_compatibility(first_et, et, first_thf->f1, thf->f1)) @@ -1004,139 +990,119 @@ void lttv_trace_hook_destroy(LttvTraceHook *th) LttvTracesetContextPosition *lttv_traceset_context_position_new() { - return g_new(LttvTracesetContextPosition,1); + LttvTracesetContextPosition *pos = g_new(LttvTracesetContextPosition,1); + pos->ep = g_array_sized_new(FALSE, TRUE, sizeof(LttEventPosition*), + 10); + pos->tfc = g_array_sized_new(FALSE, TRUE, sizeof(LttvTracefileContext*), + 10); + pos->timestamp = ltt_time_infinite; + return pos; } - +/* Save all positions, the ones not in the pqueue will have NULL + * ep. */ void lttv_traceset_context_position_save(const LttvTracesetContext *self, LttvTracesetContextPosition *pos) { - guint nb_trace, nb_tracefile; - guint iter_trace, iter_tracefile; - - LttvTraceContext *tc; - - LttvTracefileContext *tfc; + guint i; + guint num_traces = lttv_traceset_number(self->ts); - LttEvent *event; + for(i=0; itraces[i]->tracefiles; + guint j; + guint num_tracefiles = tracefiles->len; - LttTime timestamp = self->time_span.end_time; + for(j=0;jnb_trace = nb_trace = lttv_traceset_number(self->ts); - pos->t_pos = g_new(LttvTraceContextPosition, nb_trace); - - for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { - tc = self->traces[iter_trace]; + LttEvent *event = ltt_tracefile_get_event((*tfc)->tf); + LttEventPosition *ep; - nb_tracefile = tc->tracefiles->len; - pos->t_pos[iter_trace].nb_tracefile = nb_tracefile; - - pos->t_pos[iter_trace].tf_pos = g_new(LttEventPosition*, nb_tracefile); - for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) { - tfc = &g_array_index(tc->tracefiles, LttvTracefileContext, - iter_tracefile); - event = ltt_tracefile_get_event(tfc->tf); - 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]); + if(ltt_time_compare((*tfc)->timestamp, ltt_time_infinite) != 0) { + ep = ltt_event_position_new(); + ltt_event_position(event, ep); + if(ltt_time_compare((*tfc)->timestamp, pos->timestamp) < 0) + pos->timestamp = (*tfc)->timestamp; } else { - pos->t_pos[iter_trace].tf_pos[iter_tracefile] = NULL; + ep = NULL; } - if(ltt_time_compare(tfc->timestamp, timestamp) < 0) - timestamp = tfc->timestamp; + g_array_append_val(pos->tfc, *tfc); + g_array_append_val(pos->ep, ep); } + } - pos->timestamp = timestamp; } void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos) { - guint nb_trace; - guint iter_trace, iter_tracefile; - - nb_trace = pos->nb_trace; + int i; + LttEventPosition **ep; - for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { - for(iter_tracefile = 0; iter_tracefile < - pos->t_pos[iter_trace].nb_tracefile; - 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); + for(i=0;iep->len;i++) { + ep = &g_array_index(pos->ep, LttEventPosition*, i); + if(*ep != NULL) + g_free(*ep); } - g_free(pos->t_pos); - + g_array_free(pos->ep, TRUE); + g_array_free(pos->tfc, TRUE); + g_free(pos); } void lttv_traceset_context_position_copy(LttvTracesetContextPosition *dest, const LttvTracesetContextPosition *src) { - guint nb_trace, nb_tracefile; - guint iter_trace, iter_tracefile; + int i; + LttEventPosition **src_ep, **dest_ep; - 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 = src->t_pos[iter_trace].nb_tracefile; - - dest->t_pos[iter_trace].nb_tracefile = nb_tracefile; - - dest->t_pos[iter_trace].tf_pos = g_new(LttEventPosition*, 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; - } + g_array_set_size(dest->ep, src->ep->len); + g_array_set_size(dest->tfc, src->tfc->len); + + for(i=0;iep->len;i++) { + src_ep = &g_array_index(src->ep, LttEventPosition*, i); + dest_ep = &g_array_index(dest->ep, LttEventPosition*, i); + if(*src_ep != NULL) { + *dest_ep = ltt_event_position_new(); + ltt_event_position_copy( + *dest_ep, + *src_ep); + } else + *dest_ep = NULL; + } + for(i=0;itfc->len;i++) { + g_array_index(dest->tfc, LttvTracefileContext*, i) = + g_array_index(src->tfc, LttvTracefileContext*, i); } - dest->timestamp = src->timestamp; } gint lttv_traceset_context_ctx_pos_compare(const LttvTracesetContext *self, const LttvTracesetContextPosition *pos) { - guint nb_trace, nb_tracefile; - guint iter_trace, iter_tracefile; - gint ret; - - LttvTraceContext *tc; - - LttvTracefileContext *tfc; - - LttEvent *event; - - nb_trace = lttv_traceset_number(self->ts); + int i; + int ret; - if(unlikely(pos->nb_trace != nb_trace)) - g_error("lttv_traceset_context_ctx_pos_compare : nb_trace does not match."); - - for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { - tc = self->traces[iter_trace]; - nb_tracefile = tc->tracefiles->len; + for(i=0;iep->len;i++) { + LttEventPosition *ep = g_array_index(pos->ep, LttEventPosition*, i); + LttvTracefileContext *tfc = + g_array_index(pos->tfc, LttvTracefileContext*, i); + + if(ep == NULL) { + if(ltt_time_compare(tfc->timestamp, ltt_time_infinite) != 0) { + ret = -1; + } + } else { + if(ltt_time_compare(tfc->timestamp, ltt_time_infinite) == 0) { + ret = 1; + } else { + LttEvent *event = ltt_tracefile_get_event(tfc->tf); - if(unlikely(pos->t_pos[iter_trace].nb_tracefile != nb_tracefile)) - g_error("lttv_traceset_context_ctx_pos_compare : nb_tracefile does not match."); - - for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) { - tfc = &g_array_index(tc->tracefiles, LttvTracefileContext, - iter_tracefile); - event = ltt_tracefile_get_event(tfc->tf); - ret = ltt_event_position_compare((LttEventPosition*)event, - pos->t_pos[iter_trace].tf_pos[iter_tracefile]); - if(ret != 0) - return ret; + ret = ltt_event_position_compare((LttEventPosition*)event, + ep); + } } + if(ret != 0) return ret; + } return 0; } @@ -1146,27 +1112,37 @@ gint lttv_traceset_context_pos_pos_compare( const LttvTracesetContextPosition *pos1, const LttvTracesetContextPosition *pos2) { - guint nb_trace, nb_tracefile; - guint iter_trace, iter_tracefile; + int i, j; + int ret; - gint ret; - - nb_trace = pos1->nb_trace; - if(unlikely(nb_trace != pos2->nb_trace)) - g_error("lttv_traceset_context_pos_pos_compare : nb_trace does not match."); - - for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { - - nb_tracefile = pos1->t_pos[iter_trace].nb_tracefile; - if(unlikely(nb_tracefile != pos2->t_pos[iter_trace].nb_tracefile)) - g_error("lttv_traceset_context_ctx_pos_compare : nb_tracefile does not match."); - - for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) { - ret = ltt_event_position_compare( - pos1->t_pos[iter_trace].tf_pos[iter_tracefile], - pos2->t_pos[iter_trace].tf_pos[iter_tracefile]); - if(ret != 0) - return ret; + for(i=0;iep->len;i++) { + LttEventPosition *ep1 = g_array_index(pos1->ep, LttEventPosition*, i); + LttvTracefileContext *tfc1 = g_array_index(pos1->tfc, + LttvTracefileContext*, i); + + if(ep1 != NULL) { + for(j=0;jep->len;j++) { + LttEventPosition *ep2 = g_array_index(pos2->ep, LttEventPosition*, j); + LttvTracefileContext *tfc2 = g_array_index(pos2->tfc, + LttvTracefileContext*, j); + if(tfc1 == tfc2) { + if(ep2 != NULL) + ret = ltt_event_position_compare(ep1, ep2); + else + ret = -1; + + if(ret != 0) return ret; + } + } + } else { + for(j=0;jep->len;j++) { + LttEventPosition *ep2 = g_array_index(pos2->ep, LttEventPosition*, j); + LttvTracefileContext *tfc2 = g_array_index(pos2->tfc, + LttvTracefileContext*, j); + if(tfc1 == tfc2) { + if(ep2 != NULL) ret = 1; + } + } } } return 0;