return cc_prio_map;
}
-int bt_clock_class_priority_map_get_clock_class_count(
+int64_t bt_clock_class_priority_map_get_clock_class_count(
struct bt_clock_class_priority_map *cc_prio_map)
{
- int ret = -1;
+ int64_t ret = -1;
if (!cc_prio_map) {
goto end;
}
- ret = (int) cc_prio_map->entries->len;
+ ret = (int64_t) cc_prio_map->entries->len;
end:
return ret;
// FIXME when available: check
// bt_ctf_clock_class_is_valid(clock_class)
- if (!cc_prio_map) {
+ if (!cc_prio_map || !clock_class || cc_prio_map->frozen) {
ret = -1;
goto end;
}
- /* Check for duplicate clock classes */
+ /* Check for existing clock class */
prio_ptr = g_hash_table_lookup(cc_prio_map->prios, clock_class);
if (prio_ptr) {
+ *prio_ptr = priority;
prio_ptr = NULL;
- ret = -1;
- goto end;
+ goto set_highest_prio;
}
prio_ptr = g_new(uint64_t, 1);
g_ptr_array_add(cc_prio_map->entries, clock_class);
g_hash_table_insert(cc_prio_map->prios, clock_class, prio_ptr);
prio_ptr = NULL;
+
+set_highest_prio:
cc_prio = bt_ctf_clock_class_priority_map_current_highest_prio(
cc_prio_map);
assert(cc_prio.clock_class);
return ret;
}
+
+struct bt_clock_class_priority_map *bt_clock_class_priority_map_copy(
+ struct bt_clock_class_priority_map *orig_cc_prio_map)
+{
+ struct bt_clock_class_priority_map *cc_prio_map;
+ size_t i;
+
+ cc_prio_map = bt_clock_class_priority_map_create();
+ if (!cc_prio_map) {
+ goto error;
+ }
+
+ for (i = 0; i < orig_cc_prio_map->entries->len; i++) {
+ struct bt_ctf_clock_class *clock_class =
+ g_ptr_array_index(orig_cc_prio_map->entries, i);
+ uint64_t *prio = g_hash_table_lookup(orig_cc_prio_map->prios,
+ clock_class);
+ int ret = bt_clock_class_priority_map_add_clock_class(
+ cc_prio_map, clock_class, *prio);
+
+ if (ret) {
+ goto error;
+ }
+ }
+
+ cc_prio_map->highest_prio_cc = orig_cc_prio_map->highest_prio_cc;
+ goto end;
+
+error:
+ BT_PUT(cc_prio_map);
+
+end:
+ return cc_prio_map;
+}