From 826ca1bdc99fd4b22f586c7498b9c88fe53cf5a1 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 20 Jul 2022 17:53:37 +0900 Subject: [PATCH] lib: resource-monitor: Add pass_resource_monitor_is_resource_attr_set Provide pass_resource_monitor_is_resource_attr_set function to check whether some attributes are set or not. And fix the comment of pass_resource_monitor_is_resource_attr_supported. Change-Id: I3b1372ecc1138d2244da66e79745ca6454ff67eb Signed-off-by: Chanwoo Choi --- include/util/request.h | 1 + lib/resource-monitor/resource-monitor.c | 16 +++++ lib/resource-monitor/resource-monitor.h | 13 +++- src/monitor/request-handler.c | 4 ++ .../resource-monitor-tests.cpp | 59 +++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/include/util/request.h b/include/util/request.h index 6f7bfa7..f33640b 100644 --- a/include/util/request.h +++ b/include/util/request.h @@ -46,6 +46,7 @@ enum { REQUEST_GET_VALUE_ARRAY, REQUEST_GET_RESOURCE_TS, REQUEST_GET_RESOURCE_LIST_JSON, + REQUEST_IS_RESOURCE_ATTR_SET, REQUEST_MAX, }; diff --git a/lib/resource-monitor/resource-monitor.c b/lib/resource-monitor/resource-monitor.c index 62e42cf..b3c22c1 100644 --- a/lib/resource-monitor/resource-monitor.c +++ b/lib/resource-monitor/resource-monitor.c @@ -154,6 +154,7 @@ static inline int handle_request(struct request_data *data) break; case REQUEST_SET_RESOURCE_ATTR: case REQUEST_UNSET_RESOURCE_ATTR: + case REQUEST_IS_RESOURCE_ATTR_SET: buffer_len = sprintf(buffer, "%d$%d$%"PRIu64, data->request, data->resource_id, data->attr_mask); break; @@ -421,6 +422,21 @@ bool pass_resource_monitor_is_resource_attr_supported(int id, int resource_id, u return (ret < 0) ? false : (bool)ret; } +EXPORT +bool pass_resource_monitor_is_resource_attr_set(int id, int resource_id, u_int64_t attr_mask) +{ + struct request_data request = { + .request = REQUEST_IS_RESOURCE_ATTR_SET, + .client_id = id, + .resource_id = resource_id, + .attr_mask = attr_mask, + }; + int ret; + + ret = handle_request(&request); + return (ret < 0) ? false : (bool)ret; +} + EXPORT int pass_resource_monitor_update(int id) { diff --git a/lib/resource-monitor/resource-monitor.h b/lib/resource-monitor/resource-monitor.h index 97b11e0..b32c452 100644 --- a/lib/resource-monitor/resource-monitor.h +++ b/lib/resource-monitor/resource-monitor.h @@ -232,11 +232,20 @@ int pass_resource_monitor_set_resource_attr(int id, int resource_id, u_int64_t a int pass_resource_monitor_unset_resource_attr(int id, int resource_id, u_int64_t attr_mask); /** - * @brief Check whether a resouce attribute is supported or not + * @brief Check whether a resource attributes are interested or not + * @param[in] Resource monitor id + * @param[in] Resource id + * @param[in] Attribute mask including the various attributes + * @return @c true on success, otherwise false + */ +bool pass_resource_monitor_is_resource_attr_set(int id, int resource_id, u_int64_t attr_mask); + +/** + * @brief Check whether a resource attribute is supported or not * @param[in] Resource monitor id * @param[in] Resource id * @param[in] Resource attribute id - * @return @c 0 on success, otherwise a negative error value + * @return @c true on success, otherwise false */ bool pass_resource_monitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id); diff --git a/src/monitor/request-handler.c b/src/monitor/request-handler.c index 2074fde..2497a15 100644 --- a/src/monitor/request-handler.c +++ b/src/monitor/request-handler.c @@ -240,6 +240,9 @@ static int handle_request_set_resource_attr(struct request_client *client, char client->socket_fd, get_resource_name(res), resource_id); break; + case REQUEST_IS_RESOURCE_ATTR_SET: + ret = (int)is_resource_attr_interested(res, interest_masks); + break; default: return -EINVAL; } @@ -766,6 +769,7 @@ static int handle_request(struct request_client *client, char *request) break; case REQUEST_SET_RESOURCE_ATTR: case REQUEST_UNSET_RESOURCE_ATTR: + case REQUEST_IS_RESOURCE_ATTR_SET: ret = handle_request_set_resource_attr(client, args, request_type); break; case REQUEST_IS_RESOURCE_ATTR_SUPPORTED: diff --git a/tests/integration-test/resource-monitor-tests.cpp b/tests/integration-test/resource-monitor-tests.cpp index 8c87b27..9435295 100644 --- a/tests/integration-test/resource-monitor-tests.cpp +++ b/tests/integration-test/resource-monitor-tests.cpp @@ -483,6 +483,28 @@ static int __pass_resource_monitor_unset_resource_attr(int mon_id, int res_id, i return ret; } +static bool __pass_resource_monitor_is_resource_attr_set(int mon_id, int res_id, int num_attrs, + std::vector attrs) +{ + int i, ret; + u_int64_t mask = 0; + + for (i = 0; i < num_attrs; i++) { + bool supported = pass_resource_monitor_is_resource_attr_supported( + mon_id, res_id, attrs[i].attr_id); + if (supported) + mask |= attrs[i].attr_id; + } + + ret = pass_resource_monitor_set_resource_attr(mon_id, res_id, mask); + EXPECT_EQ(ret, 0); + + bool set = pass_resource_monitor_is_resource_attr_set(mon_id, res_id, mask); + EXPECT_EQ(set, true); + + return set; +} + TEST_P(PhysicalResourceMonitorTest, pass_resource_monitor_set_resource_attr) { auto res = GetParam(); @@ -608,6 +630,43 @@ TEST_P(PhysicalResourceMonitorTest, pass_resource_monitor_unset_resource_attr_in EXPECT_EQ(ret, 0); } +TEST_P(PhysicalResourceMonitorTest, pass_resource_monitor_is_resource_attr_set) +{ + auto res = GetParam(); + int i; + + res.mon_id = pass_resource_monitor_init(); + ASSERT_TRUE(res.mon_id > 0); + + int ret = pass_resource_monitor_get_resource_count(res.mon_id, res.type, &res.count); + EXPECT_EQ(ret, 0); + + for (i = 0; i < res.count; i++) { + res.res_id = pass_resource_monitor_create_resource(res.mon_id, res.type); + EXPECT_TRUE(res.res_id >= 0); + + ret = pass_resource_monitor_set_resource_ctrl(res.mon_id, res.res_id, + res.ctrl_id, i); + if (res.ctrl_id > 0) + EXPECT_EQ(ret, 0); + else + EXPECT_NE(ret, 0); + + /* Test pass_resource_monitor_is_resource_attr_set */ + bool set = __pass_resource_monitor_is_resource_attr_set(res.mon_id, + res.res_id, + res.num_attrs, + res.attrs); + EXPECT_EQ(set, true); + + ret = pass_resource_monitor_delete_resource(res.mon_id, res.res_id); + EXPECT_EQ(ret, 0); + } + + ret = pass_resource_monitor_exit(res.mon_id); + EXPECT_EQ(ret, 0); +} + static int __pass_resource_monitor_get_value(int mon_id, int res_id, int num_attrs, std::vector attrs) { -- 2.34.1