X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Fmarker.c;h=ce1fc86863f0f9f093820cffe8506ff7914b5200;hb=a970363f31999693ffbc0d7d6cf8a15d03677d64;hp=54209570f787c9fccbb72d3a1f46db95a5aaddf1;hpb=abc34be778e8e109b372add89963e1a6651785b6;p=lttv.git diff --git a/ltt/branches/poly/ltt/marker.c b/ltt/branches/poly/ltt/marker.c index 54209570..ce1fc868 100644 --- a/ltt/branches/poly/ltt/marker.c +++ b/ltt/branches/poly/ltt/marker.c @@ -405,17 +405,25 @@ int marker_parse_format(const char *format, struct marker_info *info) int marker_format_event(LttTrace *trace, GQuark name, const char *format) { struct marker_info *info; + char *fquery; + char *fcopy; + fquery = marker_get_format_from_name(trace, name); + if (fquery) { + if (strcmp(fquery, format) != 0) + g_error("Marker format mismatch \"%s\" vs \"%s\" for marker %s. " + "Kernel issue.", fquery, format, g_quark_to_string(name)); + else + return 0; /* Already exists. Nothing to do. */ + } + fcopy = g_new(char, strlen(format)+1); + strcpy(fcopy, format); + g_hash_table_insert(trace->markers_format_hash, (gpointer)(gulong)name, + (gpointer)fcopy); + info = marker_get_info_from_name(trace, name); - if (!info) - g_error("Got marker format \"%s\", but marker name \"%s\" has no ID yet. " - "Kernel issue.", - format, name); for (; info != NULL; info = info->next) { - if (info->format) - g_free(info->format); - info->format = g_new(char, strlen(format)+1); - strcpy(info->format, format); + info->format = fcopy; if (marker_parse_format(format, info)) g_error("Error parsing marker format \"%s\" for marker \"%s\"", format, g_quark_to_string(name)); @@ -440,10 +448,15 @@ int marker_id_event(LttTrace *trace, GQuark name, guint16 id, info->pointer_size = pointer_size; info->size_t_size = size_t_size; info->alignment = alignment; + info->fields = NULL; info->next = NULL; + info->format = marker_get_format_from_name(trace, name); + if (info->format && marker_parse_format(info->format, info)) + g_error("Error parsing marker format \"%s\" for marker \"%s\"", + info->format, g_quark_to_string(name)); head = marker_get_info_from_name(trace, name); if (!head) - g_hash_table_insert(trace->markers_hash, (gpointer)name, + g_hash_table_insert(trace->markers_hash, (gpointer)(gulong)name, (gpointer)(gulong)id); else { struct marker_info *iter; @@ -451,7 +464,7 @@ int marker_id_event(LttTrace *trace, GQuark name, guint16 id, if (iter->name == name) found = 1; if (!found) { - g_hash_table_replace(trace->markers_hash, (gpointer)name, + g_hash_table_replace(trace->markers_hash, (gpointer)(gulong)name, (gpointer)(gulong)id); info->next = head; } @@ -467,6 +480,10 @@ int allocate_marker_data(LttTrace *trace) if (!trace->markers) return -ENOMEM; trace->markers_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + if (!trace->markers_hash) + return -ENOMEM; + trace->markers_format_hash = g_hash_table_new_full(g_direct_hash, + g_direct_equal, NULL, g_free); if (!trace->markers_hash) return -ENOMEM; return 0; @@ -479,11 +496,10 @@ void destroy_marker_data(LttTrace *trace) for (i=0; imarkers->len; i++) { info = &g_array_index(trace->markers, struct marker_info, i); - if (info->format) - g_free(info->format); if (info->fields) g_array_free(info->fields, TRUE); } g_array_free(trace->markers, TRUE); g_hash_table_destroy(trace->markers_hash); + g_hash_table_destroy(trace->markers_format_hash); }