From e45b4c9d5237fe2ca4a58f0a9c10bca253185e6f Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Mon, 21 Aug 2023 18:03:45 +0900 Subject: [PATCH] resource-manager: Add new getter with user data 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 --- include/libsyscommon/resource-manager.h | 11 +++ include/libsyscommon/resource-type.h | 4 + src/resource-manager/resource-manager.c | 100 ++++++++++++++++++++++++ 3 files changed, 115 insertions(+) diff --git a/include/libsyscommon/resource-manager.h b/include/libsyscommon/resource-manager.h index c7bb435..838895d 100644 --- a/include/libsyscommon/resource-manager.h +++ b/include/libsyscommon/resource-manager.h @@ -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); diff --git a/include/libsyscommon/resource-type.h b/include/libsyscommon/resource-type.h index abb460a..b2f98ba 100644 --- a/include/libsyscommon/resource-type.h +++ b/include/libsyscommon/resource-type.h @@ -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 }; diff --git a/src/resource-manager/resource-manager.c b/src/resource-manager/resource-manager.c index 95d5bd3..62dddca 100644 --- a/src/resource-manager/resource-manager.c +++ b/src/resource-manager/resource-manager.c @@ -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: -- 2.34.1