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 "compat/string.h"
19 #include "common/assert.h"
21 #include "assert-pre.h"
22 #include "clock-class.h"
26 void bt_ctf_clock_class_destroy(struct bt_ctf_object
*obj
);
28 bt_ctf_bool
bt_ctf_clock_class_is_valid(struct bt_ctf_clock_class
*clock_class
)
30 return clock_class
&& clock_class
->name
;
33 int bt_ctf_clock_class_set_name(struct bt_ctf_clock_class
*clock_class
,
39 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
44 if (clock_class
->frozen
) {
45 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
46 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
51 if (!bt_ctf_identifier_is_valid(name
)) {
52 BT_LOGW("Clock class's name is not a valid CTF identifier: "
53 "addr=%p, name=\"%s\"",
59 if (clock_class
->name
) {
60 g_string_assign(clock_class
->name
, name
);
62 clock_class
->name
= g_string_new(name
);
63 if (!clock_class
->name
) {
64 BT_LOGE_STR("Failed to allocate a GString.");
70 BT_LOGT("Set clock class's name: addr=%p, name=\"%s\"",
78 bool validate_freq(struct bt_ctf_clock_class
*clock_class
,
79 const char *name
, uint64_t freq
)
83 if (freq
== -1ULL || freq
== 0) {
84 BT_LOGW("Invalid parameter: frequency is invalid: "
85 "addr=%p, name=\"%s\", freq=%" PRIu64
,
86 clock_class
, name
, freq
);
95 struct bt_ctf_clock_class
*bt_ctf_clock_class_create(const char *name
,
99 struct bt_ctf_clock_class
*clock_class
= NULL
;
101 BT_LOGD("Creating default clock class object: name=\"%s\"",
104 if (!validate_freq(NULL
, name
, freq
)) {
105 /* validate_freq() logs errors */
109 clock_class
= g_new0(struct bt_ctf_clock_class
, 1);
111 BT_LOGE_STR("Failed to allocate one clock class.");
115 clock_class
->precision
= 1;
116 clock_class
->frequency
= freq
;
117 bt_ctf_object_init_shared(&clock_class
->base
, bt_ctf_clock_class_destroy
);
120 ret
= bt_ctf_clock_class_set_name(clock_class
, name
);
122 /* bt_ctf_clock_class_set_name() logs errors */
127 BT_LOGD("Created clock class object: addr=%p, name=\"%s\"",
131 BT_CTF_OBJECT_PUT_REF_AND_RESET(clock_class
);
135 const char *bt_ctf_clock_class_get_name(struct bt_ctf_clock_class
*clock_class
)
137 const char *ret
= NULL
;
140 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
144 if (clock_class
->name
) {
145 ret
= clock_class
->name
->str
;
152 const char *bt_ctf_clock_class_get_description(
153 struct bt_ctf_clock_class
*clock_class
)
155 const char *ret
= NULL
;
158 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
162 if (clock_class
->description
) {
163 ret
= clock_class
->description
->str
;
169 int bt_ctf_clock_class_set_description(struct bt_ctf_clock_class
*clock_class
,
174 if (!clock_class
|| !desc
) {
175 BT_LOGW("Invalid parameter: clock class or description is NULL: "
176 "clock-class-addr=%p, name=\"%s\", desc-addr=%p",
177 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
183 if (clock_class
->frozen
) {
184 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
185 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
190 clock_class
->description
= g_string_new(desc
);
191 ret
= clock_class
->description
? 0 : -1;
192 BT_LOGT("Set clock class's description: addr=%p, "
193 "name=\"%s\", desc=\"%s\"",
194 clock_class
, bt_ctf_clock_class_get_name(clock_class
), desc
);
199 uint64_t bt_ctf_clock_class_get_frequency(
200 struct bt_ctf_clock_class
*clock_class
)
202 uint64_t ret
= -1ULL;
205 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
209 ret
= clock_class
->frequency
;
214 int bt_ctf_clock_class_set_frequency(struct bt_ctf_clock_class
*clock_class
,
220 BT_LOGW("Invalid parameter: clock class is NULL or frequency is invalid: "
221 "addr=%p, name=\"%s\"",
222 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
227 if (!validate_freq(clock_class
, bt_ctf_clock_class_get_name(clock_class
),
229 /* validate_freq() logs errors */
233 if (clock_class
->frozen
) {
234 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
235 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
240 clock_class
->frequency
= freq
;
241 BT_LOGT("Set clock class's frequency: addr=%p, name=\"%s\", freq=%" PRIu64
,
242 clock_class
, bt_ctf_clock_class_get_name(clock_class
), freq
);
247 uint64_t bt_ctf_clock_class_get_precision(struct bt_ctf_clock_class
*clock_class
)
249 uint64_t ret
= -1ULL;
252 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
256 ret
= clock_class
->precision
;
261 int bt_ctf_clock_class_set_precision(struct bt_ctf_clock_class
*clock_class
,
266 if (!clock_class
|| precision
== -1ULL) {
267 BT_LOGW("Invalid parameter: clock class is NULL or precision is invalid: "
268 "addr=%p, name=\"%s\", precision=%" PRIu64
,
269 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
275 if (clock_class
->frozen
) {
276 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
277 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
282 clock_class
->precision
= precision
;
283 BT_LOGT("Set clock class's precision: addr=%p, name=\"%s\", precision=%" PRIu64
,
284 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
290 int bt_ctf_clock_class_get_offset_s(struct bt_ctf_clock_class
*clock_class
,
295 if (!clock_class
|| !offset_s
) {
296 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
297 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
298 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
304 *offset_s
= clock_class
->offset_s
;
309 int bt_ctf_clock_class_set_offset_s(struct bt_ctf_clock_class
*clock_class
,
315 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
320 if (clock_class
->frozen
) {
321 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
322 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
327 clock_class
->offset_s
= offset_s
;
328 BT_LOGT("Set clock class's offset (seconds): "
329 "addr=%p, name=\"%s\", offset-s=%" PRId64
,
330 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
336 int bt_ctf_clock_class_get_offset_cycles(struct bt_ctf_clock_class
*clock_class
,
341 if (!clock_class
|| !offset
) {
342 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
343 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
344 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
350 *offset
= clock_class
->offset
;
355 int bt_ctf_clock_class_set_offset_cycles(struct bt_ctf_clock_class
*clock_class
,
361 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
366 if (clock_class
->frozen
) {
367 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
368 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
373 clock_class
->offset
= offset
;
374 BT_LOGT("Set clock class's offset (cycles): addr=%p, name=\"%s\", offset-cycles=%" PRId64
,
375 clock_class
, bt_ctf_clock_class_get_name(clock_class
), offset
);
380 bt_ctf_bool
bt_ctf_clock_class_is_absolute(struct bt_ctf_clock_class
*clock_class
)
385 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
389 ret
= clock_class
->absolute
;
394 int bt_ctf_clock_class_set_is_absolute(struct bt_ctf_clock_class
*clock_class
,
395 bt_ctf_bool is_absolute
)
400 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
405 if (clock_class
->frozen
) {
406 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
407 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
412 clock_class
->absolute
= !!is_absolute
;
413 BT_LOGT("Set clock class's absolute flag: addr=%p, name=\"%s\", is-absolute=%d",
414 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
420 const uint8_t *bt_ctf_clock_class_get_uuid(
421 struct bt_ctf_clock_class
*clock_class
)
426 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
431 if (!clock_class
->uuid_set
) {
432 BT_LOGT("Clock class's UUID is not set: addr=%p, name=\"%s\"",
433 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
438 ret
= clock_class
->uuid
;
443 int bt_ctf_clock_class_set_uuid(struct bt_ctf_clock_class
*clock_class
,
448 if (!clock_class
|| !uuid
) {
449 BT_LOGW("Invalid parameter: clock class or UUID is NULL: "
450 "clock-class-addr=%p, name=\"%s\", uuid-addr=%p",
451 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
457 if (clock_class
->frozen
) {
458 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
459 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
464 bt_uuid_copy(clock_class
->uuid
, uuid
);
465 clock_class
->uuid_set
= 1;
466 BT_LOGT("Set clock class's UUID: addr=%p, name=\"%s\", uuid=\"" BT_UUID_FMT
"\"",
467 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
468 BT_UUID_FMT_VALUES(uuid
));
473 void bt_ctf_clock_class_freeze(struct bt_ctf_clock_class
*clock_class
)
475 if (!clock_class
|| clock_class
->frozen
) {
479 BT_LOGD("Freezing clock class: addr=%p, name=\"%s\"",
480 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
481 clock_class
->frozen
= 1;
485 void bt_ctf_clock_class_destroy(struct bt_ctf_object
*obj
)
487 struct bt_ctf_clock_class
*clock_class
;
489 clock_class
= container_of(obj
, struct bt_ctf_clock_class
, base
);
490 BT_LOGD("Destroying clock class: addr=%p, name=\"%s\"",
491 obj
, bt_ctf_clock_class_get_name(clock_class
));
493 if (clock_class
->name
) {
494 g_string_free(clock_class
->name
, TRUE
);
497 if (clock_class
->description
) {
498 g_string_free(clock_class
->description
, TRUE
);
504 int bt_ctf_clock_class_compare(struct bt_ctf_clock_class
*clock_class_a
,
505 struct bt_ctf_clock_class
*clock_class_b
)
508 BT_ASSERT_DBG(clock_class_a
);
509 BT_ASSERT_DBG(clock_class_b
);
512 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
) != 0) {
513 BT_LOGT("Clock classes differ: different names: "
514 "cc-a-name=\"%s\", cc-b-name=\"%s\"",
515 clock_class_a
->name
->str
,
516 clock_class_b
->name
->str
);
521 if (clock_class_a
->description
) {
522 if (!clock_class_b
->description
) {
523 BT_LOGT_STR("Clock classes differ: clock class A has a "
524 "description, but clock class B does not.");
528 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
)
530 BT_LOGT("Clock classes differ: different descriptions: "
531 "cc-a-descr=\"%s\", cc-b-descr=\"%s\"",
532 clock_class_a
->description
->str
,
533 clock_class_b
->description
->str
);
537 if (clock_class_b
->description
) {
538 BT_LOGT_STR("Clock classes differ: clock class A has "
539 "no description, but clock class B has one.");
545 if (clock_class_a
->frequency
!= clock_class_b
->frequency
) {
546 BT_LOGT("Clock classes differ: different frequencies: "
547 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
548 clock_class_a
->frequency
,
549 clock_class_b
->frequency
);
554 if (clock_class_a
->precision
!= clock_class_b
->precision
) {
555 BT_LOGT("Clock classes differ: different precisions: "
556 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
557 clock_class_a
->precision
,
558 clock_class_b
->precision
);
562 /* Offset (seconds) */
563 if (clock_class_a
->offset_s
!= clock_class_b
->offset_s
) {
564 BT_LOGT("Clock classes differ: different offsets (seconds): "
565 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
566 clock_class_a
->offset_s
,
567 clock_class_b
->offset_s
);
571 /* Offset (cycles) */
572 if (clock_class_a
->offset
!= clock_class_b
->offset
) {
573 BT_LOGT("Clock classes differ: different offsets (cycles): "
574 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
575 clock_class_a
->offset
,
576 clock_class_b
->offset
);
581 if (clock_class_a
->uuid_set
) {
582 if (!clock_class_b
->uuid_set
) {
583 BT_LOGT_STR("Clock classes differ: clock class A has a "
584 "UUID, but clock class B does not.");
588 if (bt_uuid_compare(clock_class_a
->uuid
, clock_class_b
->uuid
) != 0) {
589 BT_LOGT("Clock classes differ: different UUIDs: "
590 "cc-a-uuid=\"" BT_UUID_FMT
"\", "
591 "cc-b-uuid=\"" BT_UUID_FMT
"\"",
592 BT_UUID_FMT_VALUES(clock_class_a
->uuid
),
593 BT_UUID_FMT_VALUES(clock_class_b
->uuid
));
597 if (clock_class_b
->uuid_set
) {
598 BT_LOGT_STR("Clock classes differ: clock class A has "
599 "no UUID, but clock class B has one.");
605 if (!!clock_class_a
->absolute
!= !!clock_class_b
->absolute
) {
606 BT_LOGT("Clock classes differ: one is absolute, the other "
607 "is not: cc-a-is-absolute=%d, cc-b-is-absolute=%d",
608 !!clock_class_a
->absolute
,
609 !!clock_class_b
->absolute
);