X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=95d58c369b219c72c2b951696ae63e74841482f0;hb=c8948b8d1519e45adafe850bb4aa0004fa4f310b;hp=f98f812c3db1043b61f33ad1b5e12a1a19769e45;hpb=b139ad2a3bd7c28ad16f0c3faed4c62c5cb2c22b;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index f98f812c..95d58c36 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include #include @@ -688,13 +686,11 @@ 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, - guint nb_events, + gulong nb_events, const LttvTracesetContextPosition *end_position) { GTree *pqueue = self->pqueue; - guint fac_id, ev_id, id; - LttvTracefileContext *tfc; LttEvent *e; @@ -765,15 +761,12 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self, * 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); tfc->target_pid = -1; /* unset target PID */ /* 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); + lttv_hooks_by_id_get(tfc->event_by_id, e->event_id), tfc); #if 0 /* This is buggy : it won't work well with state computation */ @@ -951,144 +944,106 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, } - +#if 0 // pmf: temporary disable static LttField * find_field(LttEventType *et, const GQuark field) { - GQuark name; + LttField *f; if(field == 0) return NULL; - return ltt_eventtype_field_by_name(et, field); -} + f = ltt_eventtype_field_by_name(et, field); + if (!f) { + g_warning("Cannot find field %s in event %s.%s", g_quark_to_string(field), + g_quark_to_string(ltt_facility_name(ltt_eventtype_facility(et))), + g_quark_to_string(ltt_eventtype_name(et))); + } -LttvTraceHookByFacility *lttv_trace_hook_get_fac(LttvTraceHook *th, - guint facility_id) -{ - return &g_array_index(th->fac_index, LttvTraceHookByFacility, facility_id); + return f; } +#endif -/* 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) +struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th) { - g_assert(th->fac_list->len > 0); - return g_array_index(th->fac_list, LttvTraceHookByFacility*, 0); + return marker_get_info_from_id(t, th->id); } - -/* 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, gpointer hook_data, - LttvTraceHook *th) +int lttv_trace_find_hook(LttTrace *t, GQuark facility_name, GQuark event_name, + GQuark fields[], LttvHook h, gpointer hook_data, GArray **trace_hooks) { - LttFacility *f; - - LttEventType *et, *first_et; - - GArray *facilities; - - 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, - 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, 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; + struct marker_info *info; + guint16 marker_id; + int init_array_size; + GQuark marker_name; - ev_id = ltt_eventtype_id(et); - - thf->h = h; - 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); - thf->hook_data = hook_data; - - first_thf = thf; - first_et = et; + marker_name = lttv_merge_facility_event_name(facility_name, event_name); - /* 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, 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; - ev_id = ltt_eventtype_id(et); - thf->h = h; - 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)) - 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; - thf->hook_data = hook_data; + info = marker_get_info_from_name(t, marker_name); + if(unlikely(info == NULL)) { + g_warning("No marker of name %s found", g_quark_to_string(marker_name)); + return 1; } + init_array_size = (*trace_hooks)->len; + + /* for each marker with the requested name */ + do { + LttvTraceHook tmpth; + int found; + GQuark *f; + struct marker_field *marker_field; + + marker_id = marker_get_id_from_info(t, info); + + tmpth.h = h; + tmpth.id = marker_id; + tmpth.hook_data = hook_data; + tmpth.fields = g_ptr_array_new(); + + /* for each field requested */ + for(f = fields; f && *f != 0; f++) { + found = 0; + for_each_marker_field(marker_field, info) { + if(marker_field->name == *f) { + found = 1; + g_ptr_array_add(tmpth.fields, marker_field); + break; + } + } + if(!found) { + /* Did not find the one of the fields in this instance of the + marker. Print a warning and skip this marker completely. + Still iterate on other markers with same name. */ + g_ptr_array_free(tmpth.fields, TRUE); + g_warning("Field %s cannot be found in marker %s", + g_quark_to_string(*f), g_quark_to_string(marker_name)); + goto skip_marker; + } + } + /* all fields were found: add the tracehook to the array */ + *trace_hooks = g_array_append_val(*trace_hooks, tmpth); +skip_marker: + info = info->next; + } while(info != NULL); + + /* Error if no new trace hook has been added */ + if (init_array_size == (*trace_hooks)->len) { + g_warning("No marker of name %s has all requested fields", + g_quark_to_string(marker_name)); + return 1; + } return 0; - -type_error: - goto free; -event_error: - g_error("Event type does not exist for event %s", - g_quark_to_string(event)); - goto free; -facility_error: - //Ignore this type of error : some facilities are not required. - //g_error("No %s facility", g_quark_to_string(facility)); - return -1; -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; } -void lttv_trace_hook_destroy(LttvTraceHook *th) +void lttv_trace_hook_remove_all(GArray **th) { - g_array_free(th->fac_index, TRUE); - g_array_free(th->fac_list, TRUE); + int i; + for(i=0; i<(*th)->len; i++) { + g_ptr_array_free(g_array_index(*th, LttvTraceHook, i).fields, TRUE); + } + *th = g_array_remove_range(*th, 0, (*th)->len); } - - - LttvTracesetContextPosition *lttv_traceset_context_position_new( const LttvTracesetContext *self) { @@ -1340,6 +1295,7 @@ struct seek_back_data { LttvFilter *filter1; LttvFilter *filter2; LttvFilter *filter3; + gpointer data; check_handler *check; gboolean *stop_flag; guint raw_event_count; @@ -1352,7 +1308,8 @@ static gint seek_back_event_hook(void *hook_data, void* call_data) LttvTracesetContext *tsc = tfc->t_context->ts_context; LttvTracesetContextPosition *pos; - if(sd->check && sd->check(sd->raw_event_count, sd->stop_flag)) return TRUE; + if(sd->check && sd->check(sd->raw_event_count, sd->stop_flag, sd->data)) + return TRUE; sd->raw_event_count++; if(sd->filter1 != NULL && sd->filter1->head != NULL && @@ -1360,7 +1317,7 @@ static gint seek_back_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } if(sd->filter2 != NULL && sd->filter2->head != NULL && @@ -1368,7 +1325,7 @@ static gint seek_back_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } if(sd->filter3 != NULL && sd->filter3->head != NULL && @@ -1376,7 +1333,7 @@ static gint seek_back_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } @@ -1426,7 +1383,8 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self, gboolean *stop_flag, LttvFilter *filter1, LttvFilter *filter2, - LttvFilter *filter3) + LttvFilter *filter3, + gpointer data) { if(lttv_traceset_number(self->ts) == 0) return 0; g_assert(ltt_time_compare(first_offset, ltt_time_zero) != 0); @@ -1450,6 +1408,7 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self, sd.filter1 = filter1; sd.filter2 = filter2; sd.filter3 = filter3; + sd.data = data; sd.n = n; sd.check = check; sd.stop_flag = stop_flag; @@ -1562,6 +1521,7 @@ struct seek_forward_data { LttvFilter *filter1; LttvFilter *filter2; LttvFilter *filter3; + gpointer data; check_handler *check; gboolean *stop_flag; guint raw_event_count; /* event counter */ @@ -1572,7 +1532,8 @@ 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->check && sd->check(sd->raw_event_count, sd->stop_flag)) return TRUE; + if(sd->check && sd->check(sd->raw_event_count, sd->stop_flag, sd->data)) + return TRUE; sd->raw_event_count++; if(sd->filter1 != NULL && sd->filter1->head != NULL && @@ -1580,7 +1541,7 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } if(sd->filter2 != NULL && sd->filter2->head != NULL && @@ -1588,7 +1549,7 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } if(sd->filter3 != NULL && sd->filter3->head != NULL && @@ -1596,13 +1557,14 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) ltt_tracefile_get_event(tfc->tf), tfc->tf, tfc->t_context->t, - tfc)) { + tfc,NULL,NULL)) { return FALSE; } sd->event_count++; if(sd->event_count >= sd->n) return TRUE; + return FALSE; } /* Seek back n events forward from the current position (1 to n) @@ -1621,7 +1583,8 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, gboolean *stop_flag, LttvFilter *filter1, LttvFilter *filter2, - LttvFilter *filter3) + LttvFilter *filter3, + gpointer data) { struct seek_forward_data sd; sd.event_count = 0; @@ -1629,6 +1592,7 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self, sd.filter1 = filter1; sd.filter2 = filter2; sd.filter3 = filter3; + sd.data = data; sd.check = check; sd.stop_flag = stop_flag; sd.raw_event_count = 0;