#include <babeltrace/ctf/metadata.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/ctf/events-internal.h>
+#include <babeltrace/trace-handle-internal.h>
+#include <babeltrace/context-internal.h>
#include <babeltrace/uuid.h>
#include <babeltrace/endian.h>
#include <inttypes.h>
#include "metadata/ctf-parser.h"
#include "metadata/ctf-ast.h"
#include "events-private.h"
+#include "memstream.h"
/*
* We currently simply map a page to read the packet header and packet
void (*packet_seek)(struct stream_pos *pos, size_t index,
int whence),
FILE *metadata_fp);
+static
+void ctf_set_context(struct trace_descriptor *descriptor,
+ struct bt_context *ctx);
+static
+void ctf_set_handle(struct trace_descriptor *descriptor,
+ struct bt_trace_handle *handle);
static
void ctf_close_trace(struct trace_descriptor *descriptor);
.open_trace = ctf_open_trace,
.open_mmap_trace = ctf_open_mmap_trace,
.close_trace = ctf_close_trace,
+ .set_context = ctf_set_context,
+ .set_handle = ctf_set_handle,
};
/*
* Update stream current timestamp, keep at clock frequency.
*/
static
-void ctf_update_timestamp(struct ctf_stream *stream,
+void ctf_update_timestamp(struct ctf_stream_definition *stream,
struct definition_integer *integer_definition)
{
struct declaration_integer *integer_declaration =
* applying offsets as needed (unix time).
*/
void ctf_print_timestamp(FILE *fp,
- struct ctf_stream *stream,
+ struct ctf_stream_definition *stream,
uint64_t timestamp)
{
uint64_t ts_sec = 0, ts_nsec;
}
static
-int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
+int ctf_read_event(struct stream_pos *ppos, struct ctf_stream_definition *stream)
{
struct ctf_stream_pos *pos =
container_of(ppos, struct ctf_stream_pos, parent);
- struct ctf_stream_class *stream_class = stream->stream_class;
- struct ctf_stream_event *event;
+ struct ctf_stream_declaration *stream_class = stream->stream_class;
+ struct ctf_event_definition *event;
uint64_t id = 0;
int ret;
}
static
-int ctf_write_event(struct stream_pos *pos, struct ctf_stream *stream)
+int ctf_write_event(struct stream_pos *pos, struct ctf_stream_definition *stream)
{
- struct ctf_stream_class *stream_class = stream->stream_class;
- struct ctf_stream_event *event;
+ struct ctf_stream_declaration *stream_class = stream->stream_class;
+ struct ctf_event_definition *event;
uint64_t id;
int ret;
* because its size includes garbage at the end (after final
* \0). This is the allocated size, not the actual string size.
*/
- out = open_memstream(buf, &size);
+ out = babeltrace_open_memstream(buf, &size);
if (out == NULL) {
perror("Metadata open_memstream");
return -errno;
break;
}
}
- fclose(out); /* flush the buffer */
+ /* close to flush the buffer */
+ ret = babeltrace_close_memstream(buf, &size, out);
+ if (ret < 0) {
+ perror("babeltrace_flush_memstream");
+ fclose(in);
+ return -errno;
+ }
fclose(in);
/* open for reading */
- *fp = fmemopen(*buf, strlen(*buf), "rb");
+ *fp = babeltrace_fmemopen(*buf, strlen(*buf), "rb");
if (!*fp) {
perror("Metadata fmemopen");
return -errno;
}
static
-struct ctf_stream_event *create_event_definitions(struct ctf_trace *td,
- struct ctf_stream *stream,
- struct ctf_event *event)
+struct ctf_event_definition *create_event_definitions(struct ctf_trace *td,
+ struct ctf_stream_definition *stream,
+ struct ctf_event_declaration *event)
{
- struct ctf_stream_event *stream_event = g_new0(struct ctf_stream_event, 1);
+ struct ctf_event_definition *stream_event = g_new0(struct ctf_event_definition, 1);
if (event->context_decl) {
struct definition *definition =
}
static
-int create_stream_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_stream_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
{
- struct ctf_stream_class *stream_class;
+ struct ctf_stream_declaration *stream_class;
int ret;
int i;
stream->events_by_id = g_ptr_array_new();
g_ptr_array_set_size(stream->events_by_id, stream_class->events_by_id->len);
for (i = 0; i < stream->events_by_id->len; i++) {
- struct ctf_event *event = g_ptr_array_index(stream_class->events_by_id, i);
- struct ctf_stream_event *stream_event;
+ struct ctf_event_declaration *event = g_ptr_array_index(stream_class->events_by_id, i);
+ struct ctf_event_definition *stream_event;
if (!event)
continue;
error_event:
for (i = 0; i < stream->events_by_id->len; i++) {
- struct ctf_stream_event *stream_event = g_ptr_array_index(stream->events_by_id, i);
+ struct ctf_event_definition *stream_event = g_ptr_array_index(stream->events_by_id, i);
if (stream_event)
g_free(stream_event);
}
int create_stream_packet_index(struct ctf_trace *td,
struct ctf_file_stream *file_stream)
{
- struct ctf_stream_class *stream;
+ struct ctf_stream_declaration *stream;
int len_index;
struct ctf_stream_pos *pos;
struct stat filestats;
}
static
-int create_trace_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_trace_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
{
int ret;
int prepare_mmap_stream_definition(struct ctf_trace *td,
struct ctf_file_stream *file_stream)
{
- struct ctf_stream_class *stream;
+ struct ctf_stream_declaration *stream;
uint64_t stream_id = 0;
int ret;
if (td->streams) {
for (i = 0; i < td->streams->len; i++) {
- struct ctf_stream_class *stream;
+ struct ctf_stream_declaration *stream;
int j;
stream = g_ptr_array_index(td->streams, i);
g_free(td);
}
+static
+void ctf_set_context(struct trace_descriptor *descriptor,
+ struct bt_context *ctx)
+{
+ struct ctf_trace *td = container_of(descriptor, struct ctf_trace,
+ parent);
+
+ td->ctx = ctx;
+}
+
+static
+void ctf_set_handle(struct trace_descriptor *descriptor,
+ struct bt_trace_handle *handle)
+{
+ struct ctf_trace *td = container_of(descriptor, struct ctf_trace,
+ parent);
+
+ td->handle = handle;
+}
+
void __attribute__((constructor)) ctf_init(void)
{
int ret;