4 * Babeltrace CTF IR - Clock class
6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 #define BT_LOG_TAG "CLOCK-CLASS"
30 #include <babeltrace/lib-logging-internal.h>
32 #include <babeltrace/assert-pre-internal.h>
33 #include <babeltrace/compat/uuid-internal.h>
34 #include <babeltrace/ctf-ir/clock-class-internal.h>
35 #include <babeltrace/ctf-ir/clock-value-internal.h>
36 #include <babeltrace/ctf-ir/utils.h>
37 #include <babeltrace/ref.h>
38 #include <babeltrace/compiler-internal.h>
39 #include <babeltrace/types.h>
40 #include <babeltrace/compat/string-internal.h>
42 #include <babeltrace/object-internal.h>
43 #include <babeltrace/assert-internal.h>
46 void bt_clock_class_destroy(struct bt_object
*obj
);
49 struct bt_clock_value
*bt_clock_value_new(struct bt_clock_class
*clock_class
);
52 void bt_clock_value_destroy(struct bt_clock_value
*clock_value
);
55 bt_bool
bt_clock_class_is_valid(struct bt_clock_class
*clock_class
)
57 return clock_class
&& clock_class
->name
;
60 int bt_clock_class_set_name(struct bt_clock_class
*clock_class
,
66 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
71 if (clock_class
->frozen
) {
72 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
73 clock_class
, bt_clock_class_get_name(clock_class
));
78 if (!bt_identifier_is_valid(name
)) {
79 BT_LOGW("Clock class's name is not a valid CTF identifier: "
80 "addr=%p, name=\"%s\"",
86 if (clock_class
->name
) {
87 g_string_assign(clock_class
->name
, name
);
89 clock_class
->name
= g_string_new(name
);
90 if (!clock_class
->name
) {
91 BT_LOGE_STR("Failed to allocate a GString.");
97 BT_LOGV("Set clock class's name: addr=%p, name=\"%s\"",
105 bool validate_freq(struct bt_clock_class
*clock_class
,
106 const char *name
, uint64_t freq
)
108 bool is_valid
= true;
110 if (freq
== -1ULL || freq
== 0) {
111 BT_LOGW("Invalid parameter: frequency is invalid: "
112 "addr=%p, name=\"%s\", freq=%" PRIu64
,
113 clock_class
, name
, freq
);
123 void bt_clock_class_free_clock_value(struct bt_clock_value
*clock_value
,
124 struct bt_clock_class
*clock_class
)
126 bt_clock_value_destroy(clock_value
);
129 struct bt_clock_class
*bt_clock_class_create(const char *name
,
133 struct bt_clock_class
*clock_class
= NULL
;
135 BT_LOGD("Creating default clock class object: name=\"%s\"",
138 if (!validate_freq(NULL
, name
, freq
)) {
139 /* validate_freq() logs errors */
143 clock_class
= g_new0(struct bt_clock_class
, 1);
145 BT_LOGE_STR("Failed to allocate one clock class.");
149 clock_class
->precision
= 1;
150 clock_class
->frequency
= freq
;
151 bt_object_init_shared(&clock_class
->base
, bt_clock_class_destroy
);
154 ret
= bt_clock_class_set_name(clock_class
, name
);
156 /* bt_clock_class_set_name() logs errors */
161 ret
= bt_object_pool_initialize(&clock_class
->cv_pool
,
162 (bt_object_pool_new_object_func
) bt_clock_value_new
,
163 (bt_object_pool_destroy_object_func
)
164 bt_clock_class_free_clock_value
,
167 BT_LOGE("Failed to initialize clock value pool: ret=%d",
172 BT_LOGD("Created clock class object: addr=%p, name=\"%s\"",
180 const char *bt_clock_class_get_name(struct bt_clock_class
*clock_class
)
182 const char *ret
= NULL
;
185 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
189 if (clock_class
->name
) {
190 ret
= clock_class
->name
->str
;
197 const char *bt_clock_class_get_description(
198 struct bt_clock_class
*clock_class
)
200 const char *ret
= NULL
;
203 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
207 if (clock_class
->description
) {
208 ret
= clock_class
->description
->str
;
214 int bt_clock_class_set_description(struct bt_clock_class
*clock_class
,
219 if (!clock_class
|| !desc
) {
220 BT_LOGW("Invalid parameter: clock class or description is NULL: "
221 "clock-class-addr=%p, name=\"%s\", desc-addr=%p",
222 clock_class
, bt_clock_class_get_name(clock_class
),
228 if (clock_class
->frozen
) {
229 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
230 clock_class
, bt_clock_class_get_name(clock_class
));
235 clock_class
->description
= g_string_new(desc
);
236 ret
= clock_class
->description
? 0 : -1;
237 BT_LOGV("Set clock class's description: addr=%p, "
238 "name=\"%s\", desc=\"%s\"",
239 clock_class
, bt_clock_class_get_name(clock_class
), desc
);
244 uint64_t bt_clock_class_get_frequency(
245 struct bt_clock_class
*clock_class
)
247 uint64_t ret
= -1ULL;
250 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
254 ret
= clock_class
->frequency
;
259 int bt_clock_class_set_frequency(struct bt_clock_class
*clock_class
,
265 BT_LOGW("Invalid parameter: clock class is NULL or frequency is invalid: "
266 "addr=%p, name=\"%s\"",
267 clock_class
, bt_clock_class_get_name(clock_class
));
272 if (!validate_freq(clock_class
, bt_clock_class_get_name(clock_class
),
274 /* validate_freq() logs errors */
278 if (clock_class
->frozen
) {
279 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
280 clock_class
, bt_clock_class_get_name(clock_class
));
285 clock_class
->frequency
= freq
;
286 BT_LOGV("Set clock class's frequency: addr=%p, name=\"%s\", freq=%" PRIu64
,
287 clock_class
, bt_clock_class_get_name(clock_class
), freq
);
292 uint64_t bt_clock_class_get_precision(struct bt_clock_class
*clock_class
)
294 uint64_t ret
= -1ULL;
297 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
301 ret
= clock_class
->precision
;
306 int bt_clock_class_set_precision(struct bt_clock_class
*clock_class
,
311 if (!clock_class
|| precision
== -1ULL) {
312 BT_LOGW("Invalid parameter: clock class is NULL or precision is invalid: "
313 "addr=%p, name=\"%s\", precision=%" PRIu64
,
314 clock_class
, bt_clock_class_get_name(clock_class
),
320 if (clock_class
->frozen
) {
321 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
322 clock_class
, bt_clock_class_get_name(clock_class
));
327 clock_class
->precision
= precision
;
328 BT_LOGV("Set clock class's precision: addr=%p, name=\"%s\", precision=%" PRIu64
,
329 clock_class
, bt_clock_class_get_name(clock_class
),
335 int bt_clock_class_get_offset_s(struct bt_clock_class
*clock_class
,
340 if (!clock_class
|| !offset_s
) {
341 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
342 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
343 clock_class
, bt_clock_class_get_name(clock_class
),
349 *offset_s
= clock_class
->offset_s
;
354 int bt_clock_class_set_offset_s(struct bt_clock_class
*clock_class
,
360 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
365 if (clock_class
->frozen
) {
366 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
367 clock_class
, bt_clock_class_get_name(clock_class
));
372 clock_class
->offset_s
= offset_s
;
373 BT_LOGV("Set clock class's offset (seconds): "
374 "addr=%p, name=\"%s\", offset-s=%" PRId64
,
375 clock_class
, bt_clock_class_get_name(clock_class
),
381 int bt_clock_class_get_offset_cycles(struct bt_clock_class
*clock_class
,
386 if (!clock_class
|| !offset
) {
387 BT_LOGW("Invalid parameter: clock class or offset pointer is NULL: "
388 "clock-class-addr=%p, name=\"%s\", offset-addr=%p",
389 clock_class
, bt_clock_class_get_name(clock_class
),
395 *offset
= clock_class
->offset
;
400 int bt_clock_class_set_offset_cycles(struct bt_clock_class
*clock_class
,
406 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
411 if (clock_class
->frozen
) {
412 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
413 clock_class
, bt_clock_class_get_name(clock_class
));
418 clock_class
->offset
= offset
;
419 BT_LOGV("Set clock class's offset (cycles): addr=%p, name=\"%s\", offset-cycles=%" PRId64
,
420 clock_class
, bt_clock_class_get_name(clock_class
), offset
);
425 bt_bool
bt_clock_class_is_absolute(struct bt_clock_class
*clock_class
)
430 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
434 ret
= clock_class
->absolute
;
439 int bt_clock_class_set_is_absolute(struct bt_clock_class
*clock_class
,
445 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
450 if (clock_class
->frozen
) {
451 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
452 clock_class
, bt_clock_class_get_name(clock_class
));
457 clock_class
->absolute
= !!is_absolute
;
458 BT_LOGV("Set clock class's absolute flag: addr=%p, name=\"%s\", is-absolute=%d",
459 clock_class
, bt_clock_class_get_name(clock_class
),
465 const unsigned char *bt_clock_class_get_uuid(
466 struct bt_clock_class
*clock_class
)
468 const unsigned char *ret
;
471 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
476 if (!clock_class
->uuid_set
) {
477 BT_LOGV("Clock class's UUID is not set: addr=%p, name=\"%s\"",
478 clock_class
, bt_clock_class_get_name(clock_class
));
483 ret
= clock_class
->uuid
;
488 int bt_clock_class_set_uuid(struct bt_clock_class
*clock_class
,
489 const unsigned char *uuid
)
493 if (!clock_class
|| !uuid
) {
494 BT_LOGW("Invalid parameter: clock class or UUID is NULL: "
495 "clock-class-addr=%p, name=\"%s\", uuid-addr=%p",
496 clock_class
, bt_clock_class_get_name(clock_class
),
502 if (clock_class
->frozen
) {
503 BT_LOGW("Invalid parameter: clock class is frozen: addr=%p, name=\"%s\"",
504 clock_class
, bt_clock_class_get_name(clock_class
));
509 memcpy(clock_class
->uuid
, uuid
, BABELTRACE_UUID_LEN
);
510 clock_class
->uuid_set
= 1;
511 BT_LOGV("Set clock class's UUID: addr=%p, name=\"%s\", "
512 "uuid=\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\"",
513 clock_class
, bt_clock_class_get_name(clock_class
),
514 (unsigned int) uuid
[0],
515 (unsigned int) uuid
[1],
516 (unsigned int) uuid
[2],
517 (unsigned int) uuid
[3],
518 (unsigned int) uuid
[4],
519 (unsigned int) uuid
[5],
520 (unsigned int) uuid
[6],
521 (unsigned int) uuid
[7],
522 (unsigned int) uuid
[8],
523 (unsigned int) uuid
[9],
524 (unsigned int) uuid
[10],
525 (unsigned int) uuid
[11],
526 (unsigned int) uuid
[12],
527 (unsigned int) uuid
[13],
528 (unsigned int) uuid
[14],
529 (unsigned int) uuid
[15]);
535 void bt_clock_class_freeze(struct bt_clock_class
*clock_class
)
537 if (!clock_class
|| clock_class
->frozen
) {
541 BT_LOGD("Freezing clock class: addr=%p, name=\"%s\"",
542 clock_class
, bt_clock_class_get_name(clock_class
));
543 clock_class
->frozen
= 1;
547 void bt_clock_class_destroy(struct bt_object
*obj
)
549 struct bt_clock_class
*clock_class
;
551 clock_class
= container_of(obj
, struct bt_clock_class
, base
);
552 BT_LOGD("Destroying clock class: addr=%p, name=\"%s\"",
553 obj
, bt_clock_class_get_name(clock_class
));
555 if (clock_class
->name
) {
556 g_string_free(clock_class
->name
, TRUE
);
559 if (clock_class
->description
) {
560 g_string_free(clock_class
->description
, TRUE
);
563 bt_object_pool_finalize(&clock_class
->cv_pool
);
568 void bt_clock_value_destroy(struct bt_clock_value
*clock_value
)
570 BT_LOGD("Destroying clock value: addr=%p, clock-class-addr=%p, "
571 "clock-class-name=\"%s\"", clock_value
,
572 clock_value
->clock_class
,
573 bt_clock_class_get_name(clock_value
->clock_class
));
574 bt_put(clock_value
->clock_class
);
579 struct bt_clock_value
*bt_clock_value_new(struct bt_clock_class
*clock_class
)
581 struct bt_clock_value
*ret
= NULL
;
583 BT_LOGD("Creating clock value object: clock-class-addr=%p, "
584 "clock-class-name=\"%s\"", clock_class
,
585 bt_clock_class_get_name(clock_class
));
588 BT_LOGW_STR("Invalid parameter: clock class is NULL.");
592 ret
= g_new0(struct bt_clock_value
, 1);
594 BT_LOGE_STR("Failed to allocate one clock value.");
598 bt_object_init_unique(&ret
->base
);
599 ret
->clock_class
= bt_get(clock_class
);
600 bt_clock_class_freeze(clock_class
);
601 BT_LOGD("Created clock value object: clock-value-addr=%p, "
602 "clock-class-addr=%p, clock-class-name=\"%s\", "
603 "ns-from-epoch=%" PRId64
", ns-from-epoch-overflows=%d",
604 ret
, clock_class
, bt_clock_class_get_name(clock_class
),
605 ret
->ns_from_epoch
, ret
->ns_from_epoch_overflows
);
612 struct bt_clock_value
*bt_clock_value_create(struct bt_clock_class
*clock_class
)
614 struct bt_clock_value
*clock_value
= NULL
;
616 BT_ASSERT(clock_class
);
617 clock_value
= bt_object_pool_create_object(&clock_class
->cv_pool
);
619 BT_LIB_LOGE("Cannot allocate one clock value from clock class's clock value pool: "
620 "%![cc-]+K", clock_class
);
624 if (!clock_value
->clock_class
) {
625 clock_value
->clock_class
= bt_get(clock_class
);
632 bt_clock_value_recycle(clock_value
);
641 void bt_clock_value_recycle(struct bt_clock_value
*clock_value
)
643 struct bt_clock_class
*clock_class
;
645 BT_ASSERT(clock_value
);
646 BT_LIB_LOGD("Recycling clock value: %!+k", clock_value
);
649 * Those are the important ordered steps:
651 * 1. Reset the clock value object, but do NOT put its clock
652 * class's reference. This clock class contains the pool to
653 * which we're about to recycle this clock value object, so
654 * we must guarantee its existence thanks to this existing
657 * 2. Move the clock class reference to our `clock_class`
658 * variable so that we can set the clock value's clock class
659 * member to NULL before recycling it. We CANNOT do this
660 * after we put the clock class reference because this
661 * bt_put() could destroy the clock class, also destroying
662 * its clock value pool, thus also destroying our clock value
663 * object (this would result in an invalid write access).
665 * 3. Recycle the clock value object.
667 * 4. Put our clock class reference.
669 bt_clock_value_reset(clock_value
);
670 bt_clock_value_set_is_frozen(clock_value
, false);
671 clock_class
= clock_value
->clock_class
;
672 BT_ASSERT(clock_class
);
673 clock_value
->clock_class
= NULL
;
674 bt_object_pool_recycle_object(&clock_class
->cv_pool
, clock_value
);
678 int bt_clock_value_get_value(struct bt_clock_value
*clock_value
,
683 if (!clock_value
|| !raw_value
) {
684 BT_LOGW("Invalid parameter: clock value or raw value is NULL: "
685 "clock-value-addr=%p, raw-value-addr=%p",
686 clock_value
, raw_value
);
691 *raw_value
= clock_value
->value
;
696 int bt_clock_value_get_value_ns_from_epoch(struct bt_clock_value
*value
,
697 int64_t *ret_value_ns
)
701 if (!value
|| !ret_value_ns
) {
702 BT_LOGW("Invalid parameter: clock value or return value pointer is NULL: "
703 "clock-value-addr=%p, ret-value-addr=%p",
704 value
, ret_value_ns
);
709 if (value
->ns_from_epoch_overflows
) {
710 BT_LOGW("Clock value converted to nanoseconds from Epoch overflows the signed 64-bit integer range: "
711 "clock-value-addr=%p, "
712 "clock-class-offset-s=%" PRId64
", "
713 "clock-class-offset-cycles=%" PRId64
", "
715 value
, value
->clock_class
->offset_s
,
716 value
->clock_class
->offset
,
722 *ret_value_ns
= value
->ns_from_epoch
;
728 struct bt_clock_class
*bt_clock_value_borrow_class(
729 struct bt_clock_value
*clock_value
)
731 struct bt_clock_class
*clock_class
= NULL
;
734 BT_LOGW_STR("Invalid parameter: clock value is NULL.");
738 clock_class
= clock_value
->clock_class
;
745 int bt_clock_class_compare(struct bt_clock_class
*clock_class_a
,
746 struct bt_clock_class
*clock_class_b
)
749 BT_ASSERT(clock_class_a
);
750 BT_ASSERT(clock_class_b
);
753 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
) != 0) {
754 BT_LOGV("Clock classes differ: different names: "
755 "cc-a-name=\"%s\", cc-b-name=\"%s\"",
756 clock_class_a
->name
->str
,
757 clock_class_b
->name
->str
);
762 if (clock_class_a
->description
) {
763 if (!clock_class_b
->description
) {
764 BT_LOGV_STR("Clock classes differ: clock class A has a "
765 "description, but clock class B does not.");
769 if (strcmp(clock_class_a
->name
->str
, clock_class_b
->name
->str
)
771 BT_LOGV("Clock classes differ: different descriptions: "
772 "cc-a-descr=\"%s\", cc-b-descr=\"%s\"",
773 clock_class_a
->description
->str
,
774 clock_class_b
->description
->str
);
778 if (clock_class_b
->description
) {
779 BT_LOGV_STR("Clock classes differ: clock class A has "
780 "no description, but clock class B has one.");
786 if (clock_class_a
->frequency
!= clock_class_b
->frequency
) {
787 BT_LOGV("Clock classes differ: different frequencies: "
788 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
789 clock_class_a
->frequency
,
790 clock_class_b
->frequency
);
795 if (clock_class_a
->precision
!= clock_class_b
->precision
) {
796 BT_LOGV("Clock classes differ: different precisions: "
797 "cc-a-freq=%" PRIu64
", cc-b-freq=%" PRIu64
,
798 clock_class_a
->precision
,
799 clock_class_b
->precision
);
803 /* Offset (seconds) */
804 if (clock_class_a
->offset_s
!= clock_class_b
->offset_s
) {
805 BT_LOGV("Clock classes differ: different offsets (seconds): "
806 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
807 clock_class_a
->offset_s
,
808 clock_class_b
->offset_s
);
812 /* Offset (cycles) */
813 if (clock_class_a
->offset
!= clock_class_b
->offset
) {
814 BT_LOGV("Clock classes differ: different offsets (cycles): "
815 "cc-a-offset-s=%" PRId64
", cc-b-offset-s=%" PRId64
,
816 clock_class_a
->offset
,
817 clock_class_b
->offset
);
822 if (clock_class_a
->uuid_set
) {
823 if (!clock_class_b
->uuid_set
) {
824 BT_LOGV_STR("Clock classes differ: clock class A has a "
825 "UUID, but clock class B does not.");
829 if (memcmp(clock_class_a
->uuid
, clock_class_b
->uuid
,
830 BABELTRACE_UUID_LEN
) != 0) {
831 BT_LOGV("Clock classes differ: different UUIDs: "
832 "cc-a-uuid=\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\", "
833 "cc-b-uuid=\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\"",
834 (unsigned int) clock_class_a
->uuid
[0],
835 (unsigned int) clock_class_a
->uuid
[1],
836 (unsigned int) clock_class_a
->uuid
[2],
837 (unsigned int) clock_class_a
->uuid
[3],
838 (unsigned int) clock_class_a
->uuid
[4],
839 (unsigned int) clock_class_a
->uuid
[5],
840 (unsigned int) clock_class_a
->uuid
[6],
841 (unsigned int) clock_class_a
->uuid
[7],
842 (unsigned int) clock_class_a
->uuid
[8],
843 (unsigned int) clock_class_a
->uuid
[9],
844 (unsigned int) clock_class_a
->uuid
[10],
845 (unsigned int) clock_class_a
->uuid
[11],
846 (unsigned int) clock_class_a
->uuid
[12],
847 (unsigned int) clock_class_a
->uuid
[13],
848 (unsigned int) clock_class_a
->uuid
[14],
849 (unsigned int) clock_class_a
->uuid
[15],
850 (unsigned int) clock_class_b
->uuid
[0],
851 (unsigned int) clock_class_b
->uuid
[1],
852 (unsigned int) clock_class_b
->uuid
[2],
853 (unsigned int) clock_class_b
->uuid
[3],
854 (unsigned int) clock_class_b
->uuid
[4],
855 (unsigned int) clock_class_b
->uuid
[5],
856 (unsigned int) clock_class_b
->uuid
[6],
857 (unsigned int) clock_class_b
->uuid
[7],
858 (unsigned int) clock_class_b
->uuid
[8],
859 (unsigned int) clock_class_b
->uuid
[9],
860 (unsigned int) clock_class_b
->uuid
[10],
861 (unsigned int) clock_class_b
->uuid
[11],
862 (unsigned int) clock_class_b
->uuid
[12],
863 (unsigned int) clock_class_b
->uuid
[13],
864 (unsigned int) clock_class_b
->uuid
[14],
865 (unsigned int) clock_class_b
->uuid
[15]);
869 if (clock_class_b
->uuid_set
) {
870 BT_LOGV_STR("Clock classes differ: clock class A has "
871 "no UUID, but clock class B has one.");
877 if (!!clock_class_a
->absolute
!= !!clock_class_b
->absolute
) {
878 BT_LOGV("Clock classes differ: one is absolute, the other "
879 "is not: cc-a-is-absolute=%d, cc-b-is-absolute=%d",
880 !!clock_class_a
->absolute
,
881 !!clock_class_b
->absolute
);
892 int bt_clock_class_cycles_to_ns(struct bt_clock_class
*clock_class
,
893 uint64_t cycles
, int64_t *ns
)
898 BT_ASSERT_PRE_NON_NULL(clock_class
, "Clock class");
899 BT_ASSERT_PRE_NON_NULL(ns
, "Nanoseconds");
901 ret
= ns_from_epoch(clock_class
, cycles
, ns
, &overflows
);
904 BT_LIB_LOGW("Cannot convert cycles to nanoseconds "
905 "from Epoch for given clock class: "
906 "value overflow: %![cc-]+K, cycles=%" PRIu64
,
907 clock_class
, cycles
);
909 BT_LIB_LOGW("Cannot convert cycles to nanoseconds "
910 "from Epoch for given clock class: "
911 "%![cc-]+K, cycles=%" PRIu64
,
912 clock_class
, cycles
);