[lttng-dev] [PATCH babeltrace] Add bt_stream_pos to bt_trace_descriptor

Jérémie Galarneau jeremie.galarneau at efficios.com
Mon May 27 23:38:45 EDT 2013


This is intended to provide a generic way to access the bt_stream_pos API
without having to make assumptions about the output format's descriptor layout.

Renamed format-internal.h to trace-descriptor-internal.h to make it more
representative of the interface it really contains.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
---
 formats/bt-dummy/bt-dummy.c                    |  3 ++
 formats/ctf-metadata/ctf-metadata.c            |  3 ++
 formats/ctf-text/ctf-text.c                    |  3 ++
 formats/ctf/ctf.c                              | 11 ++++--
 include/Makefile.am                            |  5 ++-
 include/babeltrace/ctf-ir/metadata.h           |  2 +-
 include/babeltrace/ctf-text/types.h            |  2 +-
 include/babeltrace/format-internal.h           | 54 -------------------------
 include/babeltrace/trace-descriptor-internal.h | 55 ++++++++++++++++++++++++++
 include/babeltrace/trace-descriptor.h          | 53 +++++++++++++++++++++++++
 lib/Makefile.am                                |  3 +-
 lib/trace-descriptor.c                         | 42 ++++++++++++++++++++
 12 files changed, 174 insertions(+), 62 deletions(-)
 delete mode 100644 include/babeltrace/format-internal.h
 create mode 100644 include/babeltrace/trace-descriptor-internal.h
 create mode 100644 include/babeltrace/trace-descriptor.h
 create mode 100644 lib/trace-descriptor.c

diff --git a/formats/bt-dummy/bt-dummy.c b/formats/bt-dummy/bt-dummy.c
index 6192e88..d9767fc 100644
--- a/formats/bt-dummy/bt-dummy.c
+++ b/formats/bt-dummy/bt-dummy.c
@@ -55,6 +55,8 @@ struct bt_trace_descriptor *bt_dummy_open_trace(const char *path, int flags,
 	pos->parent.rw_table = NULL;
 	pos->parent.event_cb = bt_dummy_write_event;
 	pos->parent.trace = &pos->trace_descriptor;
+	pos->trace_descriptor.stream_pos = g_ptr_array_sized_new(1);
+	g_ptr_array_add(pos->trace_descriptor.stream_pos, pos);
 	return &pos->trace_descriptor;
 }
 
@@ -64,6 +66,7 @@ int bt_dummy_close_trace(struct bt_trace_descriptor *td)
 	struct ctf_text_stream_pos *pos =
 		container_of(td, struct ctf_text_stream_pos,
 			trace_descriptor);
+	g_ptr_array_free(td->stream_pos, TRUE);
 	free(pos);
 	return 0;
 }
