X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fir%2Ftrace.c;h=2b3fb0e65e580851e4cf690438ac8b07d54ee8d9;hb=50ad4244902f4a54207862e0fe289775b2ea22fd;hp=2c0e7670f627600ef4bf7dc8ab3e7cbbd1aa02be;hpb=fe13b5c0fb0d94b39614ad0da83fc607ccd22f7d;p=babeltrace.git diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 2c0e7670..2b3fb0e6 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -37,7 +37,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -46,6 +48,11 @@ #define DEFAULT_IDENTIFIER_SIZE 128 #define DEFAULT_METADATA_STRING_SIZE 4096 +struct listener_wrapper { + bt_ctf_listener_cb listener; + void *data; +}; + static void bt_ctf_trace_destroy(struct bt_object *obj); static @@ -136,43 +143,6 @@ void bt_ctf_trace_destroy(struct bt_object *obj) g_free(trace); } -struct bt_ctf_stream *bt_ctf_trace_create_stream(struct bt_ctf_trace *trace, - struct bt_ctf_stream_class *stream_class) -{ - int ret; - int stream_class_found = 0; - size_t i; - struct bt_ctf_stream *stream = NULL; - - if (!trace || !stream_class) { - goto error; - } - - for (i = 0; i < trace->stream_classes->len; i++) { - if (trace->stream_classes->pdata[i] == stream_class) { - stream_class_found = 1; - } - } - - if (!stream_class_found) { - ret = bt_ctf_trace_add_stream_class(trace, stream_class); - if (ret) { - goto error; - } - } - - stream = bt_ctf_stream_create(stream_class, trace); - if (!stream) { - goto error; - } - - g_ptr_array_add(trace->streams, stream); - return stream; -error: - BT_PUT(stream); - return stream; -} - int bt_ctf_trace_set_environment_field(struct bt_ctf_trace *trace, const char *name, struct bt_value *value) { @@ -388,6 +358,15 @@ int bt_ctf_trace_add_clock(struct bt_ctf_trace *trace, bt_get(clock); g_ptr_array_add(trace->clocks, clock); + if (!trace->is_created_by_writer) { + /* + * Non-writer mode trace: disable clock value functions + * because clock values are per-stream in that + * situation. + */ + clock->has_value = 0; + } + if (trace->frozen) { bt_ctf_clock_freeze(clock); } @@ -1055,9 +1034,107 @@ end: return ret; } +static +int get_stream_class_count(void *element) +{ + return bt_ctf_trace_get_stream_class_count( + (struct bt_ctf_trace *) element); +} + +static +void *get_stream_class(void *element, int i) +{ + return bt_ctf_trace_get_stream_class( + (struct bt_ctf_trace *) element, i); +} + +static +int visit_stream_class(void *element, bt_ctf_ir_visitor visitor,void *data) +{ + return bt_ctf_stream_class_visit(element, visitor, data); +} + +int bt_ctf_trace_visit(struct bt_ctf_trace *trace, + bt_ctf_ir_visitor visitor, void *data) +{ + int ret; + struct bt_ctf_ir_element element = + { .element = trace, .type = BT_CTF_IR_TYPE_TRACE }; + + if (!trace || !visitor) { + ret = -1; + goto end; + } + + ret = visitor_helper(&element, get_stream_class_count, + get_stream_class, visit_stream_class, visitor, data); +end: + return ret; +} + +static +int ir_visitor(struct bt_ctf_ir_element *element, void *data) +{ + int ret = 0; + + switch (element->type) { + case BT_CTF_IR_TYPE_TRACE: + { + break; + } + case BT_CTF_IR_TYPE_STREAM_CLASS: + { + break; + } + case BT_CTF_IR_TYPE_EVENT_CLASS: + { + break; + } + default: + assert(0); + ret = -1; + goto end; + } +end: + return ret; +} + +int bt_ctf_trace_add_listener(struct bt_ctf_trace *trace, + bt_ctf_listener_cb listener, void *listener_data) +{ + int ret = 0; + struct listener_wrapper *listener_wrapper = + g_new0(struct listener_wrapper, 1); + + if (!trace || !listener || !listener_wrapper) { + ret = -1; + goto error; + } + + listener_wrapper->listener = listener; + listener_wrapper->data = listener_data; + + /* Visit the current schema. */ + ret = bt_ctf_trace_visit(trace, ir_visitor, listener_wrapper); + if (ret) { + goto error; + } + + /* + * Add listener to the array of callbacks which will be invoked on + * schema changes. + */ + g_ptr_array_add(trace->listeners, listener_wrapper); + return ret; +error: + g_free(listener_wrapper); + return ret; +} + BT_HIDDEN struct bt_ctf_field_type *get_field_type(enum field_type_alias alias) { + int ret; unsigned int alignment, size; struct bt_ctf_field_type *field_type = NULL; @@ -1068,7 +1145,10 @@ struct bt_ctf_field_type *get_field_type(enum field_type_alias alias) alignment = field_type_aliases_alignments[alias]; size = field_type_aliases_sizes[alias]; field_type = bt_ctf_field_type_integer_create(size); - bt_ctf_field_type_set_alignment(field_type, alignment); + ret = bt_ctf_field_type_set_alignment(field_type, alignment); + if (ret) { + BT_PUT(field_type); + } end: return field_type; }