resource-manager: Add new getter with user data 87/297587/5
authorChanwoo Choi <cw00.choi@samsung.com>
Mon, 21 Aug 2023 09:03:45 +0000 (18:03 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Tue, 22 Aug 2023 01:06:53 +0000 (10:06 +0900)
Until now, getter function has only passed the data to get the data
without any other arguments. But, it has the constraint which is not
able to pass the user data and then get the data.

So thet add new following getter funciton with passed user data:
- int syscommon_resman_get_resource_attr_uint64_with_1_user_data(
int resource_id, u_int64_t attr_id,
u_int64_t *user_data1,
u_int64_t *data);
  : This function is able to pass the one user data in order to get data
  from resource attirbute.
  : SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA data type
  should be used for this new getter function.

- int syscommon_resman_get_resource_attr_uint64_with_2_user_data(
int resource_id, u_int64_t attr_id,
u_int64_t *user_data1, u_int64_t *user_data2,
u_int64_t *data);
  : This function is able to pass the two user data in order to get data
  from resource attirbute.
  : SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA data type
  should be used for this new getter function.

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

index c7bb4357204dd8ac9739c723fea25dcaad0e618c..838895d907b99518311bad7e1669e5bb27bac672 100644 (file)
@@ -67,6 +67,13 @@ struct syscommon_resman_resource_attribute_ops {
        int (*get)(int resource_id,
                   const struct syscommon_resman_resource_attribute *attr,
                   void *data);
+       int (*get_with_1_user_data)(int resource_id,
+                  const struct syscommon_resman_resource_attribute *attr,
+                  void *user_data1, int user_count1, void *data);
+       int (*get_with_2_user_data)(int resource_id,
+                  const struct syscommon_resman_resource_attribute *attr,
+                  void *user_data1, void *user_data2,
+                  int user_count1, int user_count2, void *data);
        /*
         * If .is_supported ops is not implemented, use .get ops in order to
         * check whether the resource attribute is supported or not.
@@ -205,6 +212,10 @@ int syscommon_resman_get_resource_attr_int(int resource_id, u_int64_t attr_id, i
 int syscommon_resman_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data);
 int syscommon_resman_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data);
 int syscommon_resman_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data);
+int syscommon_resman_get_resource_attr_uint64_with_1_user_data(int resource_id, u_int64_t attr_id,
+                                       u_int64_t *user_data1, u_int64_t *data);
+int syscommon_resman_get_resource_attr_uint64_with_2_user_data(int resource_id, u_int64_t attr_id,
+                                       u_int64_t *user_data1, u_int64_t *user_data2, u_int64_t *data);
 int syscommon_resman_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data);
 int syscommon_resman_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data);
 int syscommon_resman_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data);
index abb460a092d62c8fc21ff7391f1f9cb62ab3a728..b2f98bab9c11093ecc7b13ec198ec99bb70878f0 100644 (file)
@@ -39,6 +39,10 @@ enum syscommon_resman_data_type {
        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_UINT64_WITH_1_USER_DATA,
+       SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA,
+
        SYSCOMMON_RESMAN_DATA_TYPE_NUM
 };
 
index 95d5bd3c59d9913b215a8d89129cba28239526fd..62dddca0f49990a61fd671dd7c1ffa91abaee746 100644 (file)
@@ -476,6 +476,70 @@ update_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_
        return 0;
 }
 
+static int
+update_resource_attr_with_1_user_data(struct syscommon_resman_resource *resource, u_int64_t attr_id,
+                                       u_int64_t *user_data1, int user_count1)
+{
+       int attr_index;
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       struct syscommon_resman_resource_attribute_value *attr_value = NULL;
+       int ret;
+
+       if (!resource || attr_id == 0)
+               return -EINVAL;
+
+       attr_index = RESOURCE_ATTR_INDEX(attr_id);
+       if (attr_index >= resource->num_attrs)
+               return -EINVAL;
+
+       attr = &resource->attrs[attr_index];
+
+       if (!attr->ops.get)
+               return -EINVAL;
+
+       attr_value = &resource->attrs_value[attr_index];
+
+       ret = attr->ops.get_with_1_user_data(resource->id, attr,
+                               user_data1, user_count1, attr_value->data);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static int
+update_resource_attr_with_2_user_data(struct syscommon_resman_resource *resource, u_int64_t attr_id,
+                                       u_int64_t *user_data1, u_int64_t *user_data2,
+                                       int user_count1, int user_count2)
+{
+       int attr_index;
+       const struct syscommon_resman_resource_attribute *attr = NULL;
+       struct syscommon_resman_resource_attribute_value *attr_value = NULL;
+       int ret;
+
+       if (!resource || attr_id == 0)
+               return -EINVAL;
+
+       attr_index = RESOURCE_ATTR_INDEX(attr_id);
+       if (attr_index >= resource->num_attrs)
+               return -EINVAL;
+
+       attr = &resource->attrs[attr_index];
+
+       if (!attr->ops.get)
+               return -EINVAL;
+
+       attr_value = &resource->attrs_value[attr_index];
+
+       ret = attr->ops.get_with_2_user_data(resource->id, attr,
+                               user_data1, user_data2,
+                               user_count1, user_count2, attr_value->data);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 static int
 monitor_update_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id)
 {
@@ -1042,6 +1106,8 @@ get_resource_attr_value_data(struct syscommon_resman_resource *resource, u_int64
                *(u_int32_t *) data = *((u_int32_t *)attr_value->data);
                break;
        case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
+       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA:
+       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA:
                *(u_int64_t *) data = *((u_int64_t *)attr_value->data);
                break;
        case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
@@ -1129,6 +1195,38 @@ syscommon_resman_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_
        return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64, data);
 }
 
+int
+syscommon_resman_get_resource_attr_uint64_with_1_user_data(int resource_id, u_int64_t attr_id, u_int64_t *user_data1, u_int64_t *data)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+       int ret;
+
+       if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
+               return -EINVAL;
+
+       ret = update_resource_attr_with_1_user_data(resource, attr_id, user_data1, 1);
+       if (ret < 0)
+               return ret;
+
+       return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA, data);
+}
+
+int
+syscommon_resman_get_resource_attr_uint64_with_2_user_data(int resource_id, u_int64_t attr_id, u_int64_t *user_data1, u_int64_t *user_data2, u_int64_t *data)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+       int ret;
+
+       if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
+               return -EINVAL;
+
+       ret = update_resource_attr_with_2_user_data(resource, attr_id, user_data1, user_data2, 1, 1);
+       if (ret < 0)
+               return ret;
+
+       return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA, data);
+}
+
 int
 syscommon_resman_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data)
 {
@@ -1656,6 +1754,8 @@ set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t
                                attr_value->data = calloc(1, sizeof(u_int32_t));
                                break;
                        case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
+                       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA:
+                       case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA:
                                attr_value->data = calloc(1, sizeof(u_int64_t));
                                break;
                        case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE: