From 4a512e75f455ca7c095c07a020cd77a3f04a1e22 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Tue, 17 Mar 2015 17:19:56 -0400 Subject: [PATCH] objects: introduce enum bt_object_status MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Those new statuses make it possible for bt_object_map_foreach() to report if its loop was cancelled by the user function or if a general error occured. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- include/babeltrace/objects.h | 35 +++++++++++++++++++++++++++++------ lib/objects.c | 5 +++-- tests/lib/test_bt_objects.c | 11 +++++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/include/babeltrace/objects.h b/include/babeltrace/objects.h index f030424f2..3d02b2571 100644 --- a/include/babeltrace/objects.h +++ b/include/babeltrace/objects.h @@ -161,6 +161,20 @@ enum bt_object_type { BT_OBJECT_TYPE_MAP = 6, }; +/** + * Status (return value of some functions). + */ +enum bt_object_status { + /** Operation cancelled. */ + BT_OBJECT_STATUS_CANCELLED = -2, + + /** Error. */ + BT_OBJECT_STATUS_ERROR = -1, + + /** Okay, no error. */ + BT_OBJECT_STATUS_OK = 0, +}; + /** * Object. */ @@ -716,12 +730,21 @@ extern struct bt_object *bt_object_map_get(const struct bt_object *map_obj, * @param map_obj Map object * @param cb User function to call back * @param data User data passed to the user function - * @returns 0 on success, or a negative value on error - * (the user function breaking the loop is \b not - * considered an error here) - */ -extern int bt_object_map_foreach(const struct bt_object *map_obj, - bt_object_map_foreach_cb cb, void *data); + * @returns \link bt_object_status::BT_OBJECT_STATUS_OK + * BT_OBJECT_STATUS_OK\endlink if + * there's no error and the traversal was not + * cancelled by the user function, + * \link bt_object_status::BT_OBJECT_STATUS_CANCELLED + * BT_OBJECT_STATUS_CANCELLED\endlink + * if the function was cancelled by the user + * function, or + * \link bt_object_status::BT_OBJECT_STATUS_ERROR + * BT_OBJECT_STATUS_ERROR\endlink on + * any other error + */ +extern enum bt_object_status bt_object_map_foreach( + const struct bt_object *map_obj, bt_object_map_foreach_cb cb, + void *data); /** * Returns whether or not the map object \p map_obj contains the diff --git a/lib/objects.c b/lib/objects.c index 1439b4d48..f59d84dc1 100644 --- a/lib/objects.c +++ b/lib/objects.c @@ -1043,13 +1043,13 @@ int bt_object_map_insert_map(struct bt_object *map_obj, int bt_object_map_foreach(const struct bt_object *map_obj, bt_object_map_foreach_cb cb, void *data) { - int ret = 0; + enum bt_object_status ret = BT_OBJECT_STATUS_OK; gpointer key, element_obj; GHashTableIter iter; struct bt_object_map *typed_map_obj = BT_OBJECT_TO_MAP(map_obj); if (!map_obj || !bt_object_is_map(map_obj) || !cb) { - ret = -1; + ret = BT_OBJECT_STATUS_ERROR; goto end; } @@ -1059,6 +1059,7 @@ int bt_object_map_foreach(const struct bt_object *map_obj, const char *key_str = g_quark_to_string((unsigned long) key); if (!cb(key_str, element_obj, data)) { + ret = BT_OBJECT_STATUS_CANCELLED; break; } } diff --git a/tests/lib/test_bt_objects.c b/tests/lib/test_bt_objects.c index 1589057d1..07774e456 100644 --- a/tests/lib/test_bt_objects.c +++ b/tests/lib/test_bt_objects.c @@ -668,17 +668,20 @@ void test_map(void) "map object has key \"map2\""); ret = bt_object_map_foreach(NULL, test_map_foreach_cb_count, &count); - ok(ret, "bt_object_map_foreach() fails with a map object set to NULL"); + ok(ret == BT_OBJECT_STATUS_ERROR, + "bt_object_map_foreach() fails with a map object set to NULL"); ret = bt_object_map_foreach(map_obj, NULL, &count); - ok(ret, "bt_object_map_foreach() fails with a user function set to NULL"); + ok(ret == BT_OBJECT_STATUS_ERROR, + "bt_object_map_foreach() fails with a user function set to NULL"); ret = bt_object_map_foreach(map_obj, test_map_foreach_cb_count, &count); - ok(!ret && count == 3, + ok(ret == BT_OBJECT_STATUS_CANCELLED && count == 3, "bt_object_map_foreach() breaks the loop when the user function returns false"); memset(&checklist, 0, sizeof(checklist)); ret = bt_object_map_foreach(map_obj, test_map_foreach_cb_check, &checklist); - ok(!ret, "bt_object_map_foreach() succeeds with test_map_foreach_cb_check()"); + ok(ret == BT_OBJECT_STATUS_OK, + "bt_object_map_foreach() succeeds with test_map_foreach_cb_check()"); ok(checklist.bool1 && checklist.int1 && checklist.float1 && checklist.null1 && checklist.bool2 && checklist.int2 && checklist.float2 && checklist.string2 && -- 2.34.1