Add bt_clock_class_priority_map_copy()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Wed, 26 Apr 2017 01:24:43 +0000 (21:24 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:41 +0000 (12:57 -0400)
Because bt_notification_event_create() and
bt_notification_inactivity_create() freeze their clock class priority
map on success, this utility should prove useful for components which
need to dynamically add clock classes.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/babeltrace/graph/clock-class-priority-map-internal.h
include/babeltrace/graph/clock-class-priority-map.h
lib/graph/clock-class-priority-map.c
tests/lib/test_cc_prio_map.c

index 3cba2bb9ce2b84bc68f7686f1d2cc45f11ab2942..049421458c0d7b64d551adff169e157b31a316f1 100644 (file)
@@ -40,7 +40,7 @@ struct bt_clock_class_priority_map {
        /* Array of struct bt_ctf_clock_class *, owned by this */
        GPtrArray *entries;
 
-       /* struct bt_ctf_clock_class * (weak) to priority (uint64_t) */
+       /* struct bt_ctf_clock_class * (weak) to priority (uint64_t *) */
        GHashTable *prios;
 
        /* Clock class (weak) with the currently highest priority */
index 575e31c176c74848601227ba2460c92deb7308fd..95d3168ba0cecc975921d4388ea3b7d9ddc07f4e 100644 (file)
@@ -280,6 +280,27 @@ extern int bt_clock_class_priority_map_add_clock_class(
                struct bt_clock_class_priority_map *clock_class_priority_map,
                struct bt_ctf_clock_class *clock_class, uint64_t priority);
 
+/**
+@brief Creates a copy of the clock class priority map
+       \p clock_class_priority_map.
+
+You can copy a frozen clock class priority map: the resulting copy is
+<em>not frozen</em>.
+
+@param[in] clock_class_priority_map    Clock class priority map to copy.
+@returns                               Copy of \p clock_class_priority_map
+                                       on success, or a negative value
+                                       on error.
+
+@prenotnull{clock_class_priority_map}
+@postrefcountsame{clock_class_priority_map}
+@postsuccessrefcountret1
+@post <strong>On success</strong>, the returned clock class priority map
+       is not frozen.
+*/
+extern struct bt_clock_class_priority_map *bt_clock_class_priority_map_copy(
+               struct bt_clock_class_priority_map *clock_class_priority_map);
+
 /** @} */
 
 #ifdef __cplusplus
index 136ed276de4a11c1ff8532948634a34fa3715d80..2d4fac11937037dc6bda3e233b711f8d87b36d4b 100644 (file)
@@ -265,3 +265,37 @@ end:
 
        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;
+}
index c883815c18b1aa42f943941ade7a4772dba4b7f4..23305c2abff9e840a26d34a6a66808c8b6cc6dec 100644 (file)
 
 #include "tap/tap.h"
 
-#define NR_TESTS       13
+#define NR_TESTS       18
 
 static void test_clock_class_priority_map(void)
 {
        struct bt_clock_class_priority_map *cc_prio_map;
+       struct bt_clock_class_priority_map *cc_prio_map_copy;
        struct bt_ctf_clock_class *cc1;
        struct bt_ctf_clock_class *cc2;
        struct bt_ctf_clock_class *cc3;
@@ -83,12 +84,30 @@ static void test_clock_class_priority_map(void)
        assert(ret == 0);
        ok(prio == 11,
                "bt_clock_class_priority_map_get_clock_class_priority() returns the expected priority (3)");
-
+       cc_prio_map_copy = bt_clock_class_priority_map_copy(cc_prio_map);
+       ok(cc_prio_map_copy, "bt_clock_class_priority_map_copy() succeeds");
+       ret = bt_clock_class_priority_map_get_clock_class_priority(cc_prio_map_copy, cc1, &prio);
+       assert(ret == 0);
+       ok(prio == 1001,
+               "bt_clock_class_priority_map_get_clock_class_priority() returns the expected priority (1, copy)");
+       ret = bt_clock_class_priority_map_get_clock_class_priority(cc_prio_map_copy, cc2, &prio);
+       assert(ret == 0);
+       ok(prio == 75,
+               "bt_clock_class_priority_map_get_clock_class_priority() returns the expected priority (2, copy)");
+       ret = bt_clock_class_priority_map_get_clock_class_priority(cc_prio_map_copy, cc3, &prio);
+       assert(ret == 0);
+       ok(prio == 11,
+               "bt_clock_class_priority_map_get_clock_class_priority() returns the expected priority (3, copy)");
+       cc = bt_clock_class_priority_map_get_highest_priority_clock_class(cc_prio_map_copy);
+       ok(cc == cc3,
+               "bt_clock_class_priority_map_get_highest_priority_clock_class() returns the expected clock class (3, copy)");
        BT_PUT(cc);
+
        BT_PUT(cc3);
        BT_PUT(cc2);
        BT_PUT(cc1);
        BT_PUT(cc_prio_map);
+       BT_PUT(cc_prio_map_copy);
 }
 
 int main(int argc, char **argv)
This page took 0.026226 seconds and 4 git commands to generate.