X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ftracecontext.c;h=71c9598730053c7aed0337d714cb806c000cddd2;hb=60c5092c6e979b8cc1c9b762de473857d0ac7c97;hp=f2fd441349f55dae52228ce5ba0faed0b70f8e63;hpb=937a4442a7f16b60535a43d88d22dae944430c66;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/tracecontext.c b/ltt/branches/poly/lttv/lttv/tracecontext.c index f2fd4413..71c95987 100644 --- a/ltt/branches/poly/lttv/lttv/tracecontext.c +++ b/ltt/branches/poly/lttv/lttv/tracecontext.c @@ -968,30 +968,47 @@ struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th) return marker_get_info_from_id(t, th->id); } +static inline GQuark lttv_merge_facility_event_name(GQuark fac, GQuark ev) +{ + 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; +} -GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name, - GQuark fields[], LttvHook h, gpointer hook_data) +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; - GQuark *pfieldname; - struct marker_field *field; guint16 marker_id; + int init_array_size; + GQuark marker_name; - GArray * retval; + marker_name = lttv_merge_facility_event_name(facility_name, event_name); info = marker_get_info_from_name(t, marker_name); if(unlikely(info == NULL)) { - return NULL; + g_warning("No marker of name %s found", g_quark_to_string(marker_name)); + return 1; } - retval = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook)); - - + 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); @@ -1001,52 +1018,49 @@ GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name, tmpth.fields = g_ptr_array_new(); /* for each field requested */ - found = 0; - for(pfieldname = fields; pfieldname != NULL; pfieldname++) { - for_each_marker_field(field, info) { - if(field->name == *pfieldname) { - + 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, field); + 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. Skip it. */ + marker. Print a warning and skip this marker completely. + Still iterate on other markers with same name. */ g_ptr_array_free(tmpth.fields, TRUE); - goto free_retval; + 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 */ - g_array_append_val(retval, tmpth); - + *trace_hooks = g_array_append_val(*trace_hooks, tmpth); +skip_marker: info = info->next; } while(info != NULL); - - if(retval->len) - return retval; - - free_retval: - g_array_free(retval, TRUE); - return 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; } -void lttv_trace_hook_destroy(GArray *th) +void lttv_trace_hook_remove_all(GArray **th) { int i; - for(i=0; ilen; i++) { - g_ptr_array_free(g_array_index(th, LttvTraceHook, i).fields, TRUE); + for(i=0; i<(*th)->len; i++) { + g_ptr_array_free(g_array_index(*th, LttvTraceHook, i).fields, TRUE); } - - g_array_free(th, TRUE); + *th = g_array_remove_range(*th, 0, (*th)->len); } - - - LttvTracesetContextPosition *lttv_traceset_context_position_new( const LttvTracesetContext *self) { @@ -1567,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)