resource-manager: Add N-tuple setter to pass multiple parameter 28/296628/6 accepted/tizen/unified/20230803.174812 accepted/tizen/unified/20230809.071927
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 2 Aug 2023 08:26:17 +0000 (17:26 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Thu, 3 Aug 2023 01:12:05 +0000 (10:12 +0900)
Add N-tuple setter function of resource manager to support the case
of when some attribute requires the multi paramters as setter.

[Newly added setter of resource-manager]
- int syscommon_resman_set_resource_attr_uint64_2(
int resource_id, u_int64_t attr_id,
u_int64_t data1, u_int64_t data2)
 : It pass the two parameter to the specific attribute which requires
   the two parameter as setter.

- int syscommon_resman_set_resource_attr_uint64_3(
int resource_id, u_int64_t attr_id,
u_int64_t data1, u_int64_t data2, u_int64_t data3)
 : It pass the three parameter to the specific attribute which requires
   the three parameter as setter.

- int syscommon_resman_set_resource_attr_uint64_4(
int resource_id, u_int64_t attr_id,
u_int64_t data1, u_int64_t data2, u_int64_t data3, u_int64_t data4)
 : It pass the four parameter to the specific attribute which requires
   the four parameter as setter.

[Newly added data type of resource manager]
- SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64
 : This data type include the two of u_int64 data type
- SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64
 : This data type include the three of u_int64 data type
- SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64_UINT64
 : This data type include the four of u_int64 data type

Change-Id: I8c659e5a9f5447e7aecb17c71005e5fa939960e8
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
include/libsyscommon/resource-manager.h
include/libsyscommon/resource-type.h
src/resource-manager/resource-manager.c

index 1df9244..ddf70b4 100644 (file)
@@ -52,6 +52,18 @@ struct syscommon_resman_resource_attribute_ops {
        int (*set)(int resource_id,
                        const struct syscommon_resman_resource_attribute *attr,
                        const void *data, int count);
+       int (*set_2_tuple)(int resource_id,
+                       const struct syscommon_resman_resource_attribute *attr,
+                       const void *data1, const void *data2,
+                       int count1, int count2);
+       int (*set_3_tuple)(int resource_id,
+                       const struct syscommon_resman_resource_attribute *attr,
+                       const void *data1, const void *data2, const void *data3,
+                       int count1, int count2, int count3);
+       int (*set_4_tuple)(int resource_id,
+                       const struct syscommon_resman_resource_attribute *attr,
+                       const void *data1, const void *data2, const void *data3, const void *data4,
+                       int count1, int count2, int count3, int count4);
        int (*get)(int resource_id,
                   const struct syscommon_resman_resource_attribute *attr,
                   void *data);
@@ -207,6 +219,13 @@ int syscommon_resman_set_resource_attr_string(int resource_id, u_int64_t attr_id
 int syscommon_resman_set_resource_attr_array(int resource_id, u_int64_t attr_id, void *data, int count);
 int syscommon_resman_set_resource_attr_ptr(int resource_id, u_int64_t attr_id, void *data);
 
+int syscommon_resman_set_resource_attr_uint64_2(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2);
+int syscommon_resman_set_resource_attr_uint64_3(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2, u_int64_t data3);
+int syscommon_resman_set_resource_attr_uint64_4(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2, u_int64_t data3, u_int64_t data4);
+
 int syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask);
 int syscommon_resman_unset_resource_attr_interest(int resource_id, u_int64_t interest_mask);
 bool syscommon_resman_is_resource_attr_interested(int resource_id, u_int64_t interest_mask);
index 5aa3608..abb460a 100644 (file)
@@ -35,6 +35,10 @@ enum syscommon_resman_data_type {
        SYSCOMMON_RESMAN_DATA_TYPE_ARRAY,
        SYSCOMMON_RESMAN_DATA_TYPE_PTR,
        SYSCOMMON_RESMAN_DATA_TYPE_BOOLEAN,
+
+       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64,
+       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64,
+       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64_UINT64,
        SYSCOMMON_RESMAN_DATA_TYPE_NUM
 };
 
index c1662d6..79c1daa 100644 (file)
@@ -1302,6 +1302,116 @@ set_resource_attr_value_data(struct syscommon_resman_resource *resource,
        return 0;
 }
 
+static int
+set_resource_attr_value_data_2_tuple(struct syscommon_resman_resource *resource,
+       u_int64_t attr_id, enum syscommon_resman_data_type type,
+       const void *data1, const void *data2,
+       int count1, int count2)
+{
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       int ret;
+
+       if (!data1 || !data2)
+               return -EINVAL;
+
+       if (!check_attr_validate(resource, attr_id, type))
+               return -EINVAL;
+
+       attr = get_resource_attr(resource, attr_id);
+       if (!attr)
+               return -EINVAL;
+
+       if (!attr->ops.set_2_tuple)
+               return -ENOTSUP;
+
+       ret = attr->ops.set_2_tuple(resource->id, attr,
+                                       data1, data2, count1, count2);
+       if (ret < 0)
+               return ret;
+
+       /**
+        * FIXME: N-tuple data doesn't support the getter temporarily.
+        * So that don't store the passed data to attr_value.
+        * I will be implemented for getter on later.
+        */
+
+       return 0;
+}
+
+static int
+set_resource_attr_value_data_3_tuple(struct syscommon_resman_resource *resource,
+       u_int64_t attr_id, enum syscommon_resman_data_type type,
+       const void *data1, const void *data2, const void *data3,
+       int count1, int count2, int count3)
+{
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       int ret;
+
+       if (!data1 || !data2 || !data3)
+               return -EINVAL;
+
+       if (!check_attr_validate(resource, attr_id, type))
+               return -EINVAL;
+
+       attr = get_resource_attr(resource, attr_id);
+       if (!attr)
+               return -EINVAL;
+
+       if (!attr->ops.set_3_tuple)
+               return -ENOTSUP;
+
+       ret = attr->ops.set_3_tuple(resource->id, attr,
+                                       data1, data2, data3,
+                                       count1, count2, count3);
+       if (ret < 0)
+               return ret;
+
+       /**
+        * FIXME: N-tuple data doesn't support the getter temporarily.
+        * So that don't store the passed data to attr_value.
+        * I will be implemented for getter on later.
+        */
+
+       return 0;
+}
+
+static int
+set_resource_attr_value_data_4_tuple(struct syscommon_resman_resource *resource,
+       u_int64_t attr_id, enum syscommon_resman_data_type type,
+       const void *data1, const void *data2, const void *data3, const void *data4,
+       int count1, int count2, int count3, int count4)
+{
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       int ret;
+
+       if (!data1 || !data2 || !data3 || !data4)
+               return -EINVAL;
+
+       if (!check_attr_validate(resource, attr_id, type))
+               return -EINVAL;
+
+       attr = get_resource_attr(resource, attr_id);
+       if (!attr)
+               return -EINVAL;
+
+       if (!attr->ops.set_4_tuple)
+               return -ENOTSUP;
+
+       ret = attr->ops.set_4_tuple(resource->id, attr,
+                                       data1, data2, data3, data4,
+                                       count1, count2, count3, count4);
+       if (ret < 0)
+               return ret;
+
+       /**
+        * FIXME: N-tuple data doesn't support the getter temporarily.
+        * So that don't store the passed data to attr_value.
+        * I will be implemented for getter on later.
+        */
+
+       return 0;
+}
+
 int
 syscommon_resman_set_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t data)
 {
@@ -1390,6 +1500,48 @@ syscommon_resman_set_resource_attr_ptr(int resource_id, u_int64_t attr_id, void
        return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, &data, 1);
 }
 
+int
+syscommon_resman_set_resource_attr_uint64_2(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+
+       if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
+               return -EINVAL;
+
+       return set_resource_attr_value_data_2_tuple(resource, attr_id,
+                                       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64,
+                                       &data1, &data2, 1, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_uint64_3(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2, u_int64_t data3)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+
+       if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
+               return -EINVAL;
+
+       return set_resource_attr_value_data_3_tuple(resource, attr_id,
+                                       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64,
+                                       &data1, &data2, &data3, 1, 1, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_uint64_4(int resource_id, u_int64_t attr_id,
+                                       u_int64_t data1, u_int64_t data2, u_int64_t data3, u_int64_t data4)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+
+       if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
+               return -EINVAL;
+
+       return set_resource_attr_value_data_4_tuple(resource, attr_id,
+                                       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64_UINT64,
+                                       &data1, &data2, &data3, &data4, 1, 1, 1, 1);
+}
+
 static inline bool
 is_resource_attr_visible(struct syscommon_resman_resource *resource,
                         const struct syscommon_resman_resource_attribute *attr)
@@ -1412,6 +1564,7 @@ set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t
        struct syscommon_resman_resource_attribute_value *attr_value;
        int i, ret;
        bool supported;
+       bool setter_only = false;
 
        if (!resource)
                return -EINVAL;
@@ -1474,12 +1627,23 @@ set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t
                        case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
                                attr_value->data = calloc(1, sizeof(struct syscommon_resman_array_value));
                                break;
+                       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64:
+                       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64:
+                       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_UINT64_UINT64_UINT64:
+                               /**
+                                * FIXME: N-tuple data doesn't support the getter temporarily.
+                                * Don't store the passed data to attr_value.
+                                * So that don't allocate the memory for attr_value->data.
+                                * I will be implemented on later.
+                                */
+                               setter_only = true;
+                               break;
                        default:
                                ret = -EINVAL;
                                goto err;
                        }
 
-                       if (!attr_value->data) {
+                       if (!setter_only && !attr_value->data) {
                                ret = -ENOMEM;
                                goto err;
                        }