lib: remove some unnecessary uses of `GString`
[babeltrace.git] / src / lib / trace-ir / trace.c
CommitLineData
bc37ae52 1/*
0235b0db
MJ
2 * SPDX-License-Identifier: MIT
3 *
e2f7325d 4 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
bc37ae52 5 * Copyright 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
bc37ae52
JG
6 */
7
350ad6c1 8#define BT_LOG_TAG "LIB/TRACE"
c2d9d9cf 9#include "lib/logging.h"
e011d2c1 10
d98421f2 11#include "lib/assert-cond.h"
3fadfbc0 12#include <babeltrace2/trace-ir/trace.h>
3fadfbc0 13#include <babeltrace2/trace-ir/event-class.h>
578e048b 14#include "compat/compiler.h"
3fadfbc0 15#include <babeltrace2/value.h>
578e048b 16#include "lib/value.h"
3fadfbc0 17#include <babeltrace2/types.h>
578e048b
MJ
18#include "compat/endian.h"
19#include "common/assert.h"
20#include "compat/glib.h"
dc3fffef 21#include <inttypes.h>
544d0515 22#include <stdint.h>
4a32fda0 23#include <string.h>
c4f23e30 24#include <stdbool.h>
0fbb9a9f 25#include <stdlib.h>
bc37ae52 26
578e048b 27#include "attributes.h"
578e048b
MJ
28#include "stream-class.h"
29#include "stream.h"
30#include "trace-class.h"
31#include "trace.h"
c6962c96 32#include "lib/value.h"
d24d5663 33#include "lib/func-status.h"
578e048b 34
ad5268b5
FD
35struct bt_trace_destruction_listener_elem {
36 bt_trace_destruction_listener_func func;
3602afb0
PP
37 void *data;
38};
39
1778c2a4
PP
40#define BT_ASSERT_PRE_DEV_TRACE_HOT(_trace) \
41 BT_ASSERT_PRE_DEV_HOT("trace", (_trace), "Trace", ": %!+t", (_trace))
42
43#define DESTRUCTION_LISTENER_FUNC_NAME \
44 "bt_trace_class_destruction_listener_func"
cb6f1f7d 45
bc37ae52 46static
44c440bc 47void destroy_trace(struct bt_object *obj)
3dca2276
PP
48{
49 struct bt_trace *trace = (void *) obj;
bc37ae52 50
44c440bc 51 BT_LIB_LOGD("Destroying trace object: %!+t", trace);
c6962c96 52 BT_OBJECT_PUT_REF_AND_RESET(trace->user_attributes);
bc37ae52 53
3dca2276 54 /*
ad5268b5
FD
55 * Call destruction listener functions so that everything else
56 * still exists in the trace.
3dca2276 57 */
ad5268b5
FD
58 if (trace->destruction_listeners) {
59 uint64_t i;
42a63165
SM
60 const struct bt_error *saved_error;
61
3f7d4d90 62 BT_LIB_LOGD("Calling trace destruction listener(s): %!+t", trace);
c47a6bec
SM
63
64 /*
65 * The trace's reference count is 0 if we're here. Increment
66 * it to avoid a double-destroy (possibly infinitely recursive).
67 * This could happen for example if a destruction listener did
68 * bt_object_get_ref() (or anything that causes
69 * bt_object_get_ref() to be called) on the trace (ref.
70 * count goes from 0 to 1), and then bt_object_put_ref(): the
71 * reference count would go from 1 to 0 again and this function
72 * would be called again.
73 */
74 trace->base.ref_count++;
75
42a63165
SM
76 saved_error = bt_current_thread_take_error();
77
ad5268b5
FD
78 /* Call all the trace destruction listeners */
79 for (i = 0; i < trace->destruction_listeners->len; i++) {
80 struct bt_trace_destruction_listener_elem elem =
d50d46f3 81 bt_g_array_index(trace->destruction_listeners,
1778c2a4 82 struct bt_trace_destruction_listener_elem, i);
ad5268b5
FD
83
84 if (elem.func) {
85 elem.func(trace, elem.data);
1778c2a4
PP
86 BT_ASSERT_POST_NO_ERROR(
87 DESTRUCTION_LISTENER_FUNC_NAME);
3dca2276 88 }
c47a6bec
SM
89
90 /*
91 * The destruction listener should not have kept a
92 * reference to the trace.
93 */
1778c2a4
PP
94 BT_ASSERT_POST(DESTRUCTION_LISTENER_FUNC_NAME,
95 "trace-reference-count-not-changed",
96 trace->base.ref_count == 1,
97 "Destruction listener kept a reference to the trace being destroyed: %![trace-]+t",
98 trace);
3dca2276 99 }
ad5268b5
FD
100 g_array_free(trace->destruction_listeners, TRUE);
101 trace->destruction_listeners = NULL;
42a63165
SM
102
103 if (saved_error) {
104 BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(saved_error);
105 }
bc37ae52
JG
106 }
107
b91e0631 108 g_free(trace->name);
95c09b3a 109
335a2da5
PP
110 if (trace->environment) {
111 BT_LOGD_STR("Destroying environment attributes.");
112 bt_attributes_destroy(trace->environment);
113 trace->environment = NULL;
114 }
115
44c440bc
PP
116 if (trace->streams) {
117 BT_LOGD_STR("Destroying streams.");
118 g_ptr_array_free(trace->streams, TRUE);
238b7404 119 trace->streams = NULL;
bc37ae52
JG
120 }
121
44c440bc
PP
122 if (trace->stream_classes_stream_count) {
123 g_hash_table_destroy(trace->stream_classes_stream_count);
238b7404 124 trace->stream_classes_stream_count = NULL;
44c440bc 125 }
3dca2276 126
862ca4ed
PP
127 BT_LOGD_STR("Putting trace's class.");
128 bt_object_put_ref(trace->class);
129 trace->class = NULL;
44c440bc 130 g_free(trace);
3dca2276
PP
131}
132
1353b066 133BT_EXPORT
862ca4ed 134struct bt_trace *bt_trace_create(struct bt_trace_class *tc)
3dca2276
PP
135{
136 struct bt_trace *trace = NULL;
3dca2276 137
17f3083a
SM
138 BT_ASSERT_PRE_NO_ERROR();
139
862ca4ed 140 BT_LIB_LOGD("Creating trace object: %![tc-]+T", tc);
3dca2276
PP
141 trace = g_new0(struct bt_trace, 1);
142 if (!trace) {
870631a2 143 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one trace.");
3dca2276
PP
144 goto error;
145 }
146
862ca4ed 147 bt_object_init_shared(&trace->base, destroy_trace);
c6962c96
PP
148 trace->user_attributes = bt_value_map_create();
149 if (!trace->user_attributes) {
150 BT_LIB_LOGE_APPEND_CAUSE(
151 "Failed to create a map value object.");
152 goto error;
153 }
154
44c440bc
PP
155 trace->streams = g_ptr_array_new_with_free_func(
156 (GDestroyNotify) bt_object_try_spec_release);
157 if (!trace->streams) {
870631a2 158 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray.");
3dca2276
PP
159 goto error;
160 }
161
44c440bc
PP
162 trace->stream_classes_stream_count = g_hash_table_new(g_direct_hash,
163 g_direct_equal);
164 if (!trace->stream_classes_stream_count) {
870631a2 165 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GHashTable.");
44c440bc
PP
166 goto error;
167 }
168
335a2da5
PP
169 trace->environment = bt_attributes_create();
170 if (!trace->environment) {
171 BT_LIB_LOGE_APPEND_CAUSE("Cannot create empty attributes object.");
172 goto error;
173 }
174
ad5268b5
FD
175 trace->destruction_listeners = g_array_new(FALSE, TRUE,
176 sizeof(struct bt_trace_destruction_listener_elem));
177 if (!trace->destruction_listeners) {
870631a2 178 BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GArray.");
3602afb0
PP
179 goto error;
180 }
181
862ca4ed 182 trace->class = tc;
6871026b 183 bt_object_get_ref_no_null_check(trace->class);
44c440bc
PP
184 BT_LIB_LOGD("Created trace object: %!+t", trace);
185 goto end;
bc37ae52 186
bc37ae52 187error:
65300d60 188 BT_OBJECT_PUT_REF_AND_RESET(trace);
44c440bc
PP
189
190end:
862ca4ed 191 return trace;
bc37ae52
JG
192}
193
1353b066 194BT_EXPORT
40f4ba76 195const char *bt_trace_get_name(const struct bt_trace *trace)
e96045d4 196{
d5b13b9b 197 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
b91e0631 198 return trace->name;
e96045d4
JG
199}
200
1353b066 201BT_EXPORT
d24d5663
PP
202enum bt_trace_set_name_status bt_trace_set_name(struct bt_trace *trace,
203 const char *name)
e96045d4 204{
17f3083a 205 BT_ASSERT_PRE_NO_ERROR();
d5b13b9b
PP
206 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
207 BT_ASSERT_PRE_NAME_NON_NULL(name);
bdb288b3 208 BT_ASSERT_PRE_DEV_TRACE_HOT(trace);
b91e0631
SM
209 g_free(trace->name);
210 trace->name = g_strdup(name);
3f7d4d90 211 BT_LIB_LOGD("Set trace's name: %!+t", trace);
d24d5663 212 return BT_FUNC_STATUS_OK;
e96045d4
JG
213}
214
1353b066 215BT_EXPORT
335a2da5
PP
216bt_uuid bt_trace_get_uuid(const struct bt_trace *trace)
217{
d5b13b9b 218 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
335a2da5
PP
219 return trace->uuid.value;
220}
221
1353b066 222BT_EXPORT
335a2da5
PP
223void bt_trace_set_uuid(struct bt_trace *trace, bt_uuid uuid)
224{
d5b13b9b
PP
225 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
226 BT_ASSERT_PRE_UUID_NON_NULL(uuid);
bdb288b3 227 BT_ASSERT_PRE_DEV_TRACE_HOT(trace);
6162e6b7 228 bt_uuid_copy(trace->uuid.uuid, uuid);
335a2da5
PP
229 trace->uuid.value = trace->uuid.uuid;
230 BT_LIB_LOGD("Set trace's UUID: %!+t", trace);
231}
232
335a2da5
PP
233static
234bool trace_has_environment_entry(const struct bt_trace *trace, const char *name)
235{
236 BT_ASSERT(trace);
237
238 return bt_attributes_borrow_field_value_by_name(
5084732e 239 trace->environment, name);
335a2da5
PP
240}
241
242static
243enum bt_trace_set_environment_entry_status set_environment_entry(
244 struct bt_trace *trace,
245 const char *name, struct bt_value *value)
246{
247 int ret;
248
249 BT_ASSERT(trace);
250 BT_ASSERT(name);
251 BT_ASSERT(value);
1778c2a4
PP
252 BT_ASSERT_PRE("not-frozen:trace",
253 !trace->frozen ||
254 !trace_has_environment_entry(trace, name),
335a2da5
PP
255 "Trace is frozen: cannot replace environment entry: "
256 "%![trace-]+t, entry-name=\"%s\"", trace, name);
257 ret = bt_attributes_set_field_value(trace->environment, name,
258 value);
259 if (ret) {
260 ret = BT_FUNC_STATUS_MEMORY_ERROR;
261 BT_LIB_LOGE_APPEND_CAUSE(
262 "Cannot set trace's environment entry: "
263 "%![trace-]+t, entry-name=\"%s\"", trace, name);
264 } else {
265 bt_value_freeze(value);
266 BT_LIB_LOGD("Set trace's environment entry: "
267 "%![trace-]+t, entry-name=\"%s\"", trace, name);
268 }
269
270 return ret;
271}
272
1353b066 273BT_EXPORT
335a2da5
PP
274enum bt_trace_set_environment_entry_status
275bt_trace_set_environment_entry_string(
276 struct bt_trace *trace, const char *name, const char *value)
277{
278 int ret;
279 struct bt_value *value_obj;
17f3083a
SM
280
281 BT_ASSERT_PRE_NO_ERROR();
d5b13b9b
PP
282 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
283 BT_ASSERT_PRE_NAME_NON_NULL(name);
1778c2a4 284 BT_ASSERT_PRE_NON_NULL("value", value, "Value");
17f3083a 285
335a2da5
PP
286 value_obj = bt_value_string_create_init(value);
287 if (!value_obj) {
288 BT_LIB_LOGE_APPEND_CAUSE(
289 "Cannot create a string value object.");
290 ret = -1;
291 goto end;
292 }
293
294 /* set_environment_entry() logs errors */
295 ret = set_environment_entry(trace, name, value_obj);
296
297end:
298 bt_object_put_ref(value_obj);
299 return ret;
300}
301
1353b066 302BT_EXPORT
335a2da5
PP
303enum bt_trace_set_environment_entry_status
304bt_trace_set_environment_entry_integer(
305 struct bt_trace *trace, const char *name, int64_t value)
306{
307 int ret;
308 struct bt_value *value_obj;
17f3083a
SM
309
310 BT_ASSERT_PRE_NO_ERROR();
d5b13b9b
PP
311 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
312 BT_ASSERT_PRE_NAME_NON_NULL(name);
17f3083a 313
9c08c816 314 value_obj = bt_value_integer_signed_create_init(value);
335a2da5
PP
315 if (!value_obj) {
316 BT_LIB_LOGE_APPEND_CAUSE(
317 "Cannot create an integer value object.");
318 ret = BT_FUNC_STATUS_MEMORY_ERROR;
319 goto end;
320 }
321
322 /* set_environment_entry() logs errors */
323 ret = set_environment_entry(trace, name, value_obj);
324
325end:
326 bt_object_put_ref(value_obj);
327 return ret;
328}
329
1353b066 330BT_EXPORT
335a2da5
PP
331uint64_t bt_trace_get_environment_entry_count(const struct bt_trace *trace)
332{
d5b13b9b 333 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
99b4b64b 334 return bt_attributes_get_count(trace->environment);
335a2da5
PP
335}
336
1353b066 337BT_EXPORT
335a2da5
PP
338void bt_trace_borrow_environment_entry_by_index_const(
339 const struct bt_trace *trace, uint64_t index,
340 const char **name, const struct bt_value **value)
341{
d5b13b9b
PP
342 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
343 BT_ASSERT_PRE_DEV_NAME_NON_NULL(name);
1778c2a4
PP
344 BT_ASSERT_PRE_DEV_NON_NULL("value-object-output", value,
345 "Value object (output)");
bdb288b3 346 BT_ASSERT_PRE_DEV_VALID_INDEX(index,
335a2da5
PP
347 bt_attributes_get_count(trace->environment));
348 *value = bt_attributes_borrow_field_value(trace->environment, index);
349 BT_ASSERT(*value);
350 *name = bt_attributes_get_field_name(trace->environment, index);
351 BT_ASSERT(*name);
352}
353
1353b066 354BT_EXPORT
335a2da5
PP
355const struct bt_value *bt_trace_borrow_environment_entry_value_by_name_const(
356 const struct bt_trace *trace, const char *name)
357{
d5b13b9b
PP
358 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
359 BT_ASSERT_PRE_DEV_NAME_NON_NULL(name);
335a2da5
PP
360 return bt_attributes_borrow_field_value_by_name(trace->environment,
361 name);
362}
363
1353b066 364BT_EXPORT
40f4ba76 365uint64_t bt_trace_get_stream_count(const struct bt_trace *trace)
bc37ae52 366{
d5b13b9b 367 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
44c440bc
PP
368 return (uint64_t) trace->streams->len;
369}
95c09b3a 370
1353b066 371BT_EXPORT
44c440bc
PP
372struct bt_stream *bt_trace_borrow_stream_by_index(
373 struct bt_trace *trace, uint64_t index)
374{
d5b13b9b 375 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
bdb288b3 376 BT_ASSERT_PRE_DEV_VALID_INDEX(index, trace->streams->len);
44c440bc
PP
377 return g_ptr_array_index(trace->streams, index);
378}
cb6f1f7d 379
1353b066 380BT_EXPORT
40f4ba76
PP
381const struct bt_stream *bt_trace_borrow_stream_by_index_const(
382 const struct bt_trace *trace, uint64_t index)
e5be10ef 383{
40f4ba76 384 return bt_trace_borrow_stream_by_index((void *) trace, index);
e5be10ef
PP
385}
386
1353b066 387BT_EXPORT
40f4ba76
PP
388struct bt_stream *bt_trace_borrow_stream_by_id(struct bt_trace *trace,
389 uint64_t id)
44c440bc
PP
390{
391 struct bt_stream *stream = NULL;
392 uint64_t i;
bc37ae52 393
d5b13b9b 394 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
bc37ae52 395
44c440bc
PP
396 for (i = 0; i < trace->streams->len; i++) {
397 struct bt_stream *stream_candidate =
398 g_ptr_array_index(trace->streams, i);
cfeb617e 399
44c440bc
PP
400 if (stream_candidate->id == id) {
401 stream = stream_candidate;
402 goto end;
403 }
6474e016 404 }
95c09b3a 405
bc37ae52 406end:
44c440bc 407 return stream;
bc37ae52
JG
408}
409
1353b066 410BT_EXPORT
40f4ba76
PP
411const struct bt_stream *bt_trace_borrow_stream_by_id_const(
412 const struct bt_trace *trace, uint64_t id)
e5be10ef 413{
40f4ba76 414 return bt_trace_borrow_stream_by_id((void *) trace, id);
e5be10ef
PP
415}
416
1353b066 417BT_EXPORT
d24d5663 418enum bt_trace_add_listener_status bt_trace_add_destruction_listener(
40f4ba76 419 const struct bt_trace *c_trace,
ad5268b5 420 bt_trace_destruction_listener_func listener,
2054a0d1 421 void *data, bt_listener_id *listener_id)
3602afb0 422{
40f4ba76 423 struct bt_trace *trace = (void *) c_trace;
44c440bc 424 uint64_t i;
ad5268b5 425 struct bt_trace_destruction_listener_elem new_elem = {
3602afb0
PP
426 .func = listener,
427 .data = data,
428 };
429
17f3083a 430 BT_ASSERT_PRE_NO_ERROR();
d5b13b9b
PP
431 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
432 BT_ASSERT_PRE_LISTENER_FUNC_NON_NULL(listener);
8480c8cc 433
3602afb0 434 /* Find the next available spot */
ad5268b5
FD
435 for (i = 0; i < trace->destruction_listeners->len; i++) {
436 struct bt_trace_destruction_listener_elem elem =
d50d46f3 437 bt_g_array_index(trace->destruction_listeners,
ad5268b5 438 struct bt_trace_destruction_listener_elem, i);
3602afb0
PP
439
440 if (!elem.func) {
441 break;
442 }
443 }
444
ad5268b5
FD
445 if (i == trace->destruction_listeners->len) {
446 g_array_append_val(trace->destruction_listeners, new_elem);
3602afb0 447 } else {
ad5268b5 448 g_array_insert_val(trace->destruction_listeners, i, new_elem);
3602afb0
PP
449 }
450
44c440bc
PP
451 if (listener_id) {
452 *listener_id = i;
453 }
3602afb0 454
3f7d4d90 455 BT_LIB_LOGD("Added destruction listener: " "%![trace-]+t, "
ad5268b5 456 "listener-id=%" PRIu64, trace, i);
d24d5663 457 return BT_FUNC_STATUS_OK;
44c440bc
PP
458}
459
44c440bc 460static
40f4ba76 461bool has_listener_id(const struct bt_trace *trace, uint64_t listener_id)
44c440bc 462{
ad5268b5 463 BT_ASSERT(listener_id < trace->destruction_listeners->len);
d50d46f3 464 return (&bt_g_array_index(trace->destruction_listeners,
ad5268b5 465 struct bt_trace_destruction_listener_elem,
5084732e 466 listener_id))->func;
3602afb0
PP
467}
468
1353b066 469BT_EXPORT
d24d5663 470enum bt_trace_remove_listener_status bt_trace_remove_destruction_listener(
2054a0d1 471 const struct bt_trace *c_trace, bt_listener_id listener_id)
3602afb0 472{
40f4ba76 473 struct bt_trace *trace = (void *) c_trace;
ad5268b5 474 struct bt_trace_destruction_listener_elem *elem;
3602afb0 475
17f3083a 476 BT_ASSERT_PRE_NO_ERROR();
d5b13b9b 477 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
1778c2a4
PP
478 BT_ASSERT_PRE("listener-id-exists",
479 has_listener_id(trace, listener_id),
ad5268b5 480 "Trace has no such trace destruction listener ID: "
44c440bc 481 "%![trace-]+t, %" PRIu64, trace, listener_id);
d50d46f3 482 elem = &bt_g_array_index(trace->destruction_listeners,
ad5268b5 483 struct bt_trace_destruction_listener_elem,
3602afb0 484 listener_id);
44c440bc 485 BT_ASSERT(elem->func);
3602afb0
PP
486
487 elem->func = NULL;
488 elem->data = NULL;
3f7d4d90 489 BT_LIB_LOGD("Removed \"trace destruction listener: "
44c440bc
PP
490 "%![trace-]+t, listener-id=%" PRIu64,
491 trace, listener_id);
d24d5663 492 return BT_FUNC_STATUS_OK;
44c440bc 493}
3602afb0 494
40f4ba76 495void _bt_trace_freeze(const struct bt_trace *trace)
44c440bc 496{
44c440bc 497 BT_ASSERT(trace);
862ca4ed
PP
498 BT_LIB_LOGD("Freezing trace's class: %!+T", trace->class);
499 bt_trace_class_freeze(trace->class);
c6962c96
PP
500 BT_LIB_LOGD("Freezing trace's user attributes: %!+v",
501 trace->user_attributes);
502 bt_value_freeze(trace->user_attributes);
44c440bc 503 BT_LIB_LOGD("Freezing trace: %!+t", trace);
40f4ba76 504 ((struct bt_trace *) trace)->frozen = true;
5acf2ae6 505}
312c056a 506
44c440bc
PP
507void bt_trace_add_stream(struct bt_trace *trace, struct bt_stream *stream)
508{
509 guint count = 0;
510
511 bt_object_set_parent(&stream->base, &trace->base);
512 g_ptr_array_add(trace->streams, stream);
cb6f1f7d 513 bt_trace_freeze(trace);
312c056a 514
44c440bc
PP
515 if (bt_g_hash_table_contains(trace->stream_classes_stream_count,
516 stream->class)) {
517 count = GPOINTER_TO_UINT(g_hash_table_lookup(
518 trace->stream_classes_stream_count, stream->class));
312c056a
PP
519 }
520
44c440bc
PP
521 g_hash_table_insert(trace->stream_classes_stream_count,
522 stream->class, GUINT_TO_POINTER(count + 1));
523}
524
40f4ba76
PP
525uint64_t bt_trace_get_automatic_stream_id(const struct bt_trace *trace,
526 const struct bt_stream_class *stream_class)
44c440bc
PP
527{
528 gpointer orig_key;
529 gpointer value;
530 uint64_t id = 0;
531
532 BT_ASSERT(stream_class);
533 BT_ASSERT(trace);
534 if (g_hash_table_lookup_extended(trace->stream_classes_stream_count,
535 stream_class, &orig_key, &value)) {
536 id = (uint64_t) GPOINTER_TO_UINT(value);
537 }
538
539 return id;
312c056a 540}
862ca4ed 541
1353b066 542BT_EXPORT
862ca4ed
PP
543struct bt_trace_class *bt_trace_borrow_class(struct bt_trace *trace)
544{
d5b13b9b 545 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
862ca4ed
PP
546 return trace->class;
547}
548
1353b066 549BT_EXPORT
862ca4ed
PP
550const struct bt_trace_class *bt_trace_borrow_class_const(
551 const struct bt_trace *trace)
552{
553 return bt_trace_borrow_class((void *) trace);
554}
c5b9b441 555
1353b066 556BT_EXPORT
c6962c96
PP
557const struct bt_value *bt_trace_borrow_user_attributes_const(
558 const struct bt_trace *trace)
559{
d5b13b9b 560 BT_ASSERT_PRE_DEV_TRACE_NON_NULL(trace);
c6962c96
PP
561 return trace->user_attributes;
562}
563
1353b066 564BT_EXPORT
c6962c96
PP
565struct bt_value *bt_trace_borrow_user_attributes(struct bt_trace *trace)
566{
567 return (void *) bt_trace_borrow_user_attributes_const((void *) trace);
568}
569
1353b066 570BT_EXPORT
c6962c96
PP
571void bt_trace_set_user_attributes(
572 struct bt_trace *trace,
573 const struct bt_value *user_attributes)
574{
d5b13b9b
PP
575 BT_ASSERT_PRE_TRACE_NON_NULL(trace);
576 BT_ASSERT_PRE_USER_ATTRS_NON_NULL(user_attributes);
577 BT_ASSERT_PRE_USER_ATTRS_IS_MAP(user_attributes);
c6962c96 578 BT_ASSERT_PRE_DEV_TRACE_HOT(trace);
6871026b 579 bt_object_put_ref_no_null_check(trace->user_attributes);
c6962c96 580 trace->user_attributes = (void *) user_attributes;
6871026b 581 bt_object_get_ref_no_null_check(trace->user_attributes);
c6962c96
PP
582}
583
1353b066 584BT_EXPORT
c5b9b441
PP
585void bt_trace_get_ref(const struct bt_trace *trace)
586{
587 bt_object_get_ref(trace);
588}
589
1353b066 590BT_EXPORT
c5b9b441
PP
591void bt_trace_put_ref(const struct bt_trace *trace)
592{
593 bt_object_put_ref(trace);
594}
This page took 0.156414 seconds and 5 git commands to generate.