2 * SPDX-License-Identifier: MIT
4 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
6 * Babeltrace CTF writer - Clock class
9 #define BT_LOG_TAG "CTF-WRITER/CLOCK-CLASS"
12 #include "common/uuid.h"
13 #include <babeltrace2-ctf-writer/utils.h>
14 #include <babeltrace2-ctf-writer/object.h>
15 #include "compat/compiler.h"
16 #include <babeltrace2/types.h>
17 #include "compat/string.h"
20 #include "common/assert.h"
22 #include "assert-pre.h"
23 #include "clock-class.h"
27 void bt_ctf_clock_class_destroy(struct bt_ctf_object
*obj
);
29 bt_ctf_bool
bt_ctf_clock_class_is_valid(struct bt_ctf_clock_class
*clock_class
)
31 return clock_class
&& clock_class
->name
;
34 int bt_ctf_clock_class_set_name(struct bt_ctf_clock_class
*clock_class
,
40 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
45 if (clock_class
->frozen
) {
46 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
47 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
52 if (!bt_ctf_identifier_is_valid(name
)) {
53 BT_LOGW("Clock class's name is not a valid CTF identifier: "
54 "addr=%p, name=\"%s\"",
60 if (clock_class
->name
) {
61 g_string_assign(clock_class
->name
, name
);
63 clock_class
->name
= g_string_new(name
);
64 if (!clock_class
->name
) {
65 BT_LOGE_STR("Failed to allocate a GString.");
71 BT_LOGT("Set clock class's name: addr=%p, name=\"%s\"",
79 bool validate_freq(struct bt_ctf_clock_class
*clock_class
,
80 const char *name
, uint64_t freq
)
84 if (freq
== -1ULL || freq
== 0) {
85 BT_LOGW("Invalid parameter: frequency is invalid: "
86 "addr=%p, name=\"%s\", freq=%" PRIu64
,
87 clock_class
, name
, freq
);
96 struct bt_ctf_clock_class
*bt_ctf_clock_class_create(const char *name
,
100 struct bt_ctf_clock_class
*clock_class
= NULL
;
102 BT_LOGD("Creating default clock class object: name=\"%s\"",
105 if (!validate_freq(NULL
, name
, freq
)) {
106 /* validate_freq() logs errors */
110 clock_class
= g_new0(struct bt_ctf_clock_class
, 1);
112 BT_LOGE_STR("Failed to allocate one clock class.");
116 clock_class
->precision
= 1;
117 clock_class
->frequency
= freq
;
118 bt_ctf_object_init_shared(&clock_class
->base
, bt_ctf_clock_class_destroy
);
121 ret
= bt_ctf_clock_class_set_name(clock_class
, name
);
123 /* bt_ctf_clock_class_set_name() logs errors */
128 BT_LOGD("Created clock class object: addr=%p, name=\"%s\"",
132 BT_CTF_OBJECT_PUT_REF_AND_RESET(clock_class
);
136 const char *bt_ctf_clock_class_get_name(struct bt_ctf_clock_class
*clock_class
)
138 const char *ret
= NULL
;
141 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
145 if (clock_class
->name
) {
146 ret
= clock_class
->name
->str
;
153 const char *bt_ctf_clock_class_get_description(
154 struct bt_ctf_clock_class
*clock_class
)
156 const char *ret
= NULL
;
159 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
163 if (clock_class
->description
) {
164 ret
= clock_class
->description
->str
;
170 int bt_ctf_clock_class_set_description(struct bt_ctf_clock_class
*clock_class
,
175 if (!clock_class
|| !desc
) {
176 BT_LOGW("Invalid parameter: clock class or description is NULL: "
177 "clock-class-addr=%p, name=\"%s\", desc-addr=%p",
178 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
184 if (clock_class
->frozen
) {
185 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
186 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
191 clock_class
->description
= g_string_new(desc
);
192 ret
= clock_class
->description
? 0 : -1;
193 BT_LOGT("Set clock class's description: addr=%p, "
194 "name=\"%s\", desc=\"%s\"",
195 clock_class
, bt_ctf_clock_class_get_name(clock_class
), desc
);
200 uint64_t bt_ctf_clock_class_get_frequency(
201 struct bt_ctf_clock_class
*clock_class
)
203 uint64_t ret
= -1ULL;
206 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
210 ret
= clock_class
->frequency
;
215 int bt_ctf_clock_class_set_frequency(struct bt_ctf_clock_class
*clock_class
,
221 BT_LOGW("Invalid parameter: clock class is NULL or frequency is invalid: "
222 "addr=%p, name=\"%s\"",
223 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
228 if (!validate_freq(clock_class
, bt_ctf_clock_class_get_name(clock_class
),
230 /* validate_freq() logs errors */
234 if (clock_class
->frozen
) {
235 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
236 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
241 clock_class
->frequency
= freq
;
242 BT_LOGT("Set clock class's frequency: addr=%p, name=\"%s\", freq=%" PRIu64
,
243 clock_class
, bt_ctf_clock_class_get_name(clock_class
), freq
);
248 uint64_t bt_ctf_clock_class_get_precision(struct bt_ctf_clock_class
*clock_class
)
250 uint64_t ret
= -1ULL;
253 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
257 ret
= clock_class
->precision
;
262 int bt_ctf_clock_class_set_precision(struct bt_ctf_clock_class
*clock_class
,
267 if (!clock_class
|| precision
== -1ULL) {
268 BT_LOGW("Invalid parameter: clock class is NULL or precision is invalid: "
269 "addr=%p, name=\"%s\", precision=%" PRIu64
,
270 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
276 if (clock_class
->frozen
) {
277 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
278 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
283 clock_class
->precision
= precision
;
284 BT_LOGT("Set clock class's precision: addr=%p, name=\"%s\", precision=%" PRIu64
,
285 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
291 int bt_ctf_clock_class_get_offset_s(struct bt_ctf_clock_class
*clock_class
,
296 if (!clock_class
|| !offset_s
) {
297 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
298 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
299 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
305 *offset_s
= clock_class
->offset_s
;
310 int bt_ctf_clock_class_set_offset_s(struct bt_ctf_clock_class
*clock_class
,
316 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
321 if (clock_class
->frozen
) {
322 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
323 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
328 clock_class
->offset_s
= offset_s
;
329 BT_LOGT("Set clock class's offset (seconds): "
330 "addr=%p, name=\"%s\", offset-s=%" PRId64
,
331 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
337 int bt_ctf_clock_class_get_offset_cycles(struct bt_ctf_clock_class
*clock_class
,
342 if (!clock_class
|| !offset
) {
343 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
344 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
345 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
351 *offset
= clock_class
->offset
;
356 int bt_ctf_clock_class_set_offset_cycles(struct bt_ctf_clock_class
*clock_class
,
362 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
367 if (clock_class
->frozen
) {
368 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
369 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
374 clock_class
->offset
= offset
;
375 BT_LOGT("Set clock class's offset (cycles): addr=%p, name=\"%s\", offset-cycles=%" PRId64
,
376 clock_class
, bt_ctf_clock_class_get_name(clock_class
), offset
);
381 bt_ctf_bool
bt_ctf_clock_class_is_absolute(struct bt_ctf_clock_class
*clock_class
)
386 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
390 ret
= clock_class
->absolute
;
395 int bt_ctf_clock_class_set_is_absolute(struct bt_ctf_clock_class
*clock_class
,
396 bt_ctf_bool is_absolute
)
401 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
406 if (clock_class
->frozen
) {
407 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
408 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
413 clock_class
->absolute
= !!is_absolute
;
414 BT_LOGT("Set clock class's absolute flag: addr=%p, name=\"%s\", is-absolute=%d",
415 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
421 const uint8_t *bt_ctf_clock_class_get_uuid(
422 struct bt_ctf_clock_class
*clock_class
)
427 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
432 if (!clock_class
->uuid_set
) {
433 BT_LOGT("Clock class's UUID is not set: addr=%p, name=\"%s\"",
434 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
439 ret
= clock_class
->uuid
;
444 int bt_ctf_clock_class_set_uuid(struct bt_ctf_clock_class
*clock_class
,
449 if (!clock_class
|| !uuid
) {
450 BT_LOGW("Invalid parameter: clock class or UUID is NULL: "
451 "clock-class-addr=%p, name=\"%s\", uuid-addr=%p",
452 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
458 if (clock_class
->frozen
) {
459 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
460 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
465 bt_uuid_copy(clock_class
->uuid
, uuid
);
466 clock_class
->uuid_set
= 1;
467 BT_LOGT("Set clock class's UUID: addr=%p, name=\"%s\", uuid=\"" BT_UUID_FMT
"\"",
468 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
469 BT_UUID_FMT_VALUES(uuid
));
474 void bt_ctf_clock_class_freeze(struct bt_ctf_clock_class
*clock_class
)
476 if (!clock_class
|| clock_class
->frozen
) {
480 BT_LOGD("Freezing clock class: addr=%p, name=\"%s\"",
481 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
482 clock_class
->frozen
= 1;
486 void bt_ctf_clock_class_destroy(struct bt_ctf_object
*obj
)
488 struct bt_ctf_clock_class
*clock_class
;
490 clock_class
= container_of(obj
, struct bt_ctf_clock_class
, base
);
491 BT_LOGD("Destroying clock class: addr=%p, name=\"%s\"",
492 obj
, bt_ctf_clock_class_get_name(clock_class
));
494 if (clock_class
->name
) {
495 g_string_free(clock_class
->name
, TRUE
);
498 if (clock_class
->description
) {
499 g_string_free(clock_class
->description
, TRUE
);
505 int bt_ctf_clock_class_compare(struct bt_ctf_clock_class
*clock_class_a
,
506 struct bt_ctf_clock_class
*clock_class_b
)
509 BT_ASSERT_DBG(clock_class_a
);
510 BT_ASSERT_DBG(clock_class_b
);
513 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
) != 0) {
514 BT_LOGT("Clock classes differ: different names: "
515 "cc-a-name=\"%s\", cc-b-name=\"%s\"",
516 clock_class_a
->name
->str
,
517 clock_class_b
->name
->str
);
522 if (clock_class_a
->description
) {
523 if (!clock_class_b
->description
) {
524 BT_LOGT_STR("Clock classes differ: clock class A has a "
525 "description, but clock class B does not.");
529 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
)
531 BT_LOGT("Clock classes differ: different descriptions: "
532 "cc-a-descr=\"%s\", cc-b-descr=\"%s\"",
533 clock_class_a
->description
->str
,
534 clock_class_b
->description
->str
);
538 if (clock_class_b
->description
) {
539 BT_LOGT_STR("Clock classes differ: clock class A has "
540 "no description, but clock class B has one.");
546 if (clock_class_a
->frequency
!= clock_class_b
->frequency
) {
547 BT_LOGT("Clock classes differ: different frequencies: "
548 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
549 clock_class_a
->frequency
,
550 clock_class_b
->frequency
);
555 if (clock_class_a
->precision
!= clock_class_b
->precision
) {
556 BT_LOGT("Clock classes differ: different precisions: "
557 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
558 clock_class_a
->precision
,
559 clock_class_b
->precision
);
563 /* Offset (seconds) */
564 if (clock_class_a
->offset_s
!= clock_class_b
->offset_s
) {
565 BT_LOGT("Clock classes differ: different offsets (seconds): "
566 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
567 clock_class_a
->offset_s
,
568 clock_class_b
->offset_s
);
572 /* Offset (cycles) */
573 if (clock_class_a
->offset
!= clock_class_b
->offset
) {
574 BT_LOGT("Clock classes differ: different offsets (cycles): "
575 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
576 clock_class_a
->offset
,
577 clock_class_b
->offset
);
582 if (clock_class_a
->uuid_set
) {
583 if (!clock_class_b
->uuid_set
) {
584 BT_LOGT_STR("Clock classes differ: clock class A has a "
585 "UUID, but clock class B does not.");
589 if (bt_uuid_compare(clock_class_a
->uuid
, clock_class_b
->uuid
) != 0) {
590 BT_LOGT("Clock classes differ: different UUIDs: "
591 "cc-a-uuid=\"" BT_UUID_FMT
"\", "
592 "cc-b-uuid=\"" BT_UUID_FMT
"\"",
593 BT_UUID_FMT_VALUES(clock_class_a
->uuid
),
594 BT_UUID_FMT_VALUES(clock_class_b
->uuid
));
598 if (clock_class_b
->uuid_set
) {
599 BT_LOGT_STR("Clock classes differ: clock class A has "
600 "no UUID, but clock class B has one.");
606 if (!!clock_class_a
->absolute
!= !!clock_class_b
->absolute
) {
607 BT_LOGT("Clock classes differ: one is absolute, the other "
608 "is not: cc-a-is-absolute=%d, cc-b-is-absolute=%d",
609 !!clock_class_a
->absolute
,
610 !!clock_class_b
->absolute
);