X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Ftracefile.c;h=012ce10801ec27cf63819614a477ccf5fa173e3d;hb=caa44fe6ed9d848a52f712fbe900ad3e932d7da4;hp=54da74705ef6dd1b9d00de71181394502d95d2b4;hpb=72984157670b34f39c04134a4188bed37559095d;p=lttv.git diff --git a/ltt/tracefile.c b/ltt/tracefile.c index 54da7470..012ce108 100644 --- a/ltt/tracefile.c +++ b/ltt/tracefile.c @@ -55,6 +55,8 @@ /* from marker.c */ extern long marker_update_fields_offsets(struct marker_info *info, const char *data); +extern void marker_update_event_fields_offsets(GArray *fields_offsets, + struct marker_info *info); /* Tracefile names used in this file */ @@ -333,7 +335,13 @@ static gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) perror("Cannot map block for tracefile"); goto close_file; } - + + /* Create fields offset table */ + tf->event.fields_offsets = g_array_sized_new(FALSE, FALSE, + sizeof(struct LttField), 1); + if (!tf->event.fields_offsets) + goto close_file; + return 0; /* Error */ @@ -376,6 +384,7 @@ static void ltt_tracefile_close(LttTracefile *t) close(t->fd); if (t->buf_index) g_array_free(t->buf_index, TRUE); + g_array_free(t->event.fields_offsets, TRUE); } /**************************************************************************** @@ -1085,8 +1094,11 @@ int ltt_tracefile_seek_time(LttTracefile *tf, LttTime time) } } else if(ltt_time_compare(time, tf->buffer.begin.timestamp) < 0) { - /* go to lower part */ - high = block_num - 1; + /* + * Go to lower part. We don't want block_num - 1 since block_num + * can equal low , in which case high < low. + */ + high = block_num; } else if(ltt_time_compare(time, tf->buffer.end.timestamp) > 0) { /* go to higher part */ low = block_num + 1; @@ -1593,8 +1605,9 @@ void ltt_update_event_size(LttTracefile *tf) if (info->size != -1) size = info->size; else - size = marker_update_fields_offsets(marker_get_info_from_id(tf->mdata, - tf->event.event_id), tf->event.data); + size = marker_update_fields_offsets(info, tf->event.data); + /* Update per-tracefile offsets */ + marker_update_event_fields_offsets(tf->event.fields_offsets, info); } tf->event.data_size = size;