#define _XOPEN_SOURCE 700
#include <config.h>
-#include <babeltrace/babeltrace-internal.h>
+#include <babeltrace/babeltrace.h>
#include <babeltrace/format.h>
+#include <babeltrace/context.h>
+#include <babeltrace/ctf/types.h>
+#include <babeltrace/ctf-text/types.h>
#include <popt.h>
#include <errno.h>
#include <stdlib.h>
g_ptr_array_add(tc->array, td);
}
+int convert_trace(struct trace_descriptor *td_write,
+ struct bt_context *ctx)
+{
+ struct babeltrace_iter *iter;
+ struct ctf_stream *stream;
+ struct ctf_stream_event *event;
+ struct ctf_text_stream_pos *sout;
+ struct trace_collection_pos begin_pos;
+ int ret;
+
+ sout = container_of(td_write, struct ctf_text_stream_pos,
+ trace_descriptor);
+
+ begin_pos.type = BT_SEEK_BEGIN;
+ iter = babeltrace_iter_create(ctx, &begin_pos, NULL);
+ if (!iter) {
+ ret = -1;
+ goto error_iter;
+ }
+ while (babeltrace_iter_read_event(iter, &stream, &event) == 0) {
+ ret = sout->parent.event_cb(&sout->parent, stream);
+ if (ret) {
+ fprintf(stdout, "[error] Writing event failed.\n");
+ goto end;
+ }
+ ret = babeltrace_iter_next(iter);
+ if (ret < 0)
+ goto end;
+ }
+ ret = 0;
+
+end:
+ babeltrace_iter_destroy(iter);
+error_iter:
+ return ret;
+}
+
+
/*
* traverse_dir() is the callback functiion for File Tree Walk (nftw).
* it receives the path of the current entry (file, dir, link..etc) with
int ret;
struct format *fmt_write;
struct trace_descriptor *td_write;
+ struct bt_context *ctx;
ret = parse_options(argc, argv);
if (ret < 0) {
" no output was generated\n");
return 0;
}
-
+ ctx = bt_context_create(&trace_collection_read);
+ if (!ctx) {
+ fprintf(stdout, "Error allocating a new context\n");
+ goto error_td_read;
+ }
td_write = fmt_write->open_trace(NULL, opt_output_path, O_RDWR, NULL, NULL);
if (!td_write) {
fprintf(stdout, "Error opening trace \"%s\" for writing.\n\n",
goto error_td_write;
}
- ret = convert_trace(td_write, &trace_collection_read);
+ ret = convert_trace(td_write, ctx);
if (ret) {
fprintf(stdout, "Error printing trace.\n\n");
goto error_copy_trace;
fmt_write->close_trace(td_write);
finalize_trace_collection(&trace_collection_read);
+ bt_context_destroy(ctx);
printf_verbose("finished converting. Output written to:\n%s\n",
opt_output_path ? : "<stdout>");
exit(EXIT_SUCCESS);
babeltraceinclude_HEADERS = \
babeltrace/babeltrace.h \
- babeltrace/format.h
+ babeltrace/format.h \
+ babeltrace/context.h
noinst_HEADERS = \
struct trace_descriptor;
struct trace_collection {
- GPtrArray *array;
+ GPtrArray *array; /* struct trace_descriptor */
};
-int convert_trace(struct trace_descriptor *td_write,
- struct trace_collection *trace_collection_read);
-
extern int opt_all_field_names,
opt_scope_field_names,
opt_header_field_names,
#include <glib.h>
#include <stdint.h>
#include <babeltrace/format.h>
+#include <babeltrace/context.h>
typedef GQuark bt_event_name;
struct ctf_stream;
struct babeltrace_saved_pos;
struct bt_dependencies;
+struct bt_context;
enum bt_cb_ret {
BT_CB_OK = 0,
* 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 bt_context *ctx,
struct trace_collection_pos *begin_pos,
struct trace_collection_pos *end_pos);
*/
#include <babeltrace/types.h>
-#include <babeltrace/ctf/types.h>
#include <stdint.h>
#include <stdio.h>
#include <glib.h>
+/* forward declaration */
+struct ctf_stream_pos;
+
/* Parent trace descriptor */
struct trace_descriptor {
};
*/
struct babeltrace_iter {
struct ptr_heap *stream_heap;
- struct trace_collection *tc;
+ struct bt_context *ctx;
struct trace_collection_pos *end_pos;
GArray *callbacks; /* Array of struct bt_stream_callbacks */
struct bt_callback_chain main_callbacks; /* For all events */
libbabeltrace_la_SOURCES = babeltrace.c \
callbacks.c \
- iterator.c
+ iterator.c \
+ context.c
libbabeltrace_la_LIBADD = \
$(top_builddir)/types/libbabeltrace_types.la \
*/
#include <babeltrace/babeltrace.h>
+#include <babeltrace/context.h>
#include <babeltrace/ctf-text/types.h>
#include <stdlib.h>
int babeltrace_verbose, babeltrace_debug;
-int convert_trace(struct trace_descriptor *td_write,
- struct trace_collection *trace_collection_read)
-{
- struct babeltrace_iter *iter;
- struct ctf_stream *stream;
- struct ctf_stream_event *event;
- struct ctf_text_stream_pos *sout;
- struct trace_collection_pos begin_pos;
- int ret = 0;
-
- sout = container_of(td_write, struct ctf_text_stream_pos,
- trace_descriptor);
-
- begin_pos.type = BT_SEEK_BEGIN;
- iter = babeltrace_iter_create(trace_collection_read, &begin_pos, NULL);
- while (babeltrace_iter_read_event(iter, &stream, &event) == 0) {
- ret = sout->parent.event_cb(&sout->parent, stream);
- if (ret) {
- fprintf(stdout, "[error] Writing event failed.\n");
- goto end;
- }
- ret = babeltrace_iter_next(iter);
- if (ret < 0)
- goto end;
- }
-end:
- babeltrace_iter_destroy(iter);
- return ret;
-}
-
static
void __attribute__((constructor)) init_babeltrace_lib(void)
{
#include <babeltrace/babeltrace.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/callbacks-internal.h>
+#include <babeltrace/context.h>
#include <babeltrace/ctf-ir/metadata.h>
#include <babeltrace/iterator-internal.h>
#include <inttypes.h>
int i, stream_id;
gpointer *event_id_ptr;
unsigned long event_id;
- struct trace_collection *tc = iter->tc;
+ struct trace_collection *tc = iter->ctx->tc;
for (i = 0; i < tc->array->len; i++) {
struct ctf_trace *tin;
#include <stdlib.h>
#include <babeltrace/babeltrace.h>
#include <babeltrace/callbacks-internal.h>
+#include <babeltrace/context.h>
#include <babeltrace/ctf/metadata.h>
#include <babeltrace/iterator-internal.h>
#include <babeltrace/prio_heap.h>
{
int i, stream_id;
int ret = 0;
- struct trace_collection *tc = iter->tc;
+ struct trace_collection *tc = iter->ctx->tc;
for (i = 0; i < tc->array->len; i++) {
struct ctf_trace *tin;
return ret;
}
-struct babeltrace_iter *babeltrace_iter_create(struct trace_collection *tc,
+struct babeltrace_iter *babeltrace_iter_create(struct bt_context *ctx,
struct trace_collection_pos *begin_pos,
struct trace_collection_pos *end_pos)
{
if (!iter)
goto error_malloc;
iter->stream_heap = g_new(struct ptr_heap, 1);
- iter->tc = tc;
iter->end_pos = end_pos;
iter->callbacks = g_array_new(0, 1, sizeof(struct bt_stream_callbacks));
iter->recalculate_dep_graph = 0;
iter->main_callbacks.callback = NULL;
iter->dep_gc = g_ptr_array_new();
+ if (bt_context_get(ctx) != 0)
+ goto error_ctx;
+ iter->ctx = ctx;
ret = heap_init(iter->stream_heap, 0, stream_compare);
if (ret < 0)
goto error_heap_init;
- for (i = 0; i < tc->array->len; i++) {
+ for (i = 0; i < ctx->tc->array->len; i++) {
struct ctf_trace *tin;
struct trace_descriptor *td_read;
- td_read = g_ptr_array_index(tc->array, i);
+ td_read = g_ptr_array_index(ctx->tc->array, i);
tin = container_of(td_read, struct ctf_trace, parent);
/* Populate heap with each stream */
heap_free(iter->stream_heap);
error_heap_init:
g_free(iter->stream_heap);
+error_ctx:
free(iter);
error_malloc:
return NULL;
g_array_free(bt_stream_cb->per_id_callbacks, TRUE);
}
+ bt_context_put(iter->ctx);
+
free(iter);
}