From 272df73edf74c3d8d6cbbf6450258fdbc9fbad36 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Mon, 8 Feb 2016 20:05:55 -0500 Subject: [PATCH] ir: split event files into event and event-class files MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- bindings/python/python-complements.c | 1 + formats/ctf/ir/Makefile.am | 1 + formats/ctf/ir/event-class.c | 670 ++++++++++++++++++ formats/ctf/ir/event.c | 632 +---------------- formats/ctf/ir/stream-class.c | 1 + formats/ctf/ir/trace.c | 2 + formats/ctf/ir/validation.c | 2 +- include/Makefile.am | 2 + .../babeltrace/ctf-ir/event-class-internal.h | 77 ++ include/babeltrace/ctf-ir/event-class.h | 328 +++++++++ include/babeltrace/ctf-ir/event-internal.h | 39 +- include/babeltrace/ctf-ir/event.h | 278 -------- include/babeltrace/ctf-writer/event.h | 1 + tests/lib/test_bt_ctf_field_type_validation.c | 1 + tests/lib/test_ctf_ir_ref.c | 1 + 15 files changed, 1089 insertions(+), 947 deletions(-) create mode 100644 formats/ctf/ir/event-class.c create mode 100644 include/babeltrace/ctf-ir/event-class-internal.h create mode 100644 include/babeltrace/ctf-ir/event-class.h diff --git a/bindings/python/python-complements.c b/bindings/python/python-complements.c index 08b7912f..2622542b 100644 --- a/bindings/python/python-complements.c +++ b/bindings/python/python-complements.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include diff --git a/formats/ctf/ir/Makefile.am b/formats/ctf/ir/Makefile.am index d483ff89..5b29ff77 100644 --- a/formats/ctf/ir/Makefile.am +++ b/formats/ctf/ir/Makefile.am @@ -6,6 +6,7 @@ libctf_ir_la_SOURCES = \ attributes.c \ clock.c \ event.c \ + event-class.c \ fields.c \ field-types.c \ field-path.c \ diff --git a/formats/ctf/ir/event-class.c b/formats/ctf/ir/event-class.c new file mode 100644 index 00000000..84976e80 --- /dev/null +++ b/formats/ctf/ir/event-class.c @@ -0,0 +1,670 @@ +/* + * event-class.c + * + * Babeltrace CTF IR - Event class + * + * Copyright 2013, 2014 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * 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 + +static +void bt_ctf_event_class_destroy(struct bt_object *obj); + +struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name) +{ + int ret; + struct bt_value *obj = NULL; + struct bt_ctf_event_class *event_class = NULL; + + if (bt_ctf_validate_identifier(name)) { + goto error; + } + + event_class = g_new0(struct bt_ctf_event_class, 1); + if (!event_class) { + goto error; + } + + bt_object_init(event_class, bt_ctf_event_class_destroy); + event_class->fields = bt_ctf_field_type_structure_create(); + if (!event_class->fields) { + goto error; + } + + event_class->attributes = bt_ctf_attributes_create(); + if (!event_class->attributes) { + goto error; + } + + obj = bt_value_integer_create_init(-1); + if (!obj) { + goto error; + } + + ret = bt_ctf_attributes_set_field_value(event_class->attributes, + "id", obj); + if (ret) { + goto error; + } + + BT_PUT(obj); + + obj = bt_value_string_create_init(name); + if (!obj) { + goto error; + } + + ret = bt_ctf_attributes_set_field_value(event_class->attributes, + "name", obj); + if (ret) { + goto error; + } + + BT_PUT(obj); + + return event_class; + +error: + BT_PUT(event_class); + BT_PUT(obj); + return event_class; +} + +const char *bt_ctf_event_class_get_name(struct bt_ctf_event_class *event_class) +{ + struct bt_value *obj = NULL; + const char *name = NULL; + + if (!event_class) { + goto end; + } + + obj = bt_ctf_attributes_get_field_value(event_class->attributes, + BT_CTF_EVENT_CLASS_ATTR_NAME_INDEX); + if (!obj) { + goto end; + } + + if (bt_value_string_get(obj, &name)) { + name = NULL; + } + +end: + BT_PUT(obj); + return name; +} + +int64_t bt_ctf_event_class_get_id(struct bt_ctf_event_class *event_class) +{ + struct bt_value *obj = NULL; + int64_t ret = 0; + + if (!event_class) { + ret = -1; + goto end; + } + + obj = bt_ctf_attributes_get_field_value(event_class->attributes, + BT_CTF_EVENT_CLASS_ATTR_ID_INDEX); + if (!obj) { + goto end; + } + + if (bt_value_integer_get(obj, &ret)) { + ret = -1; + } + + if (ret < 0) { + /* means ID is not set */ + ret = -1; + goto end; + } + +end: + BT_PUT(obj); + return ret; +} + +int bt_ctf_event_class_set_id(struct bt_ctf_event_class *event_class, + uint32_t id) +{ + int ret = 0; + struct bt_value *obj = NULL; + struct bt_ctf_stream_class *stream_class = NULL; + + + if (!event_class) { + ret = -1; + goto end; + } + + stream_class = bt_ctf_event_class_get_stream_class(event_class); + if (stream_class) { + /* + * We don't allow changing the id if the event class has already + * been added to a stream class. + */ + ret = -1; + goto end; + } + + obj = bt_ctf_attributes_get_field_value(event_class->attributes, + BT_CTF_EVENT_CLASS_ATTR_ID_INDEX); + if (!obj) { + goto end; + } + + if (bt_value_integer_set(obj, id)) { + ret = -1; + goto end; + } + +end: + BT_PUT(obj); + BT_PUT(stream_class); + return ret; +} + +int bt_ctf_event_class_set_attribute( + struct bt_ctf_event_class *event_class, const char *name, + struct bt_value *value) +{ + int ret = 0; + + if (!event_class || !name || !value || event_class->frozen) { + ret = -1; + goto end; + } + + if (!strcmp(name, "id") || !strcmp(name, "loglevel")) { + if (!bt_value_is_integer(value)) { + ret = -1; + goto end; + } + } else if (!strcmp(name, "name") || !strcmp(name, "model.emf.uri")) { + if (!bt_value_is_string(value)) { + ret = -1; + goto end; + } + } else { + /* unknown attribute */ + ret = -1; + goto end; + } + + /* "id" special case: >= 0 */ + if (!strcmp(name, "id")) { + int64_t val; + + ret = bt_value_integer_get(value, &val); + + if (ret) { + goto end; + } + + if (val < 0) { + ret = -1; + goto end; + } + } + + ret = bt_ctf_attributes_set_field_value(event_class->attributes, + name, value); + +end: + return ret; +} + +int bt_ctf_event_class_get_attribute_count( + struct bt_ctf_event_class *event_class) +{ + int ret = 0; + + if (!event_class) { + ret = -1; + goto end; + } + + ret = bt_ctf_attributes_get_count(event_class->attributes); + +end: + return ret; +} + +const char * +bt_ctf_event_class_get_attribute_name( + struct bt_ctf_event_class *event_class, int index) +{ + const char *ret; + + if (!event_class) { + ret = NULL; + goto end; + } + + ret = bt_ctf_attributes_get_field_name(event_class->attributes, index); + +end: + return ret; +} + +struct bt_value * +bt_ctf_event_class_get_attribute_value(struct bt_ctf_event_class *event_class, + int index) +{ + struct bt_value *ret; + + if (!event_class) { + ret = NULL; + goto end; + } + + ret = bt_ctf_attributes_get_field_value(event_class->attributes, index); + +end: + return ret; +} + +struct bt_value * +bt_ctf_event_class_get_attribute_value_by_name( + struct bt_ctf_event_class *event_class, const char *name) +{ + struct bt_value *ret; + + if (!event_class || !name) { + ret = NULL; + goto end; + } + + ret = bt_ctf_attributes_get_field_value_by_name(event_class->attributes, + name); + +end: + return ret; + +} + +struct bt_ctf_stream_class *bt_ctf_event_class_get_stream_class( + struct bt_ctf_event_class *event_class) +{ + return (struct bt_ctf_stream_class *) bt_object_get_parent(event_class); +} + +struct bt_ctf_field_type *bt_ctf_event_class_get_payload_type( + struct bt_ctf_event_class *event_class) +{ + struct bt_ctf_field_type *payload = NULL; + + if (!event_class) { + goto end; + } + + bt_get(event_class->fields); + payload = event_class->fields; +end: + return payload; +} + +int bt_ctf_event_class_set_payload_type(struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *payload) +{ + int ret = 0; + + if (!event_class || !payload || + bt_ctf_field_type_get_type_id(payload) != + BT_CTF_TYPE_ID_STRUCT) { + ret = -1; + goto end; + } + + bt_get(payload); + bt_put(event_class->fields); + event_class->fields = payload; +end: + return ret; +} + +int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *type, + const char *name) +{ + int ret = 0; + + if (!event_class || !type || bt_ctf_validate_identifier(name) || + event_class->frozen) { + ret = -1; + goto end; + } + + if (bt_ctf_field_type_get_type_id(event_class->fields) != + BT_CTF_TYPE_ID_STRUCT) { + ret = -1; + goto end; + } + + ret = bt_ctf_field_type_structure_add_field(event_class->fields, + type, name); +end: + return ret; +} + +int bt_ctf_event_class_get_field_count( + struct bt_ctf_event_class *event_class) +{ + int ret; + + if (!event_class) { + ret = -1; + goto end; + } + + if (bt_ctf_field_type_get_type_id(event_class->fields) != + BT_CTF_TYPE_ID_STRUCT) { + ret = -1; + goto end; + } + + ret = bt_ctf_field_type_structure_get_field_count(event_class->fields); +end: + return ret; +} + +int bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, + const char **field_name, struct bt_ctf_field_type **field_type, + int index) +{ + int ret; + + if (!event_class || index < 0) { + ret = -1; + goto end; + } + + if (bt_ctf_field_type_get_type_id(event_class->fields) != + BT_CTF_TYPE_ID_STRUCT) { + ret = -1; + goto end; + } + + ret = bt_ctf_field_type_structure_get_field(event_class->fields, + field_name, field_type, index); +end: + return ret; +} + +struct bt_ctf_field_type *bt_ctf_event_class_get_field_by_name( + struct bt_ctf_event_class *event_class, const char *name) +{ + GQuark name_quark; + struct bt_ctf_field_type *field_type = NULL; + + if (!event_class || !name) { + goto end; + } + + if (bt_ctf_field_type_get_type_id(event_class->fields) != + BT_CTF_TYPE_ID_STRUCT) { + goto end; + } + + name_quark = g_quark_try_string(name); + if (!name_quark) { + goto end; + } + + /* + * No need to increment field_type's reference count since getting it + * from the structure already does. + */ + field_type = bt_ctf_field_type_structure_get_field_type_by_name( + event_class->fields, name); +end: + return field_type; +} + +struct bt_ctf_field_type *bt_ctf_event_class_get_context_type( + struct bt_ctf_event_class *event_class) +{ + struct bt_ctf_field_type *context_type = NULL; + + if (!event_class || !event_class->context) { + goto end; + } + + bt_get(event_class->context); + context_type = event_class->context; +end: + return context_type; +} + +int bt_ctf_event_class_set_context_type( + struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *context) +{ + int ret = 0; + + if (!event_class || !context || event_class->frozen) { + ret = -1; + goto end; + } + + if (bt_ctf_field_type_get_type_id(context) != BT_CTF_TYPE_ID_STRUCT) { + ret = -1; + goto end; + } + + bt_get(context); + bt_put(event_class->context); + event_class->context = context; +end: + return ret; + +} + +void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class) +{ + bt_get(event_class); +} + +void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class) +{ + bt_put(event_class); +} + +BT_HIDDEN +int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class, + uint32_t stream_id) +{ + int ret = 0; + struct bt_value *obj; + + obj = bt_value_integer_create_init(stream_id); + + if (!obj) { + ret = -1; + goto end; + } + + ret = bt_ctf_attributes_set_field_value(event_class->attributes, + "stream_id", obj); + + if (event_class->frozen) { + bt_ctf_attributes_freeze(event_class->attributes); + } + +end: + BT_PUT(obj); + return ret; +} + +static +void bt_ctf_event_class_destroy(struct bt_object *obj) +{ + struct bt_ctf_event_class *event_class; + + event_class = container_of(obj, struct bt_ctf_event_class, base); + bt_ctf_attributes_destroy(event_class->attributes); + bt_put(event_class->context); + bt_put(event_class->fields); + g_free(event_class); +} + +BT_HIDDEN +void bt_ctf_event_class_freeze(struct bt_ctf_event_class *event_class) +{ + assert(event_class); + event_class->frozen = 1; + bt_ctf_field_type_freeze(event_class->context); + bt_ctf_field_type_freeze(event_class->fields); + bt_ctf_attributes_freeze(event_class->attributes); +} + +BT_HIDDEN +int bt_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, + struct metadata_context *context) +{ + int i; + int count; + int ret = 0; + struct bt_value *attr_value = NULL; + + assert(event_class); + assert(context); + + context->current_indentation_level = 1; + g_string_assign(context->field_name, ""); + g_string_append(context->string, "event {\n"); + count = bt_ctf_event_class_get_attribute_count(event_class); + + if (count < 0) { + ret = -1; + goto end; + } + + for (i = 0; i < count; ++i) { + const char *attr_name = NULL; + + attr_name = bt_ctf_event_class_get_attribute_name( + event_class, i); + attr_value = bt_ctf_event_class_get_attribute_value( + event_class, i); + + if (!attr_name || !attr_value) { + ret = -1; + goto end; + } + + switch (bt_value_get_type(attr_value)) { + case BT_VALUE_TYPE_INTEGER: + { + int64_t value; + + ret = bt_value_integer_get(attr_value, &value); + + if (ret) { + goto end; + } + + g_string_append_printf(context->string, + "\t%s = %" PRId64 ";\n", attr_name, value); + break; + } + + case BT_VALUE_TYPE_STRING: + { + const char *value; + + ret = bt_value_string_get(attr_value, &value); + + if (ret) { + goto end; + } + + g_string_append_printf(context->string, + "\t%s = \"%s\";\n", attr_name, value); + break; + } + + default: + /* should never happen */ + assert(false); + break; + } + + BT_PUT(attr_value); + } + + if (event_class->context) { + g_string_append(context->string, "\tcontext := "); + ret = bt_ctf_field_type_serialize(event_class->context, + context); + if (ret) { + goto end; + } + g_string_append(context->string, ";\n"); + } + + if (event_class->fields) { + g_string_append(context->string, "\tfields := "); + ret = bt_ctf_field_type_serialize(event_class->fields, context); + if (ret) { + goto end; + } + g_string_append(context->string, ";\n"); + } + + g_string_append(context->string, "};\n\n"); +end: + context->current_indentation_level = 0; + BT_PUT(attr_value); + return ret; +} + +void bt_ctf_event_class_set_native_byte_order( + struct bt_ctf_event_class *event_class, + int byte_order) +{ + if (!event_class) { + return; + } + + assert(byte_order == 0 || byte_order == LITTLE_ENDIAN || + byte_order == BIG_ENDIAN); + + bt_ctf_field_type_set_native_byte_order(event_class->context, + byte_order); + bt_ctf_field_type_set_native_byte_order(event_class->fields, + byte_order); +} diff --git a/formats/ctf/ir/event.c b/formats/ctf/ir/event.c index 8ddf8034..82ed0d94 100644 --- a/formats/ctf/ir/event.c +++ b/formats/ctf/ir/event.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -38,500 +40,11 @@ #include #include -static -void bt_ctf_event_class_destroy(struct bt_object *obj); static void bt_ctf_event_destroy(struct bt_object *obj); static int set_integer_field_value(struct bt_ctf_field *field, uint64_t value); -struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name) -{ - int ret; - struct bt_value *obj = NULL; - struct bt_ctf_event_class *event_class = NULL; - - if (bt_ctf_validate_identifier(name)) { - goto error; - } - - event_class = g_new0(struct bt_ctf_event_class, 1); - if (!event_class) { - goto error; - } - - bt_object_init(event_class, bt_ctf_event_class_destroy); - event_class->fields = bt_ctf_field_type_structure_create(); - if (!event_class->fields) { - goto error; - } - - event_class->attributes = bt_ctf_attributes_create(); - if (!event_class->attributes) { - goto error; - } - - obj = bt_value_integer_create_init(-1); - if (!obj) { - goto error; - } - - ret = bt_ctf_attributes_set_field_value(event_class->attributes, - "id", obj); - if (ret) { - goto error; - } - - BT_PUT(obj); - - obj = bt_value_string_create_init(name); - if (!obj) { - goto error; - } - - ret = bt_ctf_attributes_set_field_value(event_class->attributes, - "name", obj); - if (ret) { - goto error; - } - - BT_PUT(obj); - - return event_class; - -error: - BT_PUT(event_class); - BT_PUT(obj); - return event_class; -} - -const char *bt_ctf_event_class_get_name(struct bt_ctf_event_class *event_class) -{ - struct bt_value *obj = NULL; - const char *name = NULL; - - if (!event_class) { - goto end; - } - - obj = bt_ctf_attributes_get_field_value(event_class->attributes, - BT_CTF_EVENT_CLASS_ATTR_NAME_INDEX); - if (!obj) { - goto end; - } - - if (bt_value_string_get(obj, &name)) { - name = NULL; - } - -end: - BT_PUT(obj); - return name; -} - -int64_t bt_ctf_event_class_get_id(struct bt_ctf_event_class *event_class) -{ - struct bt_value *obj = NULL; - int64_t ret = 0; - - if (!event_class) { - ret = -1; - goto end; - } - - obj = bt_ctf_attributes_get_field_value(event_class->attributes, - BT_CTF_EVENT_CLASS_ATTR_ID_INDEX); - if (!obj) { - goto end; - } - - if (bt_value_integer_get(obj, &ret)) { - ret = -1; - } - - if (ret < 0) { - /* means ID is not set */ - ret = -1; - goto end; - } - -end: - BT_PUT(obj); - return ret; -} - -int bt_ctf_event_class_set_id(struct bt_ctf_event_class *event_class, - uint32_t id) -{ - int ret = 0; - struct bt_value *obj = NULL; - struct bt_ctf_stream_class *stream_class = NULL; - - - if (!event_class) { - ret = -1; - goto end; - } - - stream_class = bt_ctf_event_class_get_stream_class(event_class); - if (stream_class) { - /* - * We don't allow changing the id if the event class has already - * been added to a stream class. - */ - ret = -1; - goto end; - } - - obj = bt_ctf_attributes_get_field_value(event_class->attributes, - BT_CTF_EVENT_CLASS_ATTR_ID_INDEX); - if (!obj) { - goto end; - } - - if (bt_value_integer_set(obj, id)) { - ret = -1; - goto end; - } - -end: - BT_PUT(obj); - BT_PUT(stream_class); - return ret; -} - -int bt_ctf_event_class_set_attribute( - struct bt_ctf_event_class *event_class, const char *name, - struct bt_value *value) -{ - int ret = 0; - - if (!event_class || !name || !value || event_class->frozen) { - ret = -1; - goto end; - } - - if (!strcmp(name, "id") || !strcmp(name, "loglevel")) { - if (!bt_value_is_integer(value)) { - ret = -1; - goto end; - } - } else if (!strcmp(name, "name") || !strcmp(name, "model.emf.uri")) { - if (!bt_value_is_string(value)) { - ret = -1; - goto end; - } - } else { - /* unknown attribute */ - ret = -1; - goto end; - } - - /* "id" special case: >= 0 */ - if (!strcmp(name, "id")) { - int64_t val; - - ret = bt_value_integer_get(value, &val); - - if (ret) { - goto end; - } - - if (val < 0) { - ret = -1; - goto end; - } - } - - ret = bt_ctf_attributes_set_field_value(event_class->attributes, - name, value); - -end: - return ret; -} - -int bt_ctf_event_class_get_attribute_count( - struct bt_ctf_event_class *event_class) -{ - int ret = 0; - - if (!event_class) { - ret = -1; - goto end; - } - - ret = bt_ctf_attributes_get_count(event_class->attributes); - -end: - return ret; -} - -const char * -bt_ctf_event_class_get_attribute_name( - struct bt_ctf_event_class *event_class, int index) -{ - const char *ret; - - if (!event_class) { - ret = NULL; - goto end; - } - - ret = bt_ctf_attributes_get_field_name(event_class->attributes, index); - -end: - return ret; -} - -struct bt_value * -bt_ctf_event_class_get_attribute_value(struct bt_ctf_event_class *event_class, - int index) -{ - struct bt_value *ret; - - if (!event_class) { - ret = NULL; - goto end; - } - - ret = bt_ctf_attributes_get_field_value(event_class->attributes, index); - -end: - return ret; -} - -struct bt_value * -bt_ctf_event_class_get_attribute_value_by_name( - struct bt_ctf_event_class *event_class, const char *name) -{ - struct bt_value *ret; - - if (!event_class || !name) { - ret = NULL; - goto end; - } - - ret = bt_ctf_attributes_get_field_value_by_name(event_class->attributes, - name); - -end: - return ret; - -} - -struct bt_ctf_stream_class *bt_ctf_event_class_get_stream_class( - struct bt_ctf_event_class *event_class) -{ - return (struct bt_ctf_stream_class *) bt_object_get_parent(event_class); -} - -struct bt_ctf_field_type *bt_ctf_event_class_get_payload_type( - struct bt_ctf_event_class *event_class) -{ - struct bt_ctf_field_type *payload = NULL; - - if (!event_class) { - goto end; - } - - bt_get(event_class->fields); - payload = event_class->fields; -end: - return payload; -} - -int bt_ctf_event_class_set_payload_type(struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *payload) -{ - int ret = 0; - - if (!event_class || !payload || - bt_ctf_field_type_get_type_id(payload) != - BT_CTF_TYPE_ID_STRUCT) { - ret = -1; - goto end; - } - - bt_get(payload); - bt_put(event_class->fields); - event_class->fields = payload; -end: - return ret; -} - -int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *type, - const char *name) -{ - int ret = 0; - - if (!event_class || !type || bt_ctf_validate_identifier(name) || - event_class->frozen) { - ret = -1; - goto end; - } - - if (bt_ctf_field_type_get_type_id(event_class->fields) != - BT_CTF_TYPE_ID_STRUCT) { - ret = -1; - goto end; - } - - ret = bt_ctf_field_type_structure_add_field(event_class->fields, - type, name); -end: - return ret; -} - -int bt_ctf_event_class_get_field_count( - struct bt_ctf_event_class *event_class) -{ - int ret; - - if (!event_class) { - ret = -1; - goto end; - } - - if (bt_ctf_field_type_get_type_id(event_class->fields) != - BT_CTF_TYPE_ID_STRUCT) { - ret = -1; - goto end; - } - - ret = bt_ctf_field_type_structure_get_field_count(event_class->fields); -end: - return ret; -} - -int bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, - const char **field_name, struct bt_ctf_field_type **field_type, - int index) -{ - int ret; - - if (!event_class || index < 0) { - ret = -1; - goto end; - } - - if (bt_ctf_field_type_get_type_id(event_class->fields) != - BT_CTF_TYPE_ID_STRUCT) { - ret = -1; - goto end; - } - - ret = bt_ctf_field_type_structure_get_field(event_class->fields, - field_name, field_type, index); -end: - return ret; -} - -struct bt_ctf_field_type *bt_ctf_event_class_get_field_by_name( - struct bt_ctf_event_class *event_class, const char *name) -{ - GQuark name_quark; - struct bt_ctf_field_type *field_type = NULL; - - if (!event_class || !name) { - goto end; - } - - if (bt_ctf_field_type_get_type_id(event_class->fields) != - BT_CTF_TYPE_ID_STRUCT) { - goto end; - } - - name_quark = g_quark_try_string(name); - if (!name_quark) { - goto end; - } - - /* - * No need to increment field_type's reference count since getting it - * from the structure already does. - */ - field_type = bt_ctf_field_type_structure_get_field_type_by_name( - event_class->fields, name); -end: - return field_type; -} - -struct bt_ctf_field_type *bt_ctf_event_class_get_context_type( - struct bt_ctf_event_class *event_class) -{ - struct bt_ctf_field_type *context_type = NULL; - - if (!event_class || !event_class->context) { - goto end; - } - - bt_get(event_class->context); - context_type = event_class->context; -end: - return context_type; -} - -int bt_ctf_event_class_set_context_type( - struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *context) -{ - int ret = 0; - - if (!event_class || !context || event_class->frozen) { - ret = -1; - goto end; - } - - if (bt_ctf_field_type_get_type_id(context) != BT_CTF_TYPE_ID_STRUCT) { - ret = -1; - goto end; - } - - bt_get(context); - bt_put(event_class->context); - event_class->context = context; -end: - return ret; - -} - -void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class) -{ - bt_get(event_class); -} - -void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class) -{ - bt_put(event_class); -} - -BT_HIDDEN -int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class, - uint32_t stream_id) -{ - int ret = 0; - struct bt_value *obj; - - obj = bt_value_integer_create_init(stream_id); - - if (!obj) { - ret = -1; - goto end; - } - - ret = bt_ctf_attributes_set_field_value(event_class->attributes, - "stream_id", obj); - - if (event_class->frozen) { - bt_ctf_attributes_freeze(event_class->attributes); - } - -end: - BT_PUT(obj); - return ret; -} - struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class) { int ret; @@ -982,19 +495,6 @@ void bt_ctf_event_put(struct bt_ctf_event *event) bt_put(event); } -static -void bt_ctf_event_class_destroy(struct bt_object *obj) -{ - struct bt_ctf_event_class *event_class; - - event_class = container_of(obj, struct bt_ctf_event_class, base); - bt_ctf_attributes_destroy(event_class->attributes); - bt_put(event_class->context); - bt_put(event_class->fields); - g_free(event_class); -} - -static void bt_ctf_event_destroy(struct bt_object *obj) { struct bt_ctf_event *event; @@ -1058,134 +558,6 @@ end: return ret; } -BT_HIDDEN -void bt_ctf_event_class_freeze(struct bt_ctf_event_class *event_class) -{ - assert(event_class); - event_class->frozen = 1; - bt_ctf_field_type_freeze(event_class->context); - bt_ctf_field_type_freeze(event_class->fields); - bt_ctf_attributes_freeze(event_class->attributes); -} - -BT_HIDDEN -int bt_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, - struct metadata_context *context) -{ - int i; - int count; - int ret = 0; - struct bt_value *attr_value = NULL; - - assert(event_class); - assert(context); - - context->current_indentation_level = 1; - g_string_assign(context->field_name, ""); - g_string_append(context->string, "event {\n"); - count = bt_ctf_event_class_get_attribute_count(event_class); - - if (count < 0) { - ret = -1; - goto end; - } - - for (i = 0; i < count; ++i) { - const char *attr_name = NULL; - - attr_name = bt_ctf_event_class_get_attribute_name( - event_class, i); - attr_value = bt_ctf_event_class_get_attribute_value( - event_class, i); - - if (!attr_name || !attr_value) { - ret = -1; - goto end; - } - - switch (bt_value_get_type(attr_value)) { - case BT_VALUE_TYPE_INTEGER: - { - int64_t value; - - ret = bt_value_integer_get(attr_value, &value); - - if (ret) { - goto end; - } - - g_string_append_printf(context->string, - "\t%s = %" PRId64 ";\n", attr_name, value); - break; - } - - case BT_VALUE_TYPE_STRING: - { - const char *value; - - ret = bt_value_string_get(attr_value, &value); - - if (ret) { - goto end; - } - - g_string_append_printf(context->string, - "\t%s = \"%s\";\n", attr_name, value); - break; - } - - default: - /* should never happen */ - assert(false); - break; - } - - BT_PUT(attr_value); - } - - if (event_class->context) { - g_string_append(context->string, "\tcontext := "); - ret = bt_ctf_field_type_serialize(event_class->context, - context); - if (ret) { - goto end; - } - g_string_append(context->string, ";\n"); - } - - if (event_class->fields) { - g_string_append(context->string, "\tfields := "); - ret = bt_ctf_field_type_serialize(event_class->fields, context); - if (ret) { - goto end; - } - g_string_append(context->string, ";\n"); - } - - g_string_append(context->string, "};\n\n"); -end: - context->current_indentation_level = 0; - BT_PUT(attr_value); - return ret; -} - -void bt_ctf_event_class_set_native_byte_order( - struct bt_ctf_event_class *event_class, - int byte_order) -{ - if (!event_class) { - return; - } - - assert(byte_order == 0 || byte_order == LITTLE_ENDIAN || - byte_order == BIG_ENDIAN); - - bt_ctf_field_type_set_native_byte_order(event_class->context, - byte_order); - bt_ctf_field_type_set_native_byte_order(event_class->fields, - byte_order); -} - BT_HIDDEN int bt_ctf_event_validate(struct bt_ctf_event *event) { diff --git a/formats/ctf/ir/stream-class.c b/formats/ctf/ir/stream-class.c index aceb5b77..326e759e 100644 --- a/formats/ctf/ir/stream-class.c +++ b/formats/ctf/ir/stream-class.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index de8055b8..221e84e4 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/formats/ctf/ir/validation.c b/formats/ctf/ir/validation.c index 789a6f57..f3a2c71e 100644 --- a/formats/ctf/ir/validation.c +++ b/formats/ctf/ir/validation.c @@ -28,8 +28,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/include/Makefile.am b/include/Makefile.am index 751128a9..f022571b 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -28,6 +28,7 @@ babeltracectfirinclude_HEADERS = \ babeltrace/ctf-ir/fields.h \ babeltrace/ctf-ir/field-types.h \ babeltrace/ctf-ir/event.h \ + babeltrace/ctf-ir/event-class.h \ babeltrace/ctf-ir/field-path.h \ babeltrace/ctf-ir/stream.h \ babeltrace/ctf-ir/stream-class.h \ @@ -60,6 +61,7 @@ noinst_HEADERS = \ babeltrace/ctf-ir/field-types-internal.h \ babeltrace/ctf-ir/fields-internal.h \ babeltrace/ctf-ir/event-internal.h \ + babeltrace/ctf-ir/event-class-internal.h \ babeltrace/ctf-ir/field-path-internal.h \ babeltrace/ctf-ir/clock-internal.h \ babeltrace/ctf-ir/resolve-internal.h \ diff --git a/include/babeltrace/ctf-ir/event-class-internal.h b/include/babeltrace/ctf-ir/event-class-internal.h new file mode 100644 index 00000000..1c6a9a6c --- /dev/null +++ b/include/babeltrace/ctf-ir/event-class-internal.h @@ -0,0 +1,77 @@ +#ifndef BABELTRACE_CTF_IR_EVENT_CLASS_INTERNAL_H +#define BABELTRACE_CTF_IR_EVENT_CLASS_INTERNAL_H + +/* + * Babeltrace - CTF IR: Event class internal + * + * Copyright 2013, 2014 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * 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 + +#define BT_CTF_EVENT_CLASS_ATTR_ID_INDEX 0 +#define BT_CTF_EVENT_CLASS_ATTR_NAME_INDEX 1 + +struct bt_ctf_event_class { + struct bt_object base; + struct bt_value *attributes; + /* Structure type containing the event's context */ + struct bt_ctf_field_type *context; + /* Structure type containing the event's fields */ + struct bt_ctf_field_type *fields; + int frozen; + + /* + * This flag indicates if the event class is valid. A valid + * event class is _always_ frozen. However, an event class + * may be frozen, but not valid yet. This is okay, as long as + * no events are created out of this event class. + */ + int valid; +}; + +BT_HIDDEN +void bt_ctf_event_class_freeze(struct bt_ctf_event_class *event_class); + +BT_HIDDEN +int bt_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, + struct metadata_context *context); + +BT_HIDDEN +void bt_ctf_event_class_set_native_byte_order( + struct bt_ctf_event_class *event_class, + int byte_order); + +BT_HIDDEN +int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class, + uint32_t stream_id); + +#endif /* BABELTRACE_CTF_IR_EVENT_CLASS_INTERNAL_H */ diff --git a/include/babeltrace/ctf-ir/event-class.h b/include/babeltrace/ctf-ir/event-class.h new file mode 100644 index 00000000..5144b77c --- /dev/null +++ b/include/babeltrace/ctf-ir/event-class.h @@ -0,0 +1,328 @@ +#ifndef BABELTRACE_CTF_IR_EVENT_CLASS_H +#define BABELTRACE_CTF_IR_EVENT_CLASS_H + +/* + * BabelTrace - CTF IR: Event class + * + * Copyright 2013, 2014 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * 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. + * + * The Common Trace Format (CTF) Specification is available at + * http://www.efficios.com/ctf + */ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct bt_ctf_event_class; +struct bt_ctf_field; +struct bt_ctf_field_type; +struct bt_ctf_stream_class; + +/* + * bt_ctf_event_class_create: create an event class. + * + * Allocate a new event class of the given name. The creation of an event class + * sets its reference count to 1. A unique event id is automatically assigned + * to the event class. + * + * @param name Event class name (will be copied). + * + * Returns an allocated event class on success, NULL on error. + */ +extern struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name); + +/* + * bt_ctf_event_class_get_name: Get an event class' name. + * + * @param event_class Event class. + * + * Returns the event class' name, NULL on error. + */ +extern const char *bt_ctf_event_class_get_name( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_get_id: Get an event class' id. + * + * @param event_class Event class. + * + * Returns the event class' id, a negative value on error. + */ +extern int64_t bt_ctf_event_class_get_id( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_set_id: Set an event class' id. + * + * Set an event class' id. Must be unique stream-wise. + * Note that event classes are already assigned a unique id when added to a + * stream class if none was set explicitly. + * + * @param event_class Event class. + * @param id Event class id. + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_event_class_set_id( + struct bt_ctf_event_class *event_class, uint32_t id); + +/* + * bt_ctf_event_class_set_attribute: sets an attribute to the event + * class. + * + * Sets an attribute to the event class. The name parameter is copied, + * whereas the value parameter's reference count is incremented + * (if the function succeeds). + * + * If an attribute exists in the event class for the specified name, it + * is replaced by the new value. + * + * Valid attributes and object types are: + * + * - "id": integer object with a value >= 0 + * - "name": string object + * - "loglevel": integer object with a value >= 0 + * - "model.emf.uri": string object + * + * @param event_class Event class. + * @param name Name of the attribute (will be copied). + * @param value Value of the attribute. + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_event_class_set_attribute( + struct bt_ctf_event_class *event_class, const char *name, + struct bt_value *value); + +/* + * bt_ctf_event_class_get_attribute_count: get the number of attributes + * in this event class. + * + * Get the event class' attribute count. + * + * @param event_class Event class. + * + * Returns the attribute count, a negative value on error. + */ +extern int bt_ctf_event_class_get_attribute_count( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_get_attribute_name: get attribute name. + * + * Get an attribute's name. The string's ownership is not + * transferred to the caller. The string data is valid as long as + * this event class' attributes are not modified. + * + * @param event_class Event class. + * @param index Index of the attribute. + * + * Returns the attribute's name, NULL on error. + */ +extern const char * +bt_ctf_event_class_get_attribute_name( + struct bt_ctf_event_class *event_class, int index); + +/* + * bt_ctf_event_class_get_attribute_value: get attribute value (an object). + * + * Get an attribute's value (an object). The returned object's + * reference count is incremented. When done with the object, the caller + * must call bt_value_put() on it. + * + * @param event_class Event class. + * @param index Index of the attribute. + * + * Returns the attribute's object value, NULL on error. + */ +extern struct bt_value * +bt_ctf_event_class_get_attribute_value(struct bt_ctf_event_class *event_class, + int index); + +/* + * bt_ctf_event_class_get_attribute_value_by_name: get attribute + * value (an object) by name. + * + * Get an attribute's value (an object) by its name. The returned object's + * reference count is incremented. When done with the object, the caller + * must call bt_value_put() on it. + * + * @param event_class Event class. + * @param name Attribute's name + * + * Returns the attribute's object value, NULL on error. + */ +extern struct bt_value * +bt_ctf_event_class_get_attribute_value_by_name( + struct bt_ctf_event_class *event_class, const char *name); + +/* + * bt_ctf_event_class_get_stream_class: Get an event class' stream class. + * + * @param event_class Event class. + * + * Returns the event class' stream class, NULL on error or if the event class + * is not associated with a stream class. + */ +extern struct bt_ctf_stream_class *bt_ctf_event_class_get_stream_class( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_get_payload_type: get an event class' payload. + * + * Get an event class' payload type. + * + * @param event_class Event class. + * + * Returns the event class' payload, NULL on error. + */ +extern struct bt_ctf_field_type *bt_ctf_event_class_get_payload_type( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_set_payload_type: set an event class' payload. + * + * Set an event class' payload type. + * + * @param event_class Event class. + * @param payload The payload's type (must be a structure). + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_event_class_set_payload_type( + struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *payload); + +/* + * bt_ctf_event_class_add_field: add a field to an event class. + * + * Add a field of type "type" to the event class. The event class will share + * type's ownership by increasing its reference count. The "name" will be + * copied. + * + * @param event_class Event class. + * @param type Field type to add to the event class. + * @param name Name of the new field. + * + * Returns 0 on success, a negative value on error. + * + * Note: Returns an error if the payload is not a structure. + */ +extern int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *type, + const char *name); + +/* + * bt_ctf_event_class_get_field_count: Get an event class' field count. + * + * @param event_class Event class. + * + * Returns the event class' field count, a negative value on error. + * + * Note: Returns an error if the payload is not a structure. + */ +extern int bt_ctf_event_class_get_field_count( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_get_field: Get event class' field type and name by index. + * + * @param event_class Event class. + * @param field_name Pointer to a const char* where the field's name will + * be returned. + * @param field_type Pointer to a bt_ctf_field_type* where the field's type will + * be returned. + * @param index Index of field. + * + * Returns 0 on success, a negative error on value. + * + * Note: Returns an error if the payload is not a structure. + */ +extern int bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, + const char **field_name, struct bt_ctf_field_type **field_type, + int index); + +/* + * bt_ctf_event_class_get_field_type_by_name: Get an event class's field by name + * + * @param event_class Event class. + * @param name Name of the field. + * + * Returns a field type on success, NULL on error. + * + * Note: Returns an error if the payload is not a structure. + */ +extern struct bt_ctf_field_type *bt_ctf_event_class_get_field_by_name( + struct bt_ctf_event_class *event_class, const char *name); + +/* + * bt_ctf_event_class_get_context_type: Get an event class's context type + * + * @param event_class Event class. + * + * Returns a field type (a structure) on success, NULL on error. + */ +extern struct bt_ctf_field_type *bt_ctf_event_class_get_context_type( + struct bt_ctf_event_class *event_class); + +/* + * bt_ctf_event_class_set_context_type: Set an event class's context type + * + * @param event_class Event class. + * @param context Event context field type (must be a structure). + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_event_class_set_context_type( + struct bt_ctf_event_class *event_class, + struct bt_ctf_field_type *context); + +/* + * bt_ctf_event_class_get and bt_ctf_event_class_put: increment and decrement + * the event class' reference count. + * + * You may also use bt_ctf_get() and bt_ctf_put() with event class objects. + * + * These functions ensure that the event class won't be destroyed while it + * is in use. The same number of get and put (plus one extra put to + * release the initial reference done at creation) have to be done to + * destroy an event class. + * + * When the event class' reference count is decremented to 0 by a + * bt_ctf_event_class_put, the event class is freed. + * + * @param event_class Event class. + */ +extern void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class); +extern void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class); + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE_CTF_IR_EVENT_CLASS_H */ diff --git a/include/babeltrace/ctf-ir/event-internal.h b/include/babeltrace/ctf-ir/event-internal.h index 43a12ba5..c68316c1 100644 --- a/include/babeltrace/ctf-ir/event-internal.h +++ b/include/babeltrace/ctf-ir/event-internal.h @@ -2,7 +2,7 @@ #define BABELTRACE_CTF_IR_EVENT_INTERNAL_H /* - * BabelTrace - CTF IR: Event internal + * Babeltrace - CTF IR: Event internal * * Copyright 2013, 2014 Jérémie Galarneau * @@ -37,27 +37,6 @@ #include #include -#define BT_CTF_EVENT_CLASS_ATTR_ID_INDEX 0 -#define BT_CTF_EVENT_CLASS_ATTR_NAME_INDEX 1 - -struct bt_ctf_event_class { - struct bt_object base; - struct bt_value *attributes; - /* Structure type containing the event's context */ - struct bt_ctf_field_type *context; - /* Structure type containing the event's fields */ - struct bt_ctf_field_type *fields; - int frozen; - - /* - * This flag indicates if the event class is valid. A valid - * event class is _always_ frozen. However, an event class - * may be frozen, but not valid yet. This is okay, as long as - * no events are created out of this event class. - */ - int valid; -}; - struct bt_ctf_event { struct bt_object base; struct bt_ctf_event_class *event_class; @@ -66,22 +45,6 @@ struct bt_ctf_event { struct bt_ctf_field *fields_payload; }; -BT_HIDDEN -void bt_ctf_event_class_freeze(struct bt_ctf_event_class *event_class); - -BT_HIDDEN -int bt_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, - struct metadata_context *context); - -BT_HIDDEN -void bt_ctf_event_class_set_native_byte_order( - struct bt_ctf_event_class *event_class, - int byte_order); - -BT_HIDDEN -int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class, - uint32_t stream_id); - BT_HIDDEN int bt_ctf_event_validate(struct bt_ctf_event *event); diff --git a/include/babeltrace/ctf-ir/event.h b/include/babeltrace/ctf-ir/event.h index e871902d..4b061d62 100644 --- a/include/babeltrace/ctf-ir/event.h +++ b/include/babeltrace/ctf-ir/event.h @@ -44,284 +44,6 @@ struct bt_ctf_field; struct bt_ctf_field_type; struct bt_ctf_stream_class; -/* - * bt_ctf_event_class_create: create an event class. - * - * Allocate a new event class of the given name. The creation of an event class - * sets its reference count to 1. A unique event id is automatically assigned - * to the event class. - * - * @param name Event class name (will be copied). - * - * Returns an allocated event class on success, NULL on error. - */ -extern struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name); - -/* - * bt_ctf_event_class_get_name: Get an event class' name. - * - * @param event_class Event class. - * - * Returns the event class' name, NULL on error. - */ -extern const char *bt_ctf_event_class_get_name( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_get_id: Get an event class' id. - * - * @param event_class Event class. - * - * Returns the event class' id, a negative value on error. - */ -extern int64_t bt_ctf_event_class_get_id( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_set_id: Set an event class' id. - * - * Set an event class' id. Must be unique stream-wise. - * Note that event classes are already assigned a unique id when added to a - * stream class if none was set explicitly. - * - * @param event_class Event class. - * @param id Event class id. - * - * Returns 0 on success, a negative value on error. - */ -extern int bt_ctf_event_class_set_id( - struct bt_ctf_event_class *event_class, uint32_t id); - -/* - * bt_ctf_event_class_set_attribute: sets an attribute to the event - * class. - * - * Sets an attribute to the event class. The name parameter is copied, - * whereas the value parameter's reference count is incremented - * (if the function succeeds). - * - * If an attribute exists in the event class for the specified name, it - * is replaced by the new value. - * - * Valid attributes and object types are: - * - * - "id": integer object with a value >= 0 - * - "name": string object - * - "loglevel": integer object with a value >= 0 - * - "model.emf.uri": string object - * - * @param event_class Event class. - * @param name Name of the attribute (will be copied). - * @param value Value of the attribute. - * - * Returns 0 on success, a negative value on error. - */ -extern int bt_ctf_event_class_set_attribute( - struct bt_ctf_event_class *event_class, const char *name, - struct bt_value *value); - -/* - * bt_ctf_event_class_get_attribute_count: get the number of attributes - * in this event class. - * - * Get the event class' attribute count. - * - * @param event_class Event class. - * - * Returns the attribute count, a negative value on error. - */ -extern int bt_ctf_event_class_get_attribute_count( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_get_attribute_name: get attribute name. - * - * Get an attribute's name. The string's ownership is not - * transferred to the caller. The string data is valid as long as - * this event class' attributes are not modified. - * - * @param event_class Event class. - * @param index Index of the attribute. - * - * Returns the attribute's name, NULL on error. - */ -extern const char * -bt_ctf_event_class_get_attribute_name( - struct bt_ctf_event_class *event_class, int index); - -/* - * bt_ctf_event_class_get_attribute_value: get attribute value (an object). - * - * Get an attribute's value (an object). The returned object's - * reference count is incremented. When done with the object, the caller - * must call bt_value_put() on it. - * - * @param event_class Event class. - * @param index Index of the attribute. - * - * Returns the attribute's object value, NULL on error. - */ -extern struct bt_value * -bt_ctf_event_class_get_attribute_value(struct bt_ctf_event_class *event_class, - int index); - -/* - * bt_ctf_event_class_get_attribute_value_by_name: get attribute - * value (an object) by name. - * - * Get an attribute's value (an object) by its name. The returned object's - * reference count is incremented. When done with the object, the caller - * must call bt_value_put() on it. - * - * @param event_class Event class. - * @param name Attribute's name - * - * Returns the attribute's object value, NULL on error. - */ -extern struct bt_value * -bt_ctf_event_class_get_attribute_value_by_name( - struct bt_ctf_event_class *event_class, const char *name); - -/* - * bt_ctf_event_class_get_stream_class: Get an event class' stream class. - * - * @param event_class Event class. - * - * Returns the event class' stream class, NULL on error or if the event class - * is not associated with a stream class. - */ -extern struct bt_ctf_stream_class *bt_ctf_event_class_get_stream_class( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_get_payload_type: get an event class' payload. - * - * Get an event class' payload type. - * - * @param event_class Event class. - * - * Returns the event class' payload, NULL on error. - */ -extern struct bt_ctf_field_type *bt_ctf_event_class_get_payload_type( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_set_payload_type: set an event class' payload. - * - * Set an event class' payload type. - * - * @param event_class Event class. - * @param payload The payload's type (must be a structure). - * - * Returns 0 on success, a negative value on error. - */ -extern int bt_ctf_event_class_set_payload_type( - struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *payload); - -/* - * bt_ctf_event_class_add_field: add a field to an event class. - * - * Add a field of type "type" to the event class. The event class will share - * type's ownership by increasing its reference count. The "name" will be - * copied. - * - * @param event_class Event class. - * @param type Field type to add to the event class. - * @param name Name of the new field. - * - * Returns 0 on success, a negative value on error. - * - * Note: Returns an error if the payload is not a structure. - */ -extern int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *type, - const char *name); - -/* - * bt_ctf_event_class_get_field_count: Get an event class' field count. - * - * @param event_class Event class. - * - * Returns the event class' field count, a negative value on error. - * - * Note: Returns an error if the payload is not a structure. - */ -extern int bt_ctf_event_class_get_field_count( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_get_field: Get event class' field type and name by index. - * - * @param event_class Event class. - * @param field_name Pointer to a const char* where the field's name will - * be returned. - * @param field_type Pointer to a bt_ctf_field_type* where the field's type will - * be returned. - * @param index Index of field. - * - * Returns 0 on success, a negative error on value. - * - * Note: Returns an error if the payload is not a structure. - */ -extern int bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, - const char **field_name, struct bt_ctf_field_type **field_type, - int index); - -/* - * bt_ctf_event_class_get_field_type_by_name: Get an event class's field by name - * - * @param event_class Event class. - * @param name Name of the field. - * - * Returns a field type on success, NULL on error. - * - * Note: Returns an error if the payload is not a structure. - */ -extern struct bt_ctf_field_type *bt_ctf_event_class_get_field_by_name( - struct bt_ctf_event_class *event_class, const char *name); - -/* - * bt_ctf_event_class_get_context_type: Get an event class's context type - * - * @param event_class Event class. - * - * Returns a field type (a structure) on success, NULL on error. - */ -extern struct bt_ctf_field_type *bt_ctf_event_class_get_context_type( - struct bt_ctf_event_class *event_class); - -/* - * bt_ctf_event_class_set_context_type: Set an event class's context type - * - * @param event_class Event class. - * @param context Event context field type (must be a structure). - * - * Returns 0 on success, a negative value on error. - */ -extern int bt_ctf_event_class_set_context_type( - struct bt_ctf_event_class *event_class, - struct bt_ctf_field_type *context); - -/* - * bt_ctf_event_class_get and bt_ctf_event_class_put: increment and decrement - * the event class' reference count. - * - * You may also use bt_ctf_get() and bt_ctf_put() with event class objects. - * - * These functions ensure that the event class won't be destroyed while it - * is in use. The same number of get and put (plus one extra put to - * release the initial reference done at creation) have to be done to - * destroy an event class. - * - * When the event class' reference count is decremented to 0 by a - * bt_ctf_event_class_put, the event class is freed. - * - * @param event_class Event class. - */ -extern void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class); -extern void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class); - /* * bt_ctf_event_create: instanciate an event. * diff --git a/include/babeltrace/ctf-writer/event.h b/include/babeltrace/ctf-writer/event.h index 050bceda..fc7ec5d5 100644 --- a/include/babeltrace/ctf-writer/event.h +++ b/include/babeltrace/ctf-writer/event.h @@ -27,4 +27,5 @@ * http://www.efficios.com/ctf */ +#include #include diff --git a/tests/lib/test_bt_ctf_field_type_validation.c b/tests/lib/test_bt_ctf_field_type_validation.c index c626d4ba..a0fadef2 100644 --- a/tests/lib/test_bt_ctf_field_type_validation.c +++ b/tests/lib/test_bt_ctf_field_type_validation.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include diff --git a/tests/lib/test_ctf_ir_ref.c b/tests/lib/test_ctf_ir_ref.c index 01434d4c..eecaad88 100644 --- a/tests/lib/test_ctf_ir_ref.c +++ b/tests/lib/test_ctf_ir_ref.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include -- 2.34.1