From 5d93a76ef0a1193fd1678230621a46477224056e Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sat, 6 Apr 2013 19:38:05 -0400 Subject: [PATCH] Move ctf-metadata plugin into its own shared object Signed-off-by: Mathieu Desnoyers --- configure.ac | 1 + converter/Makefile.am | 1 + formats/Makefile.am | 2 +- formats/ctf-metadata/Makefile.am | 12 +++ formats/ctf-metadata/ctf-metadata.c | 143 ++++++++++++++++++++++++++++ formats/ctf-text/ctf-text.c | 89 ----------------- 6 files changed, 158 insertions(+), 90 deletions(-) create mode 100644 formats/ctf-metadata/Makefile.am create mode 100644 formats/ctf-metadata/ctf-metadata.c diff --git a/configure.ac b/configure.ac index cc23f5a4..83822d6f 100644 --- a/configure.ac +++ b/configure.ac @@ -98,6 +98,7 @@ AC_CONFIG_FILES([ formats/ctf/types/Makefile formats/ctf-text/Makefile formats/ctf-text/types/Makefile + formats/ctf-metadata/Makefile formats/bt-dummy/Makefile formats/ctf/metadata/Makefile converter/Makefile diff --git a/converter/Makefile.am b/converter/Makefile.am index 482aec34..de70313e 100644 --- a/converter/Makefile.am +++ b/converter/Makefile.am @@ -14,6 +14,7 @@ babeltrace_LDADD = \ $(top_builddir)/lib/libbabeltrace.la \ $(top_builddir)/formats/ctf/libbabeltrace-ctf.la \ $(top_builddir)/formats/ctf-text/libbabeltrace-ctf-text.la \ + $(top_builddir)/formats/ctf-metadata/libbabeltrace-ctf-metadata.la \ $(top_builddir)/formats/bt-dummy/libbabeltrace-dummy.la babeltrace_log_SOURCES = babeltrace-log.c diff --git a/formats/Makefile.am b/formats/Makefile.am index ee3a6eda..62ae1452 100644 --- a/formats/Makefile.am +++ b/formats/Makefile.am @@ -1,3 +1,3 @@ AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include -SUBDIRS = . ctf ctf-text bt-dummy +SUBDIRS = . ctf ctf-text ctf-metadata bt-dummy diff --git a/formats/ctf-metadata/Makefile.am b/formats/ctf-metadata/Makefile.am new file mode 100644 index 00000000..61d08e81 --- /dev/null +++ b/formats/ctf-metadata/Makefile.am @@ -0,0 +1,12 @@ +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include + +lib_LTLIBRARIES = libbabeltrace-ctf-metadata.la + +libbabeltrace_ctf_metadata_la_SOURCES = \ + ctf-metadata.c + +libbabeltrace_ctf_metadata_la_LDFLAGS = \ + -Wl,--no-as-needed + +libbabeltrace_ctf_metadata_la_LIBADD = \ + $(top_builddir)/lib/libbabeltrace.la diff --git a/formats/ctf-metadata/ctf-metadata.c b/formats/ctf-metadata/ctf-metadata.c new file mode 100644 index 00000000..578e8da8 --- /dev/null +++ b/formats/ctf-metadata/ctf-metadata.c @@ -0,0 +1,143 @@ +/* + * BabelTrace - Common Trace Format (CTF) + * + * CTF Metadata Dump. + * + * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation + * + * Author: Mathieu Desnoyers + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static +struct bt_trace_descriptor *ctf_metadata_open_trace(const char *path, int flags, + void (*packet_seek)(struct bt_stream_pos *pos, size_t index, + int whence), FILE *metadata_fp); +static +int ctf_metadata_close_trace(struct bt_trace_descriptor *descriptor); + +static +struct bt_format ctf_metadata_format = { + .open_trace = ctf_metadata_open_trace, + .close_trace = ctf_metadata_close_trace, +}; + +static +int ctf_metadata_trace_pre_handler(struct bt_stream_pos *ppos, + struct bt_trace_descriptor *td) +{ + struct ctf_text_stream_pos *pos = + container_of(ppos, struct ctf_text_stream_pos, parent); + struct ctf_trace *trace; + + trace = container_of(td, struct ctf_trace, parent); + if (!trace->metadata_string) + return -EINVAL; + if (trace->metadata_packetized) { + fprintf(pos->fp, "/* CTF %u.%u */\n", + BT_CTF_MAJOR, BT_CTF_MINOR); + } + fprintf(pos->fp, "%s", trace->metadata_string); + return 0; +} + +static +struct bt_trace_descriptor *ctf_metadata_open_trace(const char *path, int flags, + void (*packet_seek)(struct bt_stream_pos *pos, size_t index, + int whence), FILE *metadata_fp) +{ + struct ctf_text_stream_pos *pos; + FILE *fp; + + pos = g_new0(struct ctf_text_stream_pos, 1); + + pos->last_real_timestamp = -1ULL; + pos->last_cycles_timestamp = -1ULL; + switch (flags & O_ACCMODE) { + case O_RDWR: + if (!path) + fp = stdout; + else + fp = fopen(path, "w"); + if (!fp) + goto error; + pos->fp = fp; + pos->parent.pre_trace_cb = ctf_metadata_trace_pre_handler; + pos->print_names = 0; + break; + case O_RDONLY: + default: + fprintf(stderr, "[error] Incorrect open flags.\n"); + goto error; + } + + return &pos->trace_descriptor; +error: + g_free(pos); + return NULL; +} + +static +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); + if (pos->fp != stdout) { + ret = fclose(pos->fp); + if (ret) { + perror("Error on fclose"); + return -1; + } + } + g_free(pos); + return 0; +} + +static +void __attribute__((constructor)) ctf_metadata_init(void) +{ + int ret; + + ctf_metadata_format.name = g_quark_from_static_string("ctf-metadata"); + ret = bt_register_format(&ctf_metadata_format); + assert(!ret); +} + +static +void __attribute__((destructor)) ctf_metadata_exit(void) +{ + bt_unregister_format(&ctf_metadata_format); +} diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index b44ed844..d6bafd31 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -93,13 +93,6 @@ struct bt_trace_descriptor *ctf_text_open_trace(const char *path, int flags, static int ctf_text_close_trace(struct bt_trace_descriptor *descriptor); -static -struct bt_trace_descriptor *ctf_metadata_open_trace(const char *path, int flags, - void (*packet_seek)(struct bt_stream_pos *pos, size_t index, - int whence), FILE *metadata_fp); -static -int ctf_metadata_close_trace(struct bt_trace_descriptor *descriptor); - static rw_dispatch write_dispatch_table[] = { [ CTF_TYPE_INTEGER ] = ctf_text_integer_write, @@ -118,12 +111,6 @@ struct bt_format ctf_text_format = { .close_trace = ctf_text_close_trace, }; -static -struct bt_format ctf_metadata_format = { - .open_trace = ctf_metadata_open_trace, - .close_trace = ctf_metadata_close_trace, -}; - static GQuark Q_STREAM_PACKET_CONTEXT_TIMESTAMP_BEGIN, Q_STREAM_PACKET_CONTEXT_TIMESTAMP_END, Q_STREAM_PACKET_CONTEXT_EVENTS_DISCARDED, @@ -605,78 +592,6 @@ int ctf_text_close_trace(struct bt_trace_descriptor *td) return 0; } -static -int ctf_metadata_trace_pre_handler(struct bt_stream_pos *ppos, - struct bt_trace_descriptor *td) -{ - struct ctf_text_stream_pos *pos = - container_of(ppos, struct ctf_text_stream_pos, parent); - struct ctf_trace *trace; - - trace = container_of(td, struct ctf_trace, parent); - if (!trace->metadata_string) - return -EINVAL; - if (trace->metadata_packetized) { - fprintf(pos->fp, "/* CTF %u.%u */\n", - BT_CTF_MAJOR, BT_CTF_MINOR); - } - fprintf(pos->fp, "%s", trace->metadata_string); - return 0; -} - -static -struct bt_trace_descriptor *ctf_metadata_open_trace(const char *path, int flags, - void (*packet_seek)(struct bt_stream_pos *pos, size_t index, - int whence), FILE *metadata_fp) -{ - struct ctf_text_stream_pos *pos; - FILE *fp; - - pos = g_new0(struct ctf_text_stream_pos, 1); - - pos->last_real_timestamp = -1ULL; - pos->last_cycles_timestamp = -1ULL; - switch (flags & O_ACCMODE) { - case O_RDWR: - if (!path) - fp = stdout; - else - fp = fopen(path, "w"); - if (!fp) - goto error; - pos->fp = fp; - pos->parent.pre_trace_cb = ctf_metadata_trace_pre_handler; - pos->print_names = 0; - break; - case O_RDONLY: - default: - fprintf(stderr, "[error] Incorrect open flags.\n"); - goto error; - } - - return &pos->trace_descriptor; -error: - g_free(pos); - return NULL; -} - -static -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); - if (pos->fp != stdout) { - ret = fclose(pos->fp); - if (ret) { - perror("Error on fclose"); - return -1; - } - } - g_free(pos); - return 0; -} - static void __attribute__((constructor)) ctf_text_init(void) { @@ -685,14 +600,10 @@ void __attribute__((constructor)) ctf_text_init(void) ctf_text_format.name = g_quark_from_static_string("text"); ret = bt_register_format(&ctf_text_format); assert(!ret); - ctf_metadata_format.name = g_quark_from_static_string("ctf-metadata"); - ret = bt_register_format(&ctf_metadata_format); - assert(!ret); } static void __attribute__((destructor)) ctf_text_exit(void) { - bt_unregister_format(&ctf_metadata_format); bt_unregister_format(&ctf_text_format); } -- 2.34.1