goto end;
}
- bt_ctf_field_type_get(field->type);
- copy->type = field->type;
ret = field_copy_funcs[type_id](field, copy);
if (ret) {
bt_ctf_field_put(copy);
struct bt_ctf_field_integer *integer_src, *integer_dst;
integer_src = container_of(src, struct bt_ctf_field_integer, parent);
- integer_dst = container_of(src, struct bt_ctf_field_integer, parent);
+ integer_dst = container_of(dst, struct bt_ctf_field_integer, parent);
memcpy(&integer_dst->definition, &integer_src->definition,
sizeof(struct definition_integer));
int bt_ctf_field_structure_copy(struct bt_ctf_field *src,
struct bt_ctf_field *dst)
{
- int ret, i;
+ int ret = 0, i;
struct bt_ctf_field_structure *struct_src, *struct_dst;
struct_src = container_of(src, struct bt_ctf_field_structure, parent);
struct_dst = container_of(dst, struct bt_ctf_field_structure, parent);
+ /* This field_name_to_index HT is owned by the structure field type */
struct_dst->field_name_to_index = struct_src->field_name_to_index;
- struct_dst->fields = g_ptr_array_sized_new(struct_src->fields->len);
- if (!struct_dst->fields) {
- ret = -1;
- goto end;
- }
+ g_ptr_array_set_size(struct_dst->fields, struct_src->fields->len);
for (i = 0; i < struct_src->fields->len; i++) {
struct bt_ctf_field *field_copy = bt_ctf_field_copy(
ret = -1;
goto end;
}
- g_ptr_array_add(struct_dst->fields, field_copy);
+ g_ptr_array_index(struct_dst->fields, i) = field_copy;
}
end:
return ret;
array_src = container_of(src, struct bt_ctf_field_array, parent);
array_dst = container_of(dst, struct bt_ctf_field_array, parent);
- array_dst->elements = g_ptr_array_sized_new(array_src->elements->len);
+ g_ptr_array_set_size(array_dst->elements, array_src->elements->len);
for (i = 0; i < array_src->elements->len; i++) {
struct bt_ctf_field *field_copy = bt_ctf_field_copy(
g_ptr_array_index(array_src->elements, i));
ret = -1;
goto end;
}
- g_ptr_array_add(array_dst->elements, field_copy);
+ g_ptr_array_index(array_dst->elements, i) = field_copy;
}
end:
return ret;
sequence_src = container_of(src, struct bt_ctf_field_sequence, parent);
sequence_dst = container_of(dst, struct bt_ctf_field_sequence, parent);
- sequence_dst->elements = g_ptr_array_sized_new(
+ g_ptr_array_set_size(sequence_dst->elements,
sequence_src->elements->len);
for (i = 0; i < sequence_src->elements->len; i++) {
struct bt_ctf_field *field_copy = bt_ctf_field_copy(
ret = -1;
goto end;
}
- g_ptr_array_add(sequence_dst->elements, field_copy);
+ g_ptr_array_index(sequence_dst->elements, i) = field_copy;
}
end:
return ret;
bt_ctf_stream_class_get(stream_class);
bt_ctf_stream_class_freeze(stream_class);
stream->events = g_ptr_array_new_with_free_func(
- (GDestroyNotify)bt_ctf_event_put);
+ (GDestroyNotify) bt_ctf_event_put);
+ if (!stream->events) {
+ goto error_destroy;
+ }
+ if (stream_class->event_context_type) {
+ stream->event_contexts = g_ptr_array_new_with_free_func(
+ (GDestroyNotify) bt_ctf_field_put);
+ if (!stream->event_contexts) {
+ goto error_destroy;
+ }
+ }
end:
return stream;
error_destroy:
goto end;
}
+ /* Sample the current stream event context by copying it */
+ if (stream->event_context) {
+ /* Make sure the event context's payload is set */
+ ret = bt_ctf_field_validate(stream->event_context);
+ if (ret) {
+ goto end;
+ }
+
+ event_context_copy = bt_ctf_field_copy(stream->event_context);
+ if (!event_context_copy) {
+ ret = -1;
+ goto end;
+ }
+ }
+
timestamp = bt_ctf_clock_get_time(stream->stream_class->clock);
ret = bt_ctf_event_set_timestamp(event, timestamp);
if (ret) {
}
bt_ctf_event_get(event);
+ /* Save the new event along with its associated stream event context */
g_ptr_array_add(stream->events, event);
+ if (event_context_copy) {
+ g_ptr_array_add(stream->event_contexts, event_context_copy);
+ }
end:
return ret;
}
return ret;
}
+struct bt_ctf_field *bt_ctf_stream_get_event_context(
+ struct bt_ctf_stream *stream)
+{
+ struct bt_ctf_field *event_context = NULL;
+
+ if (!stream) {
+ goto end;
+ }
+
+ event_context = stream->event_context;
+ if (event_context) {
+ bt_ctf_field_get(event_context);
+ }
+end:
+ return event_context;
+}
+
+int bt_ctf_stream_set_event_context(struct bt_ctf_stream *stream,
+ struct bt_ctf_field *field)
+{
+ int ret = 0;
+ struct bt_ctf_field_type *field_type = NULL;
+
+ if (!stream || !field) {
+ ret = -1;
+ goto end;
+ }
+
+ field_type = bt_ctf_field_get_type(field);
+ if (field_type != stream->stream_class->event_context_type) {
+ ret = -1;
+ goto end;
+ }
+
+ bt_ctf_field_get(field);
+ bt_ctf_field_put(stream->event_context);
+ stream->event_context = field;
+end:
+ if (field_type) {
+ bt_ctf_field_type_put(field_type);
+ }
+ return ret;
+}
+
int bt_ctf_stream_flush(struct bt_ctf_stream *stream)
{
int ret = 0;
goto end;
}
+ /* Write stream event context */
+ if (stream->event_contexts) {
+ ret = bt_ctf_field_serialize(
+ g_ptr_array_index(stream->event_contexts, i),
+ &stream->pos);
+ if (ret) {
+ goto end;
+ }
+ }
+
/* Write event content */
ret = bt_ctf_event_serialize(event, &stream->pos);
if (ret) {
}
g_ptr_array_set_size(stream->events, 0);
+ if (stream->event_contexts) {
+ g_ptr_array_set_size(stream->event_contexts, 0);
+ }
stream->flushed_packet_count++;
end:
bt_ctf_field_put(integer);
if (stream->events) {
g_ptr_array_free(stream->events, TRUE);
}
+ if (stream->event_contexts) {
+ g_ptr_array_free(stream->event_contexts, TRUE);
+ }
if (stream->packet_context) {
bt_ctf_field_put(stream->packet_context);
}
+ if (stream->event_context) {
+ bt_ctf_field_put(stream->event_context);
+ }
g_free(stream);
}
struct flush_callback flush;
/* Array of pointers to bt_ctf_event for the current packet */
GPtrArray *events;
+ /* Array of pointers to bt_ctf_field associated with each event*/
+ GPtrArray *event_contexts;
struct ctf_stream_pos pos;
unsigned int flushed_packet_count;
struct bt_ctf_field *packet_context;