X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fir%2Ftrace.c;h=d5786d337251dff7c0e2f660ee5a5e7edad89ad2;hb=de3dd40e6fcad56e227f5fc8a8290fbaa88b4e07;hp=4d27b833be4c0c0ca93330eb6e500ec5fc961194;hpb=f67f3a6e48bc72149e6a9b370da39abddc2c57a6;p=babeltrace.git diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 4d27b833..d5786d33 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -33,7 +33,10 @@ #include #include #include +#include #include +#include +#include #include #include @@ -41,11 +44,11 @@ #define DEFAULT_METADATA_STRING_SIZE 4096 static -void bt_ctf_trace_destroy(struct bt_ctf_ref *ref); +void bt_ctf_trace_destroy(struct bt_ref *ref); static int init_trace_packet_header(struct bt_ctf_trace *trace); static -void bt_ctf_trace_freeze(struct bt_ctf_trace *trace); +int bt_ctf_trace_freeze(struct bt_ctf_trace *trace); static const unsigned int field_type_aliases_alignments[] = { @@ -82,7 +85,7 @@ struct bt_ctf_trace *bt_ctf_trace_create(void) } bt_ctf_trace_set_byte_order(trace, BT_CTF_BYTE_ORDER_NATIVE); - bt_ctf_ref_init(&trace->ref_count); + bt_ctf_base_init(trace, bt_ctf_trace_destroy); trace->clocks = g_ptr_array_new_with_free_func( (GDestroyNotify) bt_ctf_clock_put); trace->streams = g_ptr_array_new_with_free_func( @@ -108,21 +111,23 @@ struct bt_ctf_trace *bt_ctf_trace_create(void) return trace; error_destroy: - bt_ctf_trace_destroy(&trace->ref_count); + bt_ctf_trace_destroy(&trace->base.ref_count); trace = NULL; error: return trace; } -void bt_ctf_trace_destroy(struct bt_ctf_ref *ref) +void bt_ctf_trace_destroy(struct bt_ref *ref) { struct bt_ctf_trace *trace; + struct bt_ctf_base *base; if (!ref) { return; } - trace = container_of(ref, struct bt_ctf_trace, ref_count); + base = container_of(ref, struct bt_ctf_base, ref_count); + trace = container_of(base, struct bt_ctf_trace, base); if (trace->environment) { bt_ctf_attributes_destroy(trace->environment); } @@ -155,11 +160,6 @@ struct bt_ctf_stream *bt_ctf_trace_create_stream(struct bt_ctf_trace *trace, goto error; } - stream = bt_ctf_stream_create(stream_class, trace); - if (!stream) { - goto error; - } - for (i = 0; i < trace->stream_classes->len; i++) { if (trace->stream_classes->pdata[i] == stream_class) { stream_class_found = 1; @@ -173,6 +173,11 @@ struct bt_ctf_stream *bt_ctf_trace_create_stream(struct bt_ctf_trace *trace, } } + stream = bt_ctf_stream_create(stream_class, trace); + if (!stream) { + goto error; + } + bt_ctf_stream_get(stream); g_ptr_array_add(trace->streams, stream); @@ -187,7 +192,7 @@ int bt_ctf_trace_set_environment_field(struct bt_ctf_trace *trace, { int ret = 0; - if (!trace || trace->frozen || !name || !value || + if (!trace || !name || !value || bt_ctf_validate_identifier(name) || !(bt_object_is_integer(value) || bt_object_is_string(value))) { ret = -1; @@ -199,6 +204,26 @@ int bt_ctf_trace_set_environment_field(struct bt_ctf_trace *trace, goto end; } + if (trace->frozen) { + /* + * New environment fields may be added to a frozen trace, + * but existing fields may not be changed. + * + * The object passed is frozen like all other attributes. + */ + struct bt_object *attribute = + bt_ctf_attributes_get_field_value_by_name( + trace->environment, name); + + if (attribute) { + BT_OBJECT_PUT(attribute); + ret = -1; + goto end; + } + + bt_object_freeze(value); + } + ret = bt_ctf_attributes_set_field_value(trace->environment, name, value); @@ -217,6 +242,22 @@ int bt_ctf_trace_set_environment_field_string(struct bt_ctf_trace *trace, goto end; } + if (trace->frozen) { + /* + * New environment fields may be added to a frozen trace, + * but existing fields may not be changed. + */ + struct bt_object *attribute = + bt_ctf_attributes_get_field_value_by_name( + trace->environment, name); + + if (attribute) { + BT_OBJECT_PUT(attribute); + ret = -1; + goto end; + } + } + env_value_string_obj = bt_object_string_create_init(value); if (!env_value_string_obj) { @@ -224,6 +265,9 @@ int bt_ctf_trace_set_environment_field_string(struct bt_ctf_trace *trace, goto end; } + if (trace->frozen) { + bt_object_freeze(env_value_string_obj); + } ret = bt_ctf_trace_set_environment_field(trace, name, env_value_string_obj); @@ -244,6 +288,22 @@ int bt_ctf_trace_set_environment_field_integer(struct bt_ctf_trace *trace, goto end; } + if (trace->frozen) { + /* + * New environment fields may be added to a frozen trace, + * but existing fields may not be changed. + */ + struct bt_object *attribute = + bt_ctf_attributes_get_field_value_by_name( + trace->environment, name); + + if (attribute) { + BT_OBJECT_PUT(attribute); + ret = -1; + goto end; + } + } + env_value_integer_obj = bt_object_integer_create_init(value); if (!env_value_integer_obj) { ret = -1; @@ -252,7 +312,9 @@ int bt_ctf_trace_set_environment_field_integer(struct bt_ctf_trace *trace, ret = bt_ctf_trace_set_environment_field(trace, name, env_value_integer_obj); - + if (trace->frozen) { + bt_object_freeze(env_value_integer_obj); + } end: BT_OBJECT_PUT(env_value_integer_obj); @@ -386,11 +448,17 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, for (i = 0; i < trace->stream_classes->len; i++) { if (trace->stream_classes->pdata[i] == stream_class) { + /* Stream already registered to the trace */ ret = -1; goto end; } } + ret = bt_ctf_stream_class_resolve_types(stream_class, trace); + if (ret) { + goto end; + } + stream_id = bt_ctf_stream_class_get_id(stream_class); if (stream_id < 0) { stream_id = trace->next_stream_id++; @@ -405,7 +473,7 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, } } - if (_bt_ctf_stream_class_set_id(stream_class, + if (bt_ctf_stream_class_set_id_no_check(stream_class, stream_id)) { /* TODO Should retry with a different stream id */ ret = -1; @@ -439,7 +507,10 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, } bt_ctf_stream_class_freeze(stream_class); - bt_ctf_trace_freeze(trace); + if (!trace->frozen) { + ret = bt_ctf_trace_freeze(trace); + goto end; + } end: if (ret) { (void) bt_ctf_stream_class_set_trace(stream_class, NULL); @@ -792,44 +863,47 @@ end: void bt_ctf_trace_get(struct bt_ctf_trace *trace) { - if (!trace) { - return; - } - - bt_ctf_ref_get(&trace->ref_count); + bt_ctf_get(trace); } void bt_ctf_trace_put(struct bt_ctf_trace *trace) { - if (!trace) { - return; - } + bt_ctf_put(trace); - bt_ctf_ref_put(&trace->ref_count, bt_ctf_trace_destroy); } BT_HIDDEN struct bt_ctf_field_type *get_field_type(enum field_type_alias alias) { unsigned int alignment, size; - struct bt_ctf_field_type *field_type; + struct bt_ctf_field_type *field_type = NULL; if (alias >= NR_FIELD_TYPE_ALIAS) { - return NULL; + goto end; } 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); +end: return field_type; } static -void bt_ctf_trace_freeze(struct bt_ctf_trace *trace) +int bt_ctf_trace_freeze(struct bt_ctf_trace *trace) { + int ret = 0; + + ret = bt_ctf_trace_resolve_types(trace); + if (ret) { + goto end; + } + bt_ctf_attributes_freeze(trace->environment); trace->frozen = 1; +end: + return ret; } static