resource-manager: Introduce attribute setter 82/288382/6
authorYoungjae Cho <y0.cho@samsung.com>
Thu, 16 Feb 2023 04:44:03 +0000 (13:44 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Thu, 9 Mar 2023 04:30:34 +0000 (13:30 +0900)
The setter is only allowed for resource type of INSTANCE_TYPE_NORMAL.
- syscommon_resman_set_resource_attr_int()
- syscommon_resman_set_resource_attr_int64()
- syscommon_resman_set_resource_attr_uint()
- syscommon_resman_set_resource_attr_uint64()
- syscommon_resman_set_resource_attr_double()
- syscommon_resman_set_resource_attr_string()
- syscommon_resman_set_resource_attr_array()
- syscommon_resman_set_resource_attr_ptr()

Change-Id: I0e30425c35ec6df9660ef3c57a5ecd6a5769e1dd
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/resource-manager/resource-manager.c
src/resource-manager/resource-manager.h

index 00c1dca..b3f3b9d 100644 (file)
@@ -1173,6 +1173,155 @@ syscommon_resman_monitor_get_resource_attr_ptr(int resource_id, u_int64_t attr_i
        return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, data);
 }
 
+static int
+set_resource_attr_value_data(struct syscommon_resman_resource *resource,
+       u_int64_t attr_id, enum syscommon_resman_data_type type, const void *data, int count)
+{
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       struct syscommon_resman_resource_attribute_value *attr_value = NULL;
+       int ret;
+
+       if (!data)
+               return -EINVAL;
+
+       if (!check_attr_validate(resource, attr_id, type))
+               return -EINVAL;
+
+       attr = get_resource_attr(resource, attr_id);
+       if (!attr || !attr->ops.get)
+               return -EINVAL;
+
+       attr_value = get_resource_attr_value(resource, attr_id);
+       if (!attr_value)
+               return -EINVAL;
+
+       ret = attr->ops.set(resource->id, attr, data, count);
+       if (ret < 0)
+               return ret;
+
+       /* TODO: We need to discuss about updating attr_value->data after ops.set() */
+       switch (type) {
+       case SYSCOMMON_RESMAN_DATA_TYPE_INT:
+               *((int32_t *) attr_value->data) = *(int32_t *) data;
+               break;
+       case  SYSCOMMON_RESMAN_DATA_TYPE_INT64:
+               *((int64_t *) attr_value->data) = *(int64_t *) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
+               *((u_int32_t *) attr_value->data) = *(u_int32_t *) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
+               *((u_int64_t *) attr_value->data) = *(u_int64_t *) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
+               *((double *) attr_value->data) = *(double *) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
+               strncpy((char *) attr_value->data, data, SYSCOMMON_RESMAN_BUFF_MAX);
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
+               attr_value->data = *(struct syscommon_resman_array_value **) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_PTR:
+               attr_value->data = *(void **) data;
+               break;
+       case SYSCOMMON_RESMAN_DATA_TYPE_BOOLEAN:
+       case SYSCOMMON_RESMAN_DATA_TYPE_NUM:
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int
+syscommon_resman_set_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_double(int resource_id, u_int64_t attr_id, double data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_string(int resource_id, u_int64_t attr_id, char data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING, &data, 1);
+}
+
+int
+syscommon_resman_set_resource_attr_array(int resource_id, u_int64_t attr_id, void *data, int count)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY, &data, count);
+}
+
+int
+syscommon_resman_set_resource_attr_ptr(int resource_id, u_int64_t attr_id, void *data)
+{
+       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(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, &data, 1);
+}
+
 static inline bool
 is_resource_attr_visible(struct syscommon_resman_resource *resource,
                         const struct syscommon_resman_resource_attribute *attr)
index 045d980..d89f08b 100644 (file)
@@ -196,6 +196,15 @@ int syscommon_resman_monitor_get_resource_attr_string(int resource_id, u_int64_t
 int syscommon_resman_monitor_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data);
 int syscommon_resman_monitor_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data);
 
+int syscommon_resman_set_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t data);
+int syscommon_resman_set_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t data);
+int syscommon_resman_set_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t data);
+int syscommon_resman_set_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t data);
+int syscommon_resman_set_resource_attr_double(int resource_id, u_int64_t attr_id, double data);
+int syscommon_resman_set_resource_attr_string(int resource_id, u_int64_t attr_id, char data);
+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_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);