diff --git a/formats/ctf-metadata/ctf-metadata.c b/formats/ctf-metadata/ctf-metadata.c
index a5a74c3..e8774eb 100644
--- a/formats/ctf-metadata/ctf-metadata.c
+++ b/formats/ctf-metadata/ctf-metadata.c
@@ -96,6 +96,8 @@ struct bt_trace_descriptor *ctf_metadata_open_trace(const char *path, int flags,
 		pos->fp = fp;
 		pos->parent.pre_trace_cb = ctf_metadata_trace_pre_handler;
 		pos->parent.trace = &pos->trace_descriptor;
+		pos->trace_descriptor.stream_pos = g_ptr_array_sized_new(1);
+		g_ptr_array_add(pos->trace_descriptor.stream_pos, pos);
 		pos->print_names = 0;
 		break;
 	case O_RDONLY:
@@ -116,6 +118,7 @@ int ctf_metadata_close_trace(struct bt_trace_descriptor *td)
 	int ret;
 	struct ctf_text_stream_pos *pos =
 		container_of(td, struct ctf_text_stream_pos, trace_descriptor);
+	g_ptr_array_free(td->stream_pos, TRUE);
 	if (pos->fp != stdout) {
 		ret = fclose(pos->fp);
 		if (ret) {
diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c
index 48ce31b..c3b55ed 100644
--- a/formats/ctf-text/ctf-text.c
+++ b/formats/ctf-text/ctf-text.c
@@ -562,6 +562,8 @@ struct bt_trace_descriptor *ctf_text_open_trace(const char *path, int flags,
 		pos->parent.rw_table = write_dispatch_table;
 		pos->parent.event_cb = ctf_text_write_event;
 		pos->parent.trace = &pos->trace_descriptor;
+		pos->trace_descriptor.stream_pos = g_ptr_array_sized_new(1);
+		g_ptr_array_add(pos->trace_descriptor.stream_pos, pos);
 		pos->print_names = 0;
 		break;
 	case O_RDONLY:
@@ -582,6 +584,7 @@ int ctf_text_close_trace(struct bt_trace_descriptor *td)
 	int ret;
 	struct ctf_text_stream_pos *pos =
 		container_of(td, struct ctf_text_stream_pos, trace_descriptor);
+	g_ptr_array_free(td->stream_pos, TRUE);
 	if (pos->fp != stdout) {
 		ret = fclose(pos->fp);
 		if (ret) {
diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c
index bb94e52..aee80b1 100644
--- a/formats/ctf/ctf.c
+++ b/formats/ctf/ctf.c
@@ -1728,9 +1728,10 @@ int ctf_open_file_stream_read(struct ctf_trace *td, const char *path, int flags,
 		fprintf(stderr, "[error] Stream index creation error.\n");
 		goto error_index;
 	}
-	/* Add stream file to stream class */
+	/* Add stream file to stream class and trace descriptor */
 	g_ptr_array_add(file_stream->parent.stream_class->streams,
 			&file_stream->parent);
+	g_ptr_array_add(td->parent.stream_pos, &file_stream->pos.parent);
 	return 0;
 
 error_index:
@@ -1864,6 +1865,7 @@ struct bt_trace_descriptor *ctf_open_trace(const char *path, int flags,
 		packet_seek = ctf_packet_seek;
 
 	td = g_new0(struct ctf_trace, 1);
+	td->parent.stream_pos = g_ptr_array_new();
 
 	switch (flags & O_ACCMODE) {
 	case O_RDONLY:
@@ -1871,7 +1873,8 @@ struct bt_trace_descriptor *ctf_open_trace(const char *path, int flags,
 			fprintf(stderr, "[error] Path missing for input CTF trace.\n");
 			goto error;
 		}
-		ret = ctf_open_trace_read(td, path, flags, packet_seek, metadata_fp);
+		ret = ctf_open_trace_read(td, path, flags, packet_seek,
+					metadata_fp);
 		if (ret)
 			goto error;
 		break;
@@ -1885,6 +1888,7 @@ struct bt_trace_descriptor *ctf_open_trace(const char *path, int flags,
 
 	return &td->parent;
 error:
+	g_ptr_array_free(td->parent.stream_pos, TRUE);
 	g_free(td);
 	return NULL;
 }
@@ -1967,9 +1971,10 @@ int ctf_open_mmap_stream_read(struct ctf_trace *td,
 	 */
 	file_stream->parent.current_clock = td->parent.single_clock;
 
-	/* Add stream file to stream class */
+	/* Add stream file to stream class and trace descriptor */
 	g_ptr_array_add(file_stream->parent.stream_class->streams,
 			&file_stream->parent);
+	g_ptr_array_add(td->parent.stream_pos, &file_stream->pos.parent);
 	return 0;
 
 error_index:
diff --git a/include/Makefile.am b/include/Makefile.am
index eee2ac1..c953fac 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -5,7 +5,8 @@ babeltraceinclude_HEADERS = \
 	babeltrace/iterator.h \
 	babeltrace/trace-handle.h \
 	babeltrace/list.h \
-	babeltrace/clock-types.h
+	babeltrace/clock-types.h \
+	babeltrace/trace-descriptor.h
 
 babeltracectfinclude_HEADERS = \
 	babeltrace/ctf/events.h \
@@ -19,7 +20,7 @@ noinst_HEADERS = \
 	babeltrace/clock-internal.h \
 	babeltrace/compiler.h \
 	babeltrace/context-internal.h \
-	babeltrace/format-internal.h \
+	babeltrace/trace-descriptor-internal.h \
 	babeltrace/iterator-internal.h \
 	babeltrace/trace-collection.h \
 	babeltrace/prio_heap.h \
diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h
index 5e92984..458d4d9 100644
--- a/include/babeltrace/ctf-ir/metadata.h
+++ b/include/babeltrace/ctf-ir/metadata.h
@@ -29,7 +29,7 @@
 
 #include <babeltrace/types.h>
 #include <babeltrace/format.h>
-#include <babeltrace/format-internal.h>
+#include <babeltrace/trace-descriptor-internal.h>
 #include <babeltrace/ctf/types.h>
 #include <sys/types.h>
 #include <dirent.h>
diff --git a/include/babeltrace/ctf-text/types.h b/include/babeltrace/ctf-text/types.h
index 7b4b717..89b99f8 100644
--- a/include/babeltrace/ctf-text/types.h
+++ b/include/babeltrace/ctf-text/types.h
@@ -35,7 +35,7 @@
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/types.h>
 #include <babeltrace/format.h>
-#include <babeltrace/format-internal.h>
+#include <babeltrace/trace-descriptor-internal.h>
 
 /*
  * Inherit from both struct bt_stream_pos and struct bt_trace_descriptor.
diff --git a/include/babeltrace/format-internal.h b/include/babeltrace/format-internal.h
deleted file mode 100644
index 7f3eb5e..0000000
--- a/include/babeltrace/format-internal.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef _BABELTRACE_FORMAT_INTERNAL_H
-#define _BABELTRACE_FORMAT_INTERNAL_H
-
-/*
- * BabelTrace
- *
- * Trace Format Internal Header
- *
- * Copyright 2010-2013 EfficiOS Inc. and Linux Foundation
- *
- * Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <limits.h>
-#include <babeltrace/context-internal.h>
-#include <babeltrace/babeltrace-internal.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Parent trace descriptor */
-struct bt_trace_descriptor {
-	char path[PATH_MAX];		/* trace path */
-	struct bt_context *ctx;
-	struct bt_trace_handle *handle;
-	struct trace_collection *collection;	/* Container of this trace */
-	GHashTable *clocks;
-	struct ctf_clock *single_clock;		/* currently supports only one clock */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _BABELTRACE_FORMAT_INTERNAL_H */
diff --git a/include/babeltrace/trace-descriptor-internal.h b/include/babeltrace/trace-descriptor-internal.h
new file mode 100644
index 0000000..8ec23bb
--- /dev/null
+++ b/include/babeltrace/trace-descriptor-internal.h
@@ -0,0 +1,55 @@
+#ifndef _BABELTRACE_TRACE_DESCRIPTOR_INTERNAL_H
+#define _BABELTRACE_TRACE_DESCRIPTOR_INTERNAL_H
+
+/*
+ * BabelTrace
+ *
+ * Trace Descriptor Internal Header
+ *
+ * Copyright 2010-2013 EfficiOS Inc. and Linux Foundation
+ *
+ * Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <limits.h>
+#include <babeltrace/context-internal.h>
+#include <babeltrace/babeltrace-internal.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Parent trace descriptor */
+struct bt_trace_descriptor {
+	char path[PATH_MAX];			/* trace path */
+	struct bt_context *ctx;
+	struct bt_trace_handle *handle;
+	struct trace_collection *collection;	/* Container of this trace */
+	GHashTable *clocks;
+	struct ctf_clock *single_clock;	/* currently supports only one clock */
+	GPtrArray *stream_pos;			/* Pointers to bt_stream_pos */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BABELTRACE_TRACE_DESCRIPTOR_INTERNAL_H */
diff --git a/include/babeltrace/trace-descriptor.h b/include/babeltrace/trace-descriptor.h
new file mode 100644
index 0000000..0ae4b8b
--- /dev/null
+++ b/include/babeltrace/trace-descriptor.h
@@ -0,0 +1,53 @@
+#ifndef _BABELTRACE_TRACE_DESCRIPTOR_H
+#define _BABELTRACE_TRACE_DESCRIPTOR_H
+
+/*
+ * BabelTrace
+ *
+ * Trace Descriptor Header
+ *
+ * Copyright 2013 EfficiOS Inc. and Linux Foundation
+ *
+ * Author: Jérémie Galarneau <jeremie.galarneau at efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <glib.h>
+
+struct bt_trace_descriptor;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * bt_trace_descriptor_get_stream_pos: Get the stream_pos array associated
+ * with descriptor's trace
+ *
+ * Return: Array of pointers to struct bt_stream_pos
+ */
+extern const GPtrArray *bt_trace_descriptor_get_stream_pos(
+	const struct bt_trace_descriptor *descriptor);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BABELTRACE_TRACE_DESCRIPTOR_H */
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 7ffb164..379688d 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -9,7 +9,8 @@ libbabeltrace_la_SOURCES = babeltrace.c \
 			   context.c \
 			   trace-handle.c \
 			   trace-collection.c \
-			   registry.c
+			   registry.c \
+			   trace-descriptor.c
 
 libbabeltrace_la_LDFLAGS = \
 	-Wl,--no-as-needed \
diff --git a/lib/trace-descriptor.c b/lib/trace-descriptor.c
new file mode 100644
index 0000000..4001679
--- /dev/null
+++ b/lib/trace-descriptor.c
@@ -0,0 +1,42 @@
+/*
+ * trace-descriptor.c
+ *
+ * Babeltrace Library
+ *
+ * Copyright 2013 EfficiOS Inc. and Linux Foundation
+ *
+ * Author: Jérémie Galarneau <jeremie.galarneau at efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <babeltrace/trace-descriptor-internal.h>
+
+const GPtrArray *bt_trace_descriptor_get_stream_pos(
+	const struct bt_trace_descriptor *descriptor)
+{
+	const GPtrArray *ret;
+	if (!descriptor) {
+		ret = NULL;
+		goto end;
+	}
+	ret = descriptor->stream_pos;
+end:
+	return ret;
+}
-- 
1.8.2.3




More information about the lttng-dev mailing list