From: Mathieu Desnoyers Date: Wed, 31 Aug 2011 20:03:03 +0000 (-0400) Subject: Enhance babeltrace API with position save/restore X-Git-Tag: v0.7~18 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=063f70486d49320f996630ae2522bc9a2341f882 Enhance babeltrace API with position save/restore Signed-off-by: Mathieu Desnoyers --- diff --git a/converter/babeltrace-lib.c b/converter/babeltrace-lib.c index e08c0ada..37975081 100644 --- a/converter/babeltrace-lib.c +++ b/converter/babeltrace-lib.c @@ -33,6 +33,21 @@ #include #include +struct stream_saved_pos { + /* + * Use file_stream pointer to check if the trace collection we + * restore to match the one we saved from, for each stream. + */ + struct ctf_file_stream *file_stream; + size_t cur_index; /* current index in packet index */ + ssize_t offset; /* offset from base, in bits. EOF for end of file. */ +}; + +struct babeltrace_saved_pos { + struct trace_collection *tc; + GArray *stream_saved_pos; /* Contains struct stream_saved_pos */ +}; + /* * struct babeltrace_iter: data structure representing an iterator on a trace * collection. @@ -40,6 +55,7 @@ struct babeltrace_iter { struct ptr_heap *stream_heap; struct trace_collection *tc; + struct trace_collection_pos *end_pos; }; static int stream_read_event(struct ctf_file_stream *sin) @@ -69,7 +85,10 @@ int stream_compare(void *a, void *b) return 0; } -struct babeltrace_iter *babeltrace_iter_create(struct trace_collection *tc) +/* TODO: use begin_pos/end_pos */ +struct babeltrace_iter *babeltrace_iter_create(struct trace_collection *tc, + struct trace_collection_pos *begin_pos, + struct trace_collection_pos *end_pos) { int i, stream_id; int ret = 0; @@ -201,7 +220,7 @@ int convert_trace(struct trace_descriptor *td_write, sout = container_of(td_write, struct ctf_text_stream_pos, trace_descriptor); - iter = babeltrace_iter_create(trace_collection_read); + iter = babeltrace_iter_create(trace_collection_read, NULL, NULL); while (babeltrace_iter_read_event(iter, &stream, &event) == 0) { ret = sout->parent.event_cb(&sout->parent, stream); if (ret) { diff --git a/include/babeltrace/babeltrace.h b/include/babeltrace/babeltrace.h index dfe6112d..6c3fe967 100644 --- a/include/babeltrace/babeltrace.h +++ b/include/babeltrace/babeltrace.h @@ -22,11 +22,37 @@ struct babeltrace_iter; struct trace_collection; struct ctf_stream_event; struct ctf_stream; +struct babeltrace_saved_pos; + +struct trace_collection_pos { + enum { + BT_SEEK_TIME, /* uses u.seek_time */ + BT_SEEK_RESTORE, /* uses u.restore */ + BT_SEEK_CUR, + BT_SEEK_BEGIN, + BT_SEEK_END, + } type; + union { + uint64_t seek_time; + struct babeltrace_saved_pos *restore; + } u; +}; /* * babeltrace_iter_create - Allocate a trace collection iterator. + * + * begin_pos and end_pos are optional parameters to specify the position + * at which the trace collection should be seeked upon iterator + * creation, and the position at which iteration will start returning + * "EOF". + * + * By default, if begin_pos is NULL, a BT_SEEK_CUR is performed at + * creation. By default, if end_pos is NULL, a BT_SEEK_END (end of + * trace) is the EOF criterion. */ -struct babeltrace_iter *babeltrace_iter_create(struct trace_collection *tc); +struct babeltrace_iter *babeltrace_iter_create(struct trace_collection *tc, + struct trace_collection_pos *begin_pos, + struct trace_collection_pos *end_pos); /* * babeltrace_iter_destroy - Free a trace collection iterator. @@ -41,34 +67,28 @@ void babeltrace_iter_destroy(struct babeltrace_iter *iter); int babeltrace_iter_next(struct babeltrace_iter *iter); /* - * babeltrace_iter_get_pos - Get the current trace collection position. + * babeltrace_iter_save_pos - Save the current trace collection position. * * The position returned by this function needs to be freed by * babeltrace_iter_free_pos after use. */ -struct babeltrace_iter_pos * - babeltrace_iter_get_pos(struct babeltrace_iter *iter); +struct trace_collection_pos * + babeltrace_iter_save_pos(struct babeltrace_iter *iter); /* * babeltrace_iter_free_pos - Free the position. */ -void babeltrace_iter_free_pos(struct babeltrace_iter_pos *pos); - -/* - * babeltrace_iter_seek_pos - Seek the trace collection to the position. - */ -int babeltrace_iter_seek_pos(struct babeltrace_iter *iter, - struct babeltrace_iter_pos *pos); +void babeltrace_iter_free_pos(struct trace_collection_pos *pos); /* - * babeltrace_iter_seek_time: Seek the trace collection to the given timestamp. + * babeltrace_iter_seek: seek iterator to given position. * - * Return EOF if timestamp is after the last event of the trace collection. + * Return EOF if position is after the last event of the trace collection. * Return other negative value for other errors. * Return 0 for success. */ -int babeltrace_iter_seek_time(struct babeltrace_iter *iter, - uint64_t timestamp); +int babeltrace_iter_seek(struct babeltrace_iter *iter, + const struct trace_collection_pos *pos); /* * babeltrace_iter_read_event: Read the iterator's current event data.