X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=71c9598730053c7aed0337d714cb806c000cddd2;hb=b4fa748c7096540e0d3d77b6017bf87fa544674d;hp=a6ff811e0a622ce1ad45398164ab5e9418cbe703;hpb=f57fd845a3c7c14f789a91cd70140d08632208ff;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index a6ff811e..71c95987 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -968,94 +968,99 @@ struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th) return marker_get_info_from_id(t, th->id); } - -/* Returns 0 on success, -1 if fails. */ -gint -lttv_trace_find_hook(LttTrace *t, GQuark event, - GQuark field1, GQuark field2, GQuark field3, LttvHook h, gpointer hook_data, - LttvTraceHook *th) +static inline GQuark lttv_merge_facility_event_name(GQuark fac, GQuark ev) { -// LttEventType *et, *first_et; + char *tmp; + const char *sfac, *sev; + GQuark ret; + + sfac = g_quark_to_string(fac); + sev = g_quark_to_string(ev); + tmp = g_new(char, strlen(sfac) + strlen(sev) + 3); /* 3: _ \0 \0 */ + strcpy(tmp, sfac); + strcat(tmp, "_"); + strcat(tmp, sev); + ret = g_quark_from_string(tmp); + g_free(tmp); + return ret; +} +int lttv_trace_find_hook(LttTrace *t, GQuark facility_name, GQuark event_name, + GQuark fields[], LttvHook h, gpointer hook_data, GArray **trace_hooks) +{ struct marker_info *info; + guint16 marker_id; + int init_array_size; + GQuark marker_name; - guint i, ev_id; - - info = marker_get_info_from_name(t, event); - - if(unlikely(info == NULL)) - goto facility_error; - - ev_id = marker_get_id_from_info(t, info); - - th->h = h; - th->id = ev_id; - th->f1 = find_field(et, field1); - th->f2 = find_field(et, field2); - th->f3 = find_field(et, field3); - th->hook_data = hook_data; - -// first_thf = thf; -// first_et = et; - - /* 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); + marker_name = lttv_merge_facility_event_name(facility_name, event_name); -// 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) { - // nothing to do + 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) { @@ -1576,6 +1581,7 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data) 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)