X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fir%2Ftrace.c;h=32ceca636f813e44aae98da61df8a41de5e2c5c7;hb=f3985ab106d89d8e764c1a8dd0c8bda09b755d10;hp=4cf2462b874f83a4f3403e1b8b53934fdc4c2bc4;hpb=e96045d4f186a5f3a7ed1f5585cf4cbfe890f579;p=babeltrace.git diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 4cf2462b..32ceca63 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -27,19 +27,20 @@ */ #include -#include +#include #include #include #include #include #include #include +#include #include #include #include #include #include -#include +#include #include #include #include @@ -383,44 +384,35 @@ end: return ret; } -int bt_ctf_trace_add_clock(struct bt_ctf_trace *trace, - struct bt_ctf_clock *clock) +int bt_ctf_trace_add_clock_class(struct bt_ctf_trace *trace, + struct bt_ctf_clock_class *clock_class) { int ret = 0; - struct search_query query = { .value = clock, .found = 0 }; + struct search_query query = { .value = clock_class, .found = 0 }; - if (!trace || !bt_ctf_clock_is_valid(clock)) { + if (!trace || !bt_ctf_clock_class_is_valid(clock_class)) { ret = -1; goto end; } - /* Check for duplicate clocks */ + /* Check for duplicate clock classes */ g_ptr_array_foreach(trace->clocks, value_exists, &query); if (query.found) { ret = -1; goto end; } - 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; - } + bt_get(clock_class); + g_ptr_array_add(trace->clocks, clock_class); if (trace->frozen) { - bt_ctf_clock_freeze(clock); + bt_ctf_clock_class_freeze(clock_class); } end: return ret; } -int bt_ctf_trace_get_clock_count(struct bt_ctf_trace *trace) +int bt_ctf_trace_get_clock_class_count(struct bt_ctf_trace *trace) { int ret = -1; @@ -433,19 +425,19 @@ end: return ret; } -struct bt_ctf_clock *bt_ctf_trace_get_clock(struct bt_ctf_trace *trace, - int index) +struct bt_ctf_clock_class *bt_ctf_trace_get_clock_class( + struct bt_ctf_trace *trace, int index) { - struct bt_ctf_clock *clock = NULL; + struct bt_ctf_clock_class *clock_class = NULL; if (!trace || index < 0 || index >= trace->clocks->len) { goto end; } - clock = g_ptr_array_index(trace->clocks, index); - bt_get(clock); + clock_class = g_ptr_array_index(trace->clocks, index); + bt_get(clock_class); end: - return clock; + return clock_class; } int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, @@ -465,7 +457,6 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, struct bt_ctf_field_type *event_header_type = NULL; struct bt_ctf_field_type *stream_event_ctx_type = NULL; int event_class_count; - struct bt_ctf_clock *clock_to_add_to_trace = NULL; struct bt_ctf_trace *current_parent_trace = NULL; if (!trace || !stream_class) { @@ -493,29 +484,41 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, } } - /* - * If the stream class has a clock, register this clock to this - * trace if not already done. - */ if (stream_class->clock) { - const char *clock_name = - bt_ctf_clock_get_name(stream_class->clock); - struct bt_ctf_clock *trace_clock; - - assert(clock_name); - trace_clock = bt_ctf_trace_get_clock_by_name(trace, clock_name); - bt_put(trace_clock); - if (trace_clock) { - if (trace_clock != stream_class->clock) { - /* - * Error: two different clocks in the - * trace would share the same name. - */ + struct bt_ctf_clock_class *stream_clock_class = + stream_class->clock->clock_class; + + if (trace->is_created_by_writer) { + /* + * Make sure this clock was also added to the + * trace (potentially through its CTF writer + * owner). + */ + size_t i; + + for (i = 0; i < trace->clocks->len; i++) { + if (trace->clocks->pdata[i] == + stream_clock_class) { + /* Found! */ + break; + } + } + + if (i == trace->clocks->len) { + /* Not found */ ret = -1; goto end; } } else { - clock_to_add_to_trace = bt_get(stream_class->clock); + /* + * This trace was NOT created by a CTF writer, + * thus do not allow the stream class to add to + * have a clock at all. Those are two + * independent APIs (non-writer and writer + * APIs), and isolating them simplifies things. + */ + ret = -1; + goto end; } } @@ -681,13 +684,6 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, trace->byte_order); bt_ctf_stream_class_set_byte_order(stream_class, trace->byte_order); - /* Add stream class's clock if it exists */ - if (clock_to_add_to_trace) { - int add_clock_ret = - bt_ctf_trace_add_clock(trace, clock_to_add_to_trace); - assert(add_clock_ret == 0); - } - /* * Freeze the trace and the stream class. */ @@ -696,7 +692,7 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, /* Notifiy listeners of the trace's schema modification. */ bt_ctf_stream_class_visit(stream_class, - bt_ctf_trace_element_modification, trace); + bt_ctf_trace_object_modification, trace); end: if (ret) { bt_object_set_parent(stream_class, NULL); @@ -711,7 +707,6 @@ end: g_free(ec_validation_outputs); bt_ctf_validation_output_put_types(&trace_sc_validation_output); - BT_PUT(clock_to_add_to_trace); bt_put(current_parent_trace); assert(!packet_header_type); assert(!packet_context_type); @@ -778,34 +773,34 @@ end: return stream_class; } -struct bt_ctf_clock *bt_ctf_trace_get_clock_by_name( +struct bt_ctf_clock_class *bt_ctf_trace_get_clock_class_by_name( struct bt_ctf_trace *trace, const char *name) { size_t i; - struct bt_ctf_clock *clock = NULL; + struct bt_ctf_clock_class *clock_class = NULL; if (!trace || !name) { goto end; } for (i = 0; i < trace->clocks->len; i++) { - struct bt_ctf_clock *cur_clk = + struct bt_ctf_clock_class *cur_clk = g_ptr_array_index(trace->clocks, i); - const char *cur_clk_name = bt_ctf_clock_get_name(cur_clk); + const char *cur_clk_name = bt_ctf_clock_class_get_name(cur_clk); if (!cur_clk_name) { goto end; } if (!strcmp(cur_clk_name, name)) { - clock = cur_clk; - bt_get(clock); + clock_class = cur_clk; + bt_get(clock_class); goto end; } } end: - return clock; + return clock_class; } BT_HIDDEN @@ -970,7 +965,7 @@ char *bt_ctf_trace_get_metadata_string(struct bt_ctf_trace *trace) } append_env_metadata(trace, context); g_ptr_array_foreach(trace->clocks, - (GFunc)bt_ctf_clock_serialize, context); + (GFunc)bt_ctf_clock_class_serialize, context); for (i = 0; i < trace->stream_classes->len; i++) { err = bt_ctf_stream_class_serialize( @@ -1073,21 +1068,21 @@ int bt_ctf_trace_set_packet_header_type(struct bt_ctf_trace *trace, { int ret = 0; - if (!trace || !packet_header_type || trace->frozen) { + if (!trace || trace->frozen) { ret = -1; goto end; } - /* packet_header_type must be a structure */ - if (bt_ctf_field_type_get_type_id(packet_header_type) != - BT_CTF_TYPE_ID_STRUCT) { + /* packet_header_type must be a structure. */ + if (packet_header_type && + bt_ctf_field_type_get_type_id(packet_header_type) != + BT_CTF_TYPE_ID_STRUCT) { ret = -1; goto end; } - bt_get(packet_header_type); bt_put(trace->packet_header_type); - trace->packet_header_type = packet_header_type; + trace->packet_header_type = bt_get(packet_header_type); end: return ret; } @@ -1107,35 +1102,35 @@ void *get_stream_class(void *element, int i) } static -int visit_stream_class(void *element, bt_ctf_ir_visitor visitor,void *data) +int visit_stream_class(void *object, bt_ctf_visitor visitor,void *data) { - return bt_ctf_stream_class_visit(element, visitor, data); + return bt_ctf_stream_class_visit(object, visitor, data); } int bt_ctf_trace_visit(struct bt_ctf_trace *trace, - bt_ctf_ir_visitor visitor, void *data) + bt_ctf_visitor visitor, void *data) { int ret; - struct bt_ctf_ir_element element = - { .element = trace, .type = BT_CTF_IR_TYPE_TRACE }; + struct bt_ctf_object obj = + { .object = trace, .type = BT_CTF_OBJECT_TYPE_TRACE }; if (!trace || !visitor) { ret = -1; goto end; } - ret = visitor_helper(&element, get_stream_class_count, + ret = visitor_helper(&obj, get_stream_class_count, get_stream_class, visit_stream_class, visitor, data); end: return ret; } static -int invoke_listener(struct bt_ctf_ir_element *element, void *data) +int invoke_listener(struct bt_ctf_object *object, void *data) { struct listener_wrapper *listener_wrapper = data; - listener_wrapper->listener(element, listener_wrapper->data); + listener_wrapper->listener(object, listener_wrapper->data); return 0; } @@ -1172,14 +1167,14 @@ error: } BT_HIDDEN -int bt_ctf_trace_element_modification(struct bt_ctf_ir_element *element, +int bt_ctf_trace_object_modification(struct bt_ctf_object *object, void *trace_ptr) { size_t i; struct bt_ctf_trace *trace = trace_ptr; assert(trace); - assert(element); + assert(object); if (trace->listeners->len == 0) { goto end; @@ -1189,7 +1184,7 @@ int bt_ctf_trace_element_modification(struct bt_ctf_ir_element *element, struct listener_wrapper *listener = g_ptr_array_index(trace->listeners, i); - listener->listener(element, listener->data); + listener->listener(object, listener->data); } end: return 0; @@ -1226,10 +1221,10 @@ void bt_ctf_trace_freeze(struct bt_ctf_trace *trace) bt_ctf_attributes_freeze(trace->environment); for (i = 0; i < trace->clocks->len; i++) { - struct bt_ctf_clock *clock = + struct bt_ctf_clock_class *clock_class = g_ptr_array_index(trace->clocks, i); - bt_ctf_clock_freeze(clock); + bt_ctf_clock_class_freeze(clock_class); } trace->frozen = 1;