X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fmarker.c;h=ade05e16a0a256a02e2688f2f01da55f03a4d17a;hb=2230bb655f94e5ee0d32593520de317e6081dec6;hp=8e07b326311b2b348edd3d95694808017b168057;hpb=f972ab5e81be30df0ef5d690a55a6876c27b1d40;p=lttv.git diff --git a/ltt/marker.c b/ltt/marker.c index 8e07b326..ade05e16 100644 --- a/ltt/marker.c +++ b/ltt/marker.c @@ -250,30 +250,31 @@ static inline long add_type(struct marker_info *info, field->name = g_quark_from_string(tmpname); } field->type = trace_type; + field->index = info->fields->len-1; field->fmt = g_string_new(field_fmt->str); switch (trace_type) { case LTT_TYPE_SIGNED_INT: case LTT_TYPE_UNSIGNED_INT: case LTT_TYPE_POINTER: - field->size = trace_size; + 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; + field->_offset = -1; field->static_offset = 0; return -1; } else { - field->offset = offset + ltt_align(offset, field->alignment, + field->_offset = offset + ltt_align(offset, field->alignment, info->alignment); field->static_offset = 1; - return field->offset + trace_size; + return field->_offset + trace_size; } case LTT_TYPE_STRING: - field->offset = offset; - field->size = 0; /* Variable length, size is 0 */ + field->_offset = offset; + field->_size = 0; /* Variable length, size is 0 */ field->alignment = 1; if (offset == -1) field->static_offset = 0; @@ -296,7 +297,7 @@ long marker_update_fields_offsets(struct marker_info *info, const char *data) for (i = info->fields->len - 1; i >= 0; i--) { field = &g_array_index(info->fields, struct marker_field, i); if (field->static_offset) { - offset = field->offset; + offset = field->_offset; break; } } @@ -308,12 +309,12 @@ long marker_update_fields_offsets(struct marker_info *info, const char *data) case LTT_TYPE_SIGNED_INT: case LTT_TYPE_UNSIGNED_INT: case LTT_TYPE_POINTER: - field->offset = offset + ltt_align(offset, field->alignment, + field->_offset = offset + ltt_align(offset, field->alignment, info->alignment); - offset = field->offset + field->size; + offset = field->_offset + field->_size; break; case LTT_TYPE_STRING: - field->offset = offset; + field->_offset = offset; offset = offset + strlen(&data[offset]) + 1; // not aligning on pointer size, breaking genevent backward compatibility. break; @@ -325,6 +326,24 @@ long marker_update_fields_offsets(struct marker_info *info, const char *data) return offset; } +void marker_update_event_fields_offsets(GArray *fields_offsets, + struct marker_info *info) +{ + unsigned int i; + + g_array_set_size(fields_offsets, info->fields->len); + for (i = 0; i < info->fields->len; i++) { + struct marker_field *mfield = + &g_array_index(info->fields, struct marker_field, i); + struct LttField *eventfield = + &g_array_index(fields_offsets, struct LttField, i); + eventfield->offset = mfield->_offset; + eventfield->size = mfield->_size; + g_assert(eventfield->offset != -1); + g_assert(eventfield->size != -1); + } +} + static void format_parse(const char *fmt, struct marker_info *info) { char trace_size = 0, c_size = 0; /* @@ -421,16 +440,21 @@ int marker_parse_format(const char *format, struct marker_info *info) return 0; } -static -int marker_format_tf_event(LttTrace *trace, LttTracefile *tf, - GQuark channel, 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; + 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; - mdata = tf->mdata; fquery = marker_get_format_from_name(mdata, name); if (fquery) { if (strcmp(fquery, format) != 0) @@ -455,36 +479,23 @@ int marker_format_tf_event(LttTrace *trace, LttTracefile *tf, return 0; } -int marker_format_event(LttTrace *trace, GQuark channel, GQuark name, - const char *format) -{ - GArray *group; - int i, ret; - LttTracefile *tf; - - group = g_datalist_id_get_data(&trace->tracefiles, channel); - if (!group) - return -ENOENT; - g_assert(group->len > 0); - for (i = 0; i < group->len; i++) { - tf = &g_array_index (group, LttTracefile, i); - ret = marker_format_tf_event(trace, tf, channel, name, format); - if (ret) - g_error("Error in marker_format_event"); - } - return 0; -} - -int marker_id_tf_event(LttTrace *trace, LttTracefile *tf, - GQuark channel, 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; - mdata = tf->mdata; + 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, @@ -521,31 +532,6 @@ int marker_id_tf_event(LttTrace *trace, LttTracefile *tf, return 0; } -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) -{ - GArray *group; - int i, ret; - LttTracefile *tf; - - 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); - for (i = 0; i < group->len; i++) { - tf = &g_array_index (group, LttTracefile, i); - ret = marker_id_tf_event(trace, tf, channel, name, id, int_size, long_size, - pointer_size, size_t_size, alignment); - if (ret) - g_error("Error in marker_id_event"); - } - return 0; -} - struct marker_data *allocate_marker_data(void) { struct marker_data *data;