X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=30a30ba36970f4e56818d48c25efc5137edc0c29;hb=eed2ef37f908daf7b3f884b5d8f91dad03f10526;hp=af39ffdcb57c6c2f51152c3ae618404e3444ed21;hpb=1d1df11d0582bef07ef2b33e8e82a75b08f32be4;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index af39ffdc..30a30ba3 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -16,6 +16,10 @@ * MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -141,6 +145,25 @@ static void lttv_traceset_context_compute_time_span( } } +static void init_tracefile_context(LttTracefile *tracefile, + LttvTraceContext *tc) +{ + LttvTracefileContext *tfc; + LttvTracesetContext *tsc = tc->ts_context; + + tfc = LTTV_TRACESET_CONTEXT_GET_CLASS(tsc)->new_tracefile_context(tsc); + + tfc->index = tc->tracefiles->len; + tc->tracefiles = g_array_append_val(tc->tracefiles, tfc); + + tfc->tf = tracefile; + + tfc->t_context = tc; + tfc->event = lttv_hooks_new(); + tfc->event_by_id = lttv_hooks_by_id_new(); + tfc->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); +} + static void init(LttvTracesetContext *self, LttvTraceset *ts) @@ -149,9 +172,9 @@ init(LttvTracesetContext *self, LttvTraceset *ts) LttvTraceContext *tc; - LttvTracefileContext *tfc; + GData *tracefiles_groups; - LttTime null_time = {0, 0}; + struct compute_tracefile_group_args args; nb_trace = lttv_traceset_number(ts); self->ts = ts; @@ -168,6 +191,17 @@ 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); + + tracefiles_groups = ltt_trace_get_tracefiles_groups(tc->t); + + args.func = (ForEachTraceFileFunc)init_tracefile_context; + args.func_args = tc; + + g_datalist_foreach(&tracefiles_groups, + (GDataForeachFunc)compute_tracefile_group, + &args); + +#if 0 nb_control = ltt_trace_control_tracefile_number(tc->t); nb_per_cpu = ltt_trace_per_cpu_tracefile_number(tc->t); nb_tracefile = nb_control + nb_per_cpu; @@ -186,15 +220,18 @@ init(LttvTracesetContext *self, LttvTraceset *ts) tfc->control = FALSE; 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); } +#endif //0 + } self->pqueue = g_tree_new(compare_tracefile); - lttv_process_traceset_seek_time(self, null_time); + lttv_process_traceset_seek_time(self, ltt_time_zero); lttv_traceset_context_compute_time_span(self, &self->time_span); } @@ -222,18 +259,16 @@ void fini(LttvTracesetContext *self) g_object_unref(tc->a); - nb_tracefile = ltt_trace_control_tracefile_number(tc->t) + - ltt_trace_per_cpu_tracefile_number(tc->t); + nb_tracefile = tc->tracefiles->len; for(j = 0 ; j < nb_tracefile ; j++) { - tfc = tc->tracefiles[j]; - ltt_event_destroy(tfc->e); + 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_free(tc->tracefiles); + g_array_free(tc->tracefiles, TRUE); g_object_unref(tc); } g_free(self->traces); @@ -309,11 +344,11 @@ void lttv_trace_context_add_hooks(LttvTraceContext *self, LttvTracefileContext *tfc; lttv_hooks_call(before_trace, self); - nb_tracefile = ltt_trace_control_tracefile_number(self->t) + - ltt_trace_per_cpu_tracefile_number(self->t); + + nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = self->tracefiles[i]; + tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); lttv_tracefile_context_add_hooks(tfc, before_tracefile, event, @@ -333,11 +368,10 @@ void lttv_trace_context_remove_hooks(LttvTraceContext *self, LttvTracefileContext *tfc; - nb_tracefile = ltt_trace_control_tracefile_number(self->t) + - ltt_trace_per_cpu_tracefile_number(self->t); + nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = self->tracefiles[i]; + tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); lttv_tracefile_context_remove_hooks(tfc, after_tracefile, event, @@ -601,17 +635,16 @@ void lttv_process_traceset_synchronize_tracefiles(LttvTracesetContext *self) LttvTracefileContext *tfc; - nb_tracefile = ltt_trace_control_tracefile_number(tc->t) + - ltt_trace_per_cpu_tracefile_number(tc->t); + nb_tracefile = tc->tracefiles->len; for(iter_tf = 0 ; iter_tf < nb_tracefile ; iter_tf++) { - tfc = tc->tracefiles[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(tfc->e, ep); + ltt_event_position(ltt_tracefile_get_event(tfc->tf), ep); ltt_tracefile_seek_position(tfc->tf, ep); g_free(ep); @@ -654,6 +687,8 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, LttvTracefileContext *tfc; + LttEvent *e; + unsigned count = 0; gboolean last_ret = FALSE; /* return value of the last hook list called */ @@ -695,13 +730,14 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, g_tree_remove(pqueue, tfc); count++; - - id = ltt_event_eventtype_id(tfc->e); + + e = ltt_tracefile_get_event(tfc->tf); + id = ltt_event_eventtype_id(e); 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, tfc->e) != NULL)) { - tfc->timestamp = ltt_event_time(tfc->e); + if(likely(!ltt_tracefile_read(tfc->tf))) { + tfc->timestamp = ltt_event_time(e); g_tree_insert(pqueue, tfc, tfc); } } @@ -729,21 +765,21 @@ void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start) { guint i, nb_tracefile; + gint ret; + LttvTracefileContext *tfc; GTree *pqueue = self->ts_context->pqueue; - nb_tracefile = ltt_trace_control_tracefile_number(self->t) + - ltt_trace_per_cpu_tracefile_number(self->t); + nb_tracefile = self->tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { - tfc = self->tracefiles[i]; - ltt_tracefile_seek_time(tfc->tf, start); + 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); - if(likely(ltt_tracefile_read(tfc->tf, tfc->e) != NULL)) { - tfc->timestamp = ltt_event_time(tfc->e); - g_tree_insert(pqueue, tfc, tfc); - } + tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); + g_tree_insert(pqueue, tfc, tfc); } } @@ -771,10 +807,8 @@ gboolean lttv_process_tracefile_seek_position(LttvTracefileContext *self, ltt_tracefile_seek_position(tfc->tf, pos); g_tree_remove(pqueue, tfc); - if(likely(ltt_tracefile_read(tfc->tf, tfc->e) != NULL)) { - tfc->timestamp = ltt_event_time(tfc->e); - g_tree_insert(pqueue, tfc, tfc); - } + tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); + g_tree_insert(pqueue, tfc, tfc); return TRUE; } @@ -786,14 +820,13 @@ gboolean lttv_process_trace_seek_position(LttvTraceContext *self, LttvTracefileContext *tfc; - nb_tracefile = ltt_trace_control_tracefile_number(self->t) + - ltt_trace_per_cpu_tracefile_number(self->t); + nb_tracefile = self->tracefiles->len; if(nb_tracefile != pos->nb_tracefile) return FALSE; /* Error */ for(i = 0 ; i < nb_tracefile ; i++) { - tfc = self->tracefiles[i]; + tfc = &g_array_index(self->tracefiles, LttvTracefileContext, i); lttv_process_tracefile_seek_position(tfc, pos->tf_pos[i]); } @@ -826,7 +859,7 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, static LttField * -find_field(LttEventType *et, const char *field) +find_field(LttEventType *et, const GQuark field) { LttType *t; @@ -834,44 +867,138 @@ find_field(LttEventType *et, const char *field) guint i, nb; - char *name; - - if(field == NULL) return NULL; + GQuark name; + /* Field is unset */ + if(field == 0) return NULL; + f = ltt_eventtype_field(et); t = ltt_eventtype_type(et); g_assert(ltt_type_class(t) == LTT_STRUCT); nb = ltt_type_member_number(t); for(i = 0 ; i < nb ; i++) { ltt_type_member_type(t, i, &name); - if(strcmp(name, field) == 0) break; + if(name == field) break; } g_assert(i < nb); return ltt_field_member(f, i); } +LttvTraceHookByFacility *lttv_trace_hook_get_fac(LttvTraceHook *th, + guint facility_id) +{ + return &g_array_index(th->fac_index, LttvTraceHookByFacility, facility_id); +} + +/* Get the first facility corresponding to the name. As the types must be + * compatible, it is relevant to use the field name and sizes of the first + * facility to create data structures and assume the data will be compatible + * thorough the trace */ +LttvTraceHookByFacility *lttv_trace_hook_get_first(LttvTraceHook *th) +{ + g_assert(th->fac_list->len > 0); + return g_array_index(th->fac_list, LttvTraceHookByFacility*, 0); +} + -void -lttv_trace_find_hook(LttTrace *t, char *facility, char *event_type, - char *field1, char *field2, char *field3, LttvHook h, LttvTraceHook *th) +/* Returns 0 on success, -1 if fails. */ +gint +lttv_trace_find_hook(LttTrace *t, GQuark facility, GQuark event, + GQuark field1, GQuark field2, GQuark field3, LttvHook h, LttvTraceHook *th) { LttFacility *f; - LttEventType *et; + LttEventType *et, *first_et; + + GArray *facilities; + + guint i, fac_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, + sizeof(LttvTraceHookByFacility), + NUM_FACILITIES); + th->fac_index = g_array_set_size(th->fac_index, NUM_FACILITIES); + + th->fac_list = g_array_sized_new(FALSE, TRUE, + sizeof(LttvTraceHookByFacility*), + facilities->len); + th->fac_list = g_array_set_size(th->fac_list, facilities->len); + + 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)); + 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; + thf->h = h; + thf->id = ltt_eventtype_id(et); + thf->f1 = find_field(et, field1); + thf->f2 = find_field(et, field2); + thf->f3 = find_field(et, field3); + + first_thf = thf; + + /* Check for type compatibility too */ + for(i=1;ilen;i++) { + fac_id = g_array_index(facilities, guint, i); + f = ltt_trace_get_facility_by_num(t, fac_id); + + et = ltt_facility_eventtype_get_by_name(f, ltt_eventtype_name(et)); + 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; + thf->h = h; + thf->id = ltt_eventtype_id(et); + thf->f1 = find_field(et, field1); + if(check_fields_compatibility(first_et, et, + first_thf->f1, thf->f1)) + goto type_error; + + thf->f2 = find_field(et, field2); + if(check_fields_compatibility(first_et, et, + first_thf->f2, thf->f2)) + goto type_error; + + thf->f3 = find_field(et, field3); + if(check_fields_compatibility(first_et, et, + first_thf->f3, thf->f3)) + goto type_error; + } - guint nb, pos; + return 0; - nb = ltt_trace_facility_find(t, facility, &pos); - if(unlikely(nb < 1)) g_error("No %s facility", facility); - f = ltt_trace_facility_get(t, pos); - et = ltt_facility_eventtype_get_by_name(f, event_type); - if(unlikely(et == NULL)) g_error("Event %s does not exist", event_type); +type_error: + goto free; +event_error: + g_error("Event type %s does not exist", + g_quark_to_string(ltt_eventtype_name(et))); + goto free; +facility_error: + g_error("No %s facility", g_quark_to_string(facility)); + goto free; +free: + g_array_free(th->fac_index, TRUE); + g_array_free(th->fac_list, TRUE); + th->fac_index = NULL; + th->fac_list = NULL; + return -1; +} - th->h = h; - th->id = ltt_eventtype_id(et); - th->f1 = find_field(et, field1); - th->f2 = find_field(et, field2); - th->f3 = find_field(et, field3); +void lttv_trace_hook_destroy(LttvTraceHook *th) +{ + g_array_free(th->fac_index, TRUE); + g_array_free(th->fac_list, TRUE); } @@ -900,14 +1027,15 @@ void lttv_traceset_context_position_save(const LttvTracesetContext *self, for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { tc = self->traces[iter_trace]; - pos->t_pos[iter_trace].nb_tracefile = nb_tracefile = - ltt_trace_control_tracefile_number(tc->t) + - ltt_trace_per_cpu_tracefile_number(tc->t); + 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 = tc->tracefiles[iter_tracefile]; - event = tfc->e; + 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(); @@ -954,8 +1082,11 @@ void lttv_traceset_context_position_copy(LttvTracesetContextPosition *dest, 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; + 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] = @@ -992,16 +1123,16 @@ gint lttv_traceset_context_ctx_pos_compare(const LttvTracesetContext *self, for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) { tc = self->traces[iter_trace]; - nb_tracefile = ltt_trace_control_tracefile_number(tc->t) + - ltt_trace_per_cpu_tracefile_number(tc->t); + nb_tracefile = tc->tracefiles->len; 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 = tc->tracefiles[iter_tracefile]; - event = tfc->e; - ret = ltt_event_event_position_compare(event, + 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;