X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=trunk%2Flttv%2Fltt%2Fmarker.c;h=07b5c08efe41a0b17873cf6f552bb277be5c0fe1;hb=0919a063c3078015dc0195a218f77913d99ee268;hp=5933b1b6357ed927e2f4355b7d960456fbf42466;hpb=4d6834281bad653e0fbd08830a7010383f2f66e8;p=lttv.git diff --git a/trunk/lttv/ltt/marker.c b/trunk/lttv/ltt/marker.c index 5933b1b6..07b5c08e 100644 --- a/trunk/lttv/ltt/marker.c +++ b/trunk/lttv/ltt/marker.c @@ -47,10 +47,6 @@ static inline const char *parse_trace_type(struct marker_info *info, /* parse attributes. */ repeat: switch (*fmt) { - case 'b': - *attributes |= LTT_ATTRIBUTE_COMPACT; - ++fmt; - goto repeat; case 'n': *attributes |= LTT_ATTRIBUTE_NETWORK_BYTE_ORDER; ++fmt; @@ -62,7 +58,7 @@ static inline const char *parse_trace_type(struct marker_info *info, if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z' || *fmt == 'z' || *fmt == 't' || *fmt == 'S' || *fmt == '1' || *fmt == '2' || - *fmt == '4' || *fmt == 8) { + *fmt == '4' || *fmt == '8') { qualifier = *fmt; ++fmt; if (qualifier == 'l' && *fmt == 'l') { @@ -172,7 +168,6 @@ static inline const char *parse_c_type(struct marker_info *info, ++fmt; if (qualifier == 'l' && *fmt == 'l') { qualifier = 'L'; - g_string_append_c(field_fmt, *fmt); ++fmt; } } @@ -263,6 +258,8 @@ static inline long add_type(struct marker_info *info, case LTT_TYPE_POINTER: field->size = trace_size; field->alignment = trace_size; + info->largest_align = max((guint8)field->alignment, + (guint8)info->largest_align); field->attributes = attributes; if (offset == -1) { field->offset = -1; @@ -284,7 +281,7 @@ static inline long add_type(struct marker_info *info, field->static_offset = 1; return -1; default: - g_error("Unexpected type"); //FIXME: compact type + g_error("Unexpected type"); return 0; } } @@ -321,7 +318,7 @@ long marker_update_fields_offsets(struct marker_info *info, const char *data) // not aligning on pointer size, breaking genevent backward compatibility. break; default: - g_error("Unexpected type"); //FIXME: compact type + g_error("Unexpected type"); return -1; } } @@ -379,7 +376,6 @@ static void format_parse(const char *fmt, struct marker_info *info) offset = add_type(info, offset, name, trace_size, trace_type, c_size, c_type, attributes, field_count++, field_fmt); - g_string_truncate(field_fmt, 0); trace_size = c_size = 0; trace_type = c_size = LTT_TYPE_NONE; g_string_truncate(field_fmt, 0); @@ -425,46 +421,67 @@ int marker_parse_format(const char *format, struct marker_info *info) return 0; } -int marker_format_event(LttTrace *trace, GQuark name, const char *format) +int marker_format_event(LttTrace *trace, GQuark channel, GQuark name, + const char *format) { struct marker_info *info; + struct marker_data *mdata; char *fquery; char *fcopy; - - fquery = marker_get_format_from_name(trace, name); + GArray *group; + + group = g_datalist_id_get_data(&trace->tracefiles, channel); + if (!group) + return -ENOENT; + g_assert(group->len > 0); + mdata = g_array_index (group, LttTracefile, 0).mdata; + + fquery = marker_get_format_from_name(mdata, 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)); + g_error("Marker format mismatch \"%s\" vs \"%s\" for marker %s.%s. " + "Kernel issue.", fquery, format, + g_quark_to_string(channel), 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, + g_hash_table_insert(mdata->markers_format_hash, (gpointer)(gulong)name, (gpointer)fcopy); - info = marker_get_info_from_name(trace, name); + info = marker_get_info_from_name(mdata, name); for (; info != NULL; info = info->next) { 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)); + g_error("Error parsing marker format \"%s\" for marker \"%.s.%s\"", + format, g_quark_to_string(channel), g_quark_to_string(name)); } return 0; } -int marker_id_event(LttTrace *trace, GQuark name, guint16 id, +int marker_id_event(LttTrace *trace, GQuark channel, GQuark name, guint16 id, uint8_t int_size, uint8_t long_size, uint8_t pointer_size, uint8_t size_t_size, uint8_t alignment) { + struct marker_data *mdata; struct marker_info *info, *head; int found = 0; + GArray *group; - if (trace->markers->len <= id) - trace->markers = g_array_set_size(trace->markers, - max(trace->markers->len * 2, id + 1)); - info = &g_array_index(trace->markers, struct marker_info, id); + g_debug("Add channel %s event %s %hu\n", g_quark_to_string(channel), + g_quark_to_string(name), id); + + group = g_datalist_id_get_data(&trace->tracefiles, channel); + if (!group) + return -ENOENT; + g_assert(group->len > 0); + mdata = g_array_index (group, LttTracefile, 0).mdata; + + if (mdata->markers->len <= id) + mdata->markers = g_array_set_size(mdata->markers, + max(mdata->markers->len * 2, id + 1)); + info = &g_array_index(mdata->markers, struct marker_info, id); info->name = name; info->int_size = int_size; info->long_size = long_size; @@ -473,13 +490,14 @@ int marker_id_event(LttTrace *trace, GQuark name, guint16 id, info->alignment = alignment; info->fields = NULL; info->next = NULL; - info->format = marker_get_format_from_name(trace, name); + info->format = marker_get_format_from_name(mdata, name); + info->largest_align = 1; 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); + g_error("Error parsing marker format \"%s\" for marker \"%s.%s\"", + info->format, g_quark_to_string(channel), g_quark_to_string(name)); + head = marker_get_info_from_name(mdata, name); if (!head) - g_hash_table_insert(trace->markers_hash, (gpointer)(gulong)name, + g_hash_table_insert(mdata->markers_hash, (gpointer)(gulong)name, (gpointer)(gulong)id); else { struct marker_info *iter; @@ -487,7 +505,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)(gulong)name, + g_hash_table_replace(mdata->markers_hash, (gpointer)(gulong)name, (gpointer)(gulong)id); info->next = head; } @@ -495,31 +513,43 @@ int marker_id_event(LttTrace *trace, GQuark name, guint16 id, return 0; } -int allocate_marker_data(LttTrace *trace) +struct marker_data *allocate_marker_data(void) { + struct marker_data *data; + + data = g_new(struct marker_data, 1); /* Init array to 0 */ - trace->markers = g_array_sized_new(FALSE, TRUE, + data->markers = g_array_sized_new(FALSE, TRUE, sizeof(struct marker_info), DEFAULT_MARKERS_NUM); - 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, + if (!data->markers) + goto free_data; + data->markers_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + if (!data->markers_hash) + goto free_markers; + data->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; + if (!data->markers_format_hash) + goto free_markers_hash; + return data; + + /* error handling */ +free_markers_hash: + g_hash_table_destroy(data->markers_hash); +free_markers: + g_array_free(data->markers, TRUE); +free_data: + g_free(data); + return NULL; } -void destroy_marker_data(LttTrace *trace) +void destroy_marker_data(struct marker_data *data) { unsigned int i, j; struct marker_info *info; struct marker_field *field; - for (i=0; imarkers->len; i++) { - info = &g_array_index(trace->markers, struct marker_info, i); + for (i=0; imarkers->len; i++) { + info = &g_array_index(data->markers, struct marker_info, i); if (info->fields) { for (j = 0; j < info->fields->len; j++) { field = &g_array_index(info->fields, struct marker_field, j); @@ -528,7 +558,8 @@ void destroy_marker_data(LttTrace *trace) 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); + g_hash_table_destroy(data->markers_format_hash); + g_hash_table_destroy(data->markers_hash); + g_array_free(data->markers, TRUE); + g_free(data); }