X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fir%2Ftrace.c;h=5abfcc79c7ef197db758c781e6c4180a28b28776;hb=29664b2a3a15c7233d916887d2f58fc42e18521e;hp=4d27b833be4c0c0ca93330eb6e500ec5fc961194;hpb=f67f3a6e48bc72149e6a9b370da39abddc2c57a6;p=babeltrace.git diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 4d27b833..5abfcc79 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -187,7 +187,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 +199,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 +237,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 +260,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 +283,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 +307,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); @@ -405,8 +462,7 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, } } - if (_bt_ctf_stream_class_set_id(stream_class, - stream_id)) { + if (bt_ctf_stream_class_set_id_no_check(stream_class, stream_id)) { /* TODO Should retry with a different stream id */ ret = -1; goto end;