lib: resource-monitor: Add pass_resource_monitor_is_resource_attr_set 27/279427/4
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 20 Jul 2022 08:53:37 +0000 (17:53 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Thu, 11 Aug 2022 08:54:40 +0000 (17:54 +0900)
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 <cw00.choi@samsung.com>
include/util/request.h
lib/resource-monitor/resource-monitor.c
lib/resource-monitor/resource-monitor.h
src/monitor/request-handler.c
tests/integration-test/resource-monitor-tests.cpp

index 6f7bfa7aa9bb55f372d22ddba0654bcb1bde172f..f33640beee924003995d31e7399dd740eb9a1fd2 100644 (file)
@@ -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,
 };
 
index 62e42cf622b4dbcb9053c99bc272944baaa2a73f..b3c22c1fa3e5aa58ba7d43b1223984bb77239558 100644 (file)
@@ -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)
 {
index 97b11e04f46e6ca2a25228d01ff92e481ee20021..b32c452f358ad6ff675a01b9fe4c7422262945fc 100644 (file)
@@ -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);
 
index 2074fded438dfb22a181e64a16e79e55a23a1ad9..2497a15eec96ca2e03c4159cd2934a64a221edb9 100644 (file)
@@ -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:
index 8c87b27af3a2c8c3c88695be5455c9e1f555c4d8..9435295680027392852c054bb380cab092332902 100644 (file)
@@ -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<struct resource_attr_info> 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<struct resource_attr_info> attrs)
 {