From 967a9c2659e6e90b60a7d9197135518260d8cc1a Mon Sep 17 00:00:00 2001 From: Youngjae Cho Date: Fri, 4 Nov 2022 14:45:16 +0900 Subject: [PATCH] resource-manager: operate based on resource id All operations provided by resource-manager now work based on resource "id" instead of resource "instance" itself. All resource "instances" are managed within libsyscommon and it only exposes their id. The resource-manager source code has been implemented based on the coding rule below. - An actual operating function has no prefix syscommon_resman_. It has internal linkage and takes actual resource instance as a parameter. e.g., get_resource_attr(struct syscommon_resman_resource *resource, ...) - A function exposed through header is prefixed with syscommon_resman_ and it takes resource id as a parameter. It locates resource instance using resource id and invokes matching function. e.g., syscommon_resman_get_resource_attr(int resource_id, ...) Change-Id: If82c58593b363433188bf01809dc57a242ede24f Signed-off-by: Youngjae Cho --- src/resource-manager/resource-manager.c | 353 +++++++++++++++++------- src/resource-manager/resource-manager.h | 99 +++---- 2 files changed, 288 insertions(+), 164 deletions(-) diff --git a/src/resource-manager/resource-manager.c b/src/resource-manager/resource-manager.c index 7faa87b..fca7743 100644 --- a/src/resource-manager/resource-manager.c +++ b/src/resource-manager/resource-manager.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "resource-manager.h" #include "resource-type.h" @@ -30,8 +32,116 @@ #define RESOURCE_ATTR_FLAG_VISIBILITY_MASK (SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PRIVATE \ | SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC) +struct syscommon_resman_resource { + char *name; + int id; + const struct syscommon_resman_resource_driver *driver; + int type; + + int num_attrs; + const struct syscommon_resman_resource_attribute *attrs; + struct syscommon_resman_resource_attribute_value *attrs_value; + int num_ctrls; + const struct syscommon_resman_resource_control *ctrls; + + u_int64_t flag; + + void *priv; + + u_int64_t attr_interest; + u_int64_t attr_supported; +}; + +static int unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask); +static bool is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask); static GList *g_resource_driver_head; +static GHashTable *g_resource_hash_table; + +static int clear_sign_bit(unsigned int val) +{ + return (int)((val << 1) >> 1); +} + +static int init_resource_id(void) +{ + int val; + struct timeval tv; + + gettimeofday(&tv, NULL); + val = tv.tv_sec * 1000 + tv.tv_usec / 1000; + return clear_sign_bit(val); +} + +static int alloc_resource_id(void) +{ + static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + static int resource_id = -1; + int ret; + + pthread_mutex_lock(&lock); + + if (resource_id < 0) + resource_id = init_resource_id(); + + ret = resource_id++; + clear_sign_bit(resource_id); + + pthread_mutex_unlock(&lock); + + return ret; +} + +static void free_resource(struct syscommon_resman_resource *resource) +{ + if (!resource->name) + free(resource->name); + if (!resource->attrs_value) + free(resource->attrs_value); + resource->attrs = NULL; + resource->num_attrs = 0; + + free(resource); +} + +static void delete_resource(void *data) +{ + struct syscommon_resman_resource *resource = (struct syscommon_resman_resource *) data; + + if (!resource) + return; + + if (resource->driver && resource->driver->ops.delete) + resource->driver->ops.delete(resource->id); + + unset_resource_attr_interest(resource, RESOURCE_ATTR_MASK); + + free_resource(resource); +} + +static int add_resource(struct syscommon_resman_resource *resource) +{ + if (!resource) + return -EINVAL; + + if (!g_resource_hash_table) { + g_resource_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, delete_resource); + if (!g_resource_hash_table) + return -ENOMEM; + } + + g_hash_table_insert(g_resource_hash_table, GINT_TO_POINTER(resource->id), resource); + + return 0; +} + +static struct syscommon_resman_resource * find_resource(int id) +{ + if (!g_resource_hash_table) + return NULL; + + return g_hash_table_lookup(g_resource_hash_table, GINT_TO_POINTER(id)); +} static gint __compare_resource_type(gconstpointer data, gconstpointer input) { @@ -78,41 +188,22 @@ syscommon_resman_remove_resource_driver(const struct syscommon_resman_resource_d g_list_remove(g_resource_driver_head, (gpointer)driver); } -static void do_delete_resource(struct syscommon_resman_resource *resource) +void syscommon_resman_delete_resource(int resource_id) { - if (!resource->name) - free(resource->name); - if (!resource->attrs_value) - free(resource->attrs_value); - resource->attrs = NULL; - resource->num_attrs = 0; - - free(resource); -} - -void -syscommon_resman_delete_resource(struct syscommon_resman_resource *resource) -{ - if (!resource) + if (!g_resource_hash_table) return; - if (resource->driver && resource->driver->ops.delete) - resource->driver->ops.delete(resource); - - syscommon_resman_unset_resource_attr_interest(resource, RESOURCE_ATTR_MASK); - - do_delete_resource(resource); + g_hash_table_remove(g_resource_hash_table, GINT_TO_POINTER(resource_id)); } int -syscommon_resman_create_resource(struct syscommon_resman_resource **res, - int resource_type) +syscommon_resman_create_resource(int *resource_id, int resource_type) { const struct syscommon_resman_resource_driver *driver = NULL; struct syscommon_resman_resource *resource = NULL; int i, ret; - if (!res) + if (!resource_id) return -EINVAL; driver = syscommon_resman_find_resource_driver(resource_type); @@ -123,6 +214,7 @@ syscommon_resman_create_resource(struct syscommon_resman_resource **res, if (!resource) return -ENOMEM; + resource->id = alloc_resource_id(); resource->type = resource_type; resource->name = g_strdup(driver->name); resource->driver = driver; @@ -131,10 +223,16 @@ syscommon_resman_create_resource(struct syscommon_resman_resource **res, resource->attrs_value = calloc(resource->num_attrs, sizeof(*resource->attrs_value)); if (!resource->attrs_value) { - do_delete_resource(resource); + free_resource(resource); return -ENOMEM; } + ret = add_resource(resource); + if (ret < 0) { + free_resource(resource); + return ret; + } + for (i = 0; i < resource->num_attrs; i++) resource->attrs_value[i].type = driver->attrs[i].type; @@ -143,22 +241,23 @@ syscommon_resman_create_resource(struct syscommon_resman_resource **res, resource->flag = SYSCOMMON_RESMAN_RESOURCE_FLAG_PRIVATE; if (driver->ops.create) { - ret = driver->ops.create(resource); + ret = driver->ops.create(resource->id); if (ret < 0) { - do_delete_resource(resource); + free_resource(resource); return ret; } } - *res = resource; + *resource_id = resource->id; return 0; } int -syscommon_resman_set_resource_flag(struct syscommon_resman_resource *resource, - u_int64_t flag_mask) +syscommon_resman_set_resource_flag(int resource_id, u_int64_t flag_mask) { + struct syscommon_resman_resource *resource = find_resource(resource_id); + if (!resource) return -EINVAL; @@ -167,12 +266,12 @@ syscommon_resman_set_resource_flag(struct syscommon_resman_resource *resource, } int -syscommon_resman_set_resource_control(struct syscommon_resman_resource *resource, - u_int64_t ctrl_id, const void *data) +syscommon_resman_set_resource_control(int resource_id, u_int64_t ctrl_id, const void *data) { const struct syscommon_resman_resource_control *ctrl; int ctrl_index = RESOURCE_CTRL_INDEX(ctrl_id); int ret; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!resource || ctrl_index < 0 || ctrl_index >= resource->num_ctrls) return -EINVAL; @@ -181,7 +280,7 @@ syscommon_resman_set_resource_control(struct syscommon_resman_resource *resource if (!ctrl->ops.set) return -ENOTSUP; - ret = ctrl->ops.set(resource, ctrl, data); + ret = ctrl->ops.set(resource_id, ctrl, data); if (ret < 0) return ret; @@ -189,11 +288,11 @@ syscommon_resman_set_resource_control(struct syscommon_resman_resource *resource } const char * -syscommon_resman_get_resource_control_name(struct syscommon_resman_resource *resource, - u_int64_t ctrl_id) +syscommon_resman_get_resource_control_name(int resource_id, u_int64_t ctrl_id) { const struct syscommon_resman_resource_control *ctrl; int ctrl_index = RESOURCE_CTRL_INDEX(ctrl_id); + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!resource || ctrl_index < 0 || ctrl_index >= resource->num_ctrls) return NULL; @@ -222,7 +321,7 @@ update_resource_attr(struct syscommon_resman_resource *resource, attr_value = &resource->attrs_value[attr_index]; - ret = attr->ops.get(resource, attr, attr_value->data); + ret = attr->ops.get(resource->id, attr, attr_value->data); if (ret < 0) return ret; @@ -230,15 +329,16 @@ update_resource_attr(struct syscommon_resman_resource *resource, } int -syscommon_resman_update_resource_attrs(struct syscommon_resman_resource *resource) +syscommon_resman_update_resource_attrs(int resource_id) { int i, ret; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!resource || !resource->type) return -EINVAL; if (resource->driver && resource->driver->ops.prepare_update) { - ret = resource->driver->ops.prepare_update(resource); + ret = resource->driver->ops.prepare_update(resource->id); if (ret < 0) return ret; } @@ -252,9 +352,8 @@ syscommon_resman_update_resource_attrs(struct syscommon_resman_resource *resourc return 0; } -const struct syscommon_resman_resource_attribute * -syscommon_resman_get_resource_attr(struct syscommon_resman_resource *resource, - u_int64_t attr_id) +static const struct syscommon_resman_resource_attribute * +get_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id) { int attr_index = RESOURCE_ATTR_INDEX(attr_id); @@ -264,9 +363,17 @@ syscommon_resman_get_resource_attr(struct syscommon_resman_resource *resource, return &resource->attrs[attr_index]; } -struct syscommon_resman_resource_attribute_value * -syscommon_resman_get_resource_attr_value(struct syscommon_resman_resource *resource, - u_int64_t attr_id) +const struct syscommon_resman_resource_attribute * +syscommon_resman_get_resource_attr(int resource_id, u_int64_t attr_id) +{ + struct syscommon_resman_resource *resource = find_resource(resource_id); + + return get_resource_attr(resource, attr_id); +} + + +static struct syscommon_resman_resource_attribute_value * +get_resource_attr_value(struct syscommon_resman_resource *resource, u_int64_t attr_id) { int attr_index = RESOURCE_ATTR_INDEX(attr_id); @@ -276,24 +383,32 @@ syscommon_resman_get_resource_attr_value(struct syscommon_resman_resource *resou return &resource->attrs_value[attr_index]; } -int -syscommon_resman_is_resource_attr_supported(struct syscommon_resman_resource *resource, - u_int64_t attr_id, bool *supported) +struct syscommon_resman_resource_attribute_value * +syscommon_resman_get_resource_attr_value(int resource_id, u_int64_t attr_id) +{ + struct syscommon_resman_resource *resource = find_resource(resource_id); + + return get_resource_attr_value(resource, attr_id); +} + +static int is_resource_attr_supported(struct syscommon_resman_resource *resource, u_int64_t attr_id, bool *supported) { const struct syscommon_resman_resource_attribute *attr = NULL; int attr_index = RESOURCE_ATTR_INDEX(attr_id); int ret; bool is_supported = false; - if (!resource || attr_index < 0 || attr_index >= resource->num_attrs) + if (!resource || attr_index < 0 || attr_index >= resource->num_attrs) { + *supported = false; return -EINVAL; + } attr = &resource->attrs[attr_index]; if (attr->id & resource->attr_supported) { is_supported = true; } else if (attr->ops.is_supported) { - is_supported = attr->ops.is_supported(resource, attr); + is_supported = attr->ops.is_supported(resource->id, attr); } else if (attr->ops.get) { /* * Optionally, if .is_supported ops is not implemented, @@ -302,7 +417,7 @@ syscommon_resman_is_resource_attr_supported(struct syscommon_resman_resource *re */ char data[SYSCOMMON_RESMAN_BUFF_MAX] = {0, }; - ret = attr->ops.get(resource, attr, (void *)data); + ret = attr->ops.get(resource->id, attr, (void *)data); is_supported = (ret < 0) ? false : true; } @@ -314,13 +429,21 @@ syscommon_resman_is_resource_attr_supported(struct syscommon_resman_resource *re return 0; } +int +syscommon_resman_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported) +{ + struct syscommon_resman_resource *resource = find_resource(resource_id); + + return is_resource_attr_supported(resource, attr_id, supported); +} + static bool check_attr_validate(struct syscommon_resman_resource *resource, u_int64_t attr_id, int type) { const struct syscommon_resman_resource_attribute *attr; - attr = syscommon_resman_get_resource_attr(resource, attr_id); + attr = get_resource_attr(resource, attr_id); if (!attr) return false; @@ -456,12 +579,12 @@ static void _put_resource_attr_json(json_object *jobj_attr) } int -syscommon_resman_get_resource_attrs_json(struct syscommon_resman_resource *resource, - char **json_string) +syscommon_resman_get_resource_attrs_json(int resource_id, char **json_string) { json_object *jobj_root, *jobj_res_name, *jobj_res_type, *jobj_res_attrs, *jobj_attr; const struct syscommon_resman_resource_attribute *attr; const struct syscommon_resman_resource_attribute_value *attr_value; + struct syscommon_resman_resource *resource = find_resource(resource_id); int i; if (!resource || !resource->type) @@ -506,15 +629,15 @@ syscommon_resman_get_resource_attrs_json(struct syscommon_resman_resource *resou } int -syscommon_resman_get_resource_attr_json(struct syscommon_resman_resource *resource, - u_int64_t attr_id, char **json_string) +syscommon_resman_get_resource_attr_json(int resource_id, u_int64_t attr_id, char **json_string) { const struct syscommon_resman_resource_attribute *attr; const struct syscommon_resman_resource_attribute_value *attr_value; json_object *jobj_attr; + struct syscommon_resman_resource *resource = find_resource(resource_id); - attr = syscommon_resman_get_resource_attr(resource, attr_id); - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr = get_resource_attr(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr || !attr_value) return -EINVAL; @@ -652,15 +775,15 @@ int syscommon_resman_get_resource_list_json(char **json_string) } int -syscommon_resman_get_resource_attr_int(struct syscommon_resman_resource *resource, - u_int64_t attr_id, int32_t *data) +syscommon_resman_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -670,15 +793,15 @@ syscommon_resman_get_resource_attr_int(struct syscommon_resman_resource *resourc } int -syscommon_resman_get_resource_attr_int64(struct syscommon_resman_resource *resource, - u_int64_t attr_id, int64_t *data) +syscommon_resman_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -688,15 +811,15 @@ syscommon_resman_get_resource_attr_int64(struct syscommon_resman_resource *resou } int -syscommon_resman_get_resource_attr_uint(struct syscommon_resman_resource *resource, - u_int64_t attr_id, u_int32_t *data) +syscommon_resman_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -706,15 +829,15 @@ syscommon_resman_get_resource_attr_uint(struct syscommon_resman_resource *resour } int -syscommon_resman_get_resource_attr_uint64(struct syscommon_resman_resource *resource, - u_int64_t attr_id, u_int64_t *data) +syscommon_resman_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -724,15 +847,15 @@ syscommon_resman_get_resource_attr_uint64(struct syscommon_resman_resource *reso } int -syscommon_resman_get_resource_attr_double(struct syscommon_resman_resource *resource, - u_int64_t attr_id, double *data) +syscommon_resman_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -742,15 +865,15 @@ syscommon_resman_get_resource_attr_double(struct syscommon_resman_resource *reso } int -syscommon_resman_get_resource_attr_string(struct syscommon_resman_resource *resource, - u_int64_t attr_id, char *data) +syscommon_resman_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -760,16 +883,15 @@ syscommon_resman_get_resource_attr_string(struct syscommon_resman_resource *reso } int -syscommon_resman_get_resource_attr_array(struct syscommon_resman_resource *resource, - u_int64_t attr_id, - struct syscommon_resman_array_value **data) +syscommon_resman_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -779,15 +901,15 @@ syscommon_resman_get_resource_attr_array(struct syscommon_resman_resource *resou } int -syscommon_resman_get_resource_attr_ptr(struct syscommon_resman_resource *resource, - u_int64_t attr_id, void **data) +syscommon_resman_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data) { struct syscommon_resman_resource_attribute_value *attr_value = NULL; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR)) return -EINVAL; - attr_value = syscommon_resman_get_resource_attr_value(resource, attr_id); + attr_value = get_resource_attr_value(resource, attr_id); if (!attr_value) return -EINVAL; @@ -813,12 +935,12 @@ is_resource_attr_visible(struct syscommon_resman_resource *resource, } int -syscommon_resman_set_resource_attr_interest(struct syscommon_resman_resource *resource, - u_int64_t interest_mask) +syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask) { struct syscommon_resman_resource_attribute_value *attr_value; int i, ret; bool supported; + struct syscommon_resman_resource *resource = find_resource(resource_id); if (!resource) return -EINVAL; @@ -827,7 +949,7 @@ syscommon_resman_set_resource_attr_interest(struct syscommon_resman_resource *re if (!(resource->attrs[i].id & interest_mask)) continue; - ret = syscommon_resman_is_resource_attr_supported(resource, + ret = is_resource_attr_supported(resource, resource->attrs[i].id, &supported); if (ret < 0) { @@ -842,8 +964,7 @@ syscommon_resman_set_resource_attr_interest(struct syscommon_resman_resource *re goto err; } - attr_value = syscommon_resman_get_resource_attr_value(resource, - resource->attrs[i].id); + attr_value = get_resource_attr_value(resource, resource->attrs[i].id); if (!attr_value) { ret = -EINVAL; goto err; @@ -899,8 +1020,7 @@ err: if (!(resource->attrs[i].id & interest_mask)) continue; - attr_value = syscommon_resman_get_resource_attr_value(resource, - resource->attrs[i].id); + attr_value = get_resource_attr_value(resource, resource->attrs[i].id); if (!attr_value) continue; @@ -913,9 +1033,8 @@ err: return ret; } -int -syscommon_resman_unset_resource_attr_interest(struct syscommon_resman_resource *resource, - u_int64_t interest_mask) +static int +unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask) { struct syscommon_resman_resource_attribute_value *attr_value; int i; @@ -923,14 +1042,14 @@ syscommon_resman_unset_resource_attr_interest(struct syscommon_resman_resource * if (!resource) return -EINVAL; - if (!syscommon_resman_is_resource_attr_interested(resource, interest_mask)) + if (!is_resource_attr_interested(resource, interest_mask)) return -EINVAL; for (i = 0; i < resource->num_attrs; i++) { if (!(resource->attrs[i].id & interest_mask)) continue; - attr_value = syscommon_resman_get_resource_attr_value(resource, + attr_value = get_resource_attr_value(resource, resource->attrs[i].id); if (!attr_value) return -EINVAL; @@ -967,8 +1086,16 @@ syscommon_resman_unset_resource_attr_interest(struct syscommon_resman_resource * return 0; } -bool -syscommon_resman_is_resource_attr_interested(struct syscommon_resman_resource *resource, +int +syscommon_resman_unset_resource_attr_interest(int resource_id, u_int64_t interest_mask) +{ + struct syscommon_resman_resource *resource = find_resource(resource_id); + + return unset_resource_attr_interest(resource, interest_mask); +} + +static bool +is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask) { if (!resource) @@ -980,38 +1107,56 @@ syscommon_resman_is_resource_attr_interested(struct syscommon_resman_resource *r return true; } +bool +syscommon_resman_is_resource_attr_interested(int resource_id, u_int64_t interest_mask) +{ + struct syscommon_resman_resource *resource = find_resource(resource_id); + + return is_resource_attr_interested(resource, interest_mask); +} + const char * -syscommon_resman_get_resource_attr_name(struct syscommon_resman_resource *resource, - u_int64_t attr_id) +syscommon_resman_get_resource_attr_name(int resource_id, u_int64_t attr_id) { const struct syscommon_resman_resource_attribute *attr; + struct syscommon_resman_resource *resource = find_resource(resource_id); - attr = syscommon_resman_get_resource_attr(resource, attr_id); + attr = get_resource_attr(resource, attr_id); if (!attr) return NULL; return attr->name; } -const char *syscommon_resman_get_resource_name(struct syscommon_resman_resource *resource) +const char +*syscommon_resman_get_resource_name(int resource_id) { + struct syscommon_resman_resource *resource = find_resource(resource_id); + return resource ? resource->name : NULL; } -void *syscommon_resman_get_resource_privdata(struct syscommon_resman_resource *resource) +void * +syscommon_resman_get_resource_privdata(int resource_id) { + struct syscommon_resman_resource *resource = find_resource(resource_id); + return resource ? resource->priv : NULL; } -int syscommon_resman_get_resource_type(struct syscommon_resman_resource *resource) +int +syscommon_resman_get_resource_type(int resource_id) { + struct syscommon_resman_resource *resource = find_resource(resource_id); + return resource ? resource->type : -EINVAL; } int -syscommon_resman_set_resource_privdata(struct syscommon_resman_resource *resource, - void *priv) +syscommon_resman_set_resource_privdata(int resource_id, void *priv) { + struct syscommon_resman_resource *resource = find_resource(resource_id); + if (!resource) return -EINVAL; diff --git a/src/resource-manager/resource-manager.h b/src/resource-manager/resource-manager.h index f070dd5..4ebf694 100644 --- a/src/resource-manager/resource-manager.h +++ b/src/resource-manager/resource-manager.h @@ -26,7 +26,6 @@ #define SYSCOMMON_RESMAN_BUFF_MAX 255 -struct syscommon_resman_resource; struct syscommon_resman_resource_attribute; struct syscommon_resman_resource_control; @@ -42,17 +41,17 @@ struct syscommon_resman_resource_attribute_value { }; struct syscommon_resman_resource_attribute_ops { - int (*set)(struct syscommon_resman_resource *res, + int (*set)(int resource_id, const struct syscommon_resman_resource_attribute *attr, const void *data, int count); - int (*get)(struct syscommon_resman_resource *res, + int (*get)(int resource_id, const struct syscommon_resman_resource_attribute *attr, void *data); /* * If .is_supported ops is not implemented, use .get ops in order to * check whether the resource attribute is supported or not. */ - bool (*is_supported)(struct syscommon_resman_resource *res, + bool (*is_supported)(int resource_id, const struct syscommon_resman_resource_attribute *attr); }; @@ -65,10 +64,10 @@ struct syscommon_resman_resource_attribute { }; struct syscommon_resman_resource_control_ops { - const int (*set)(struct syscommon_resman_resource *res, + const int (*set)(int resource_id, const struct syscommon_resman_resource_control *ctrl, const void *data); - const int (*get)(struct syscommon_resman_resource *res, + const int (*get)(int resource_id, const struct syscommon_resman_resource_control *ctrl, void **data); }; @@ -82,13 +81,13 @@ struct syscommon_resman_resource_control { struct syscommon_resman_resource_driver_ops { int (*init)(void); void (*exit)(void); - int (*create)(struct syscommon_resman_resource *res); - void (*delete)(struct syscommon_resman_resource *res); + int (*create)(int resource_id); + void (*delete)(int resource_id); /* * If prepare_update is specified, it will be called * at every update_resource_attrs(). */ - int (*prepare_update)(struct syscommon_resman_resource *res); + int (*prepare_update)(int resource_id); }; struct syscommon_resman_resource_driver { @@ -102,25 +101,6 @@ struct syscommon_resman_resource_driver { const struct syscommon_resman_resource_driver_ops ops; }; -struct syscommon_resman_resource { - char *name; - const struct syscommon_resman_resource_driver *driver; - int type; - - int num_attrs; - const struct syscommon_resman_resource_attribute *attrs; - struct syscommon_resman_resource_attribute_value *attrs_value; - int num_ctrls; - const struct syscommon_resman_resource_control *ctrls; - - u_int64_t flag; - - void *priv; - - u_int64_t attr_interest; - u_int64_t attr_supported; -}; - #define SYSCOMMON_RESMAN_RESOURCE_DRIVER_REGISTER(resource_driver) \ static void __attribute__((constructor)) __syscommon_resman_module_init(void) \ { \ @@ -138,55 +118,54 @@ void syscommon_resman_add_resource_driver(const struct syscommon_resman_resource void syscommon_resman_remove_resource_driver(const struct syscommon_resman_resource_driver *resource_driver); /* Create/delete resource instance */ -int syscommon_resman_create_resource(struct syscommon_resman_resource **res, int resource_type); -void syscommon_resman_delete_resource(struct syscommon_resman_resource *resource); +int syscommon_resman_create_resource(int *resource_id, int resource_type); +void syscommon_resman_delete_resource(int resource_id); /* Set flag of the resource to given flag mask */ -int syscommon_resman_set_resource_flag(struct syscommon_resman_resource *resource, u_int64_t flag_mask); +int syscommon_resman_set_resource_flag(int resource_id, u_int64_t flag_mask); /* Handle resource control */ -int syscommon_resman_set_resource_control(struct syscommon_resman_resource *resource, u_int64_t ctrl_id, const void *data); -const char *syscommon_resman_get_resource_control_name(struct syscommon_resman_resource *resource, u_int64_t ctrl_id); +int syscommon_resman_set_resource_control(int resource_id, u_int64_t ctrl_id, const void *data); +const char *syscommon_resman_get_resource_control_name(int resource_id, u_int64_t ctrl_id); /* Handle resource attribute */ -int syscommon_resman_update_resource_attrs(struct syscommon_resman_resource *resource); +int syscommon_resman_update_resource_attrs(int resource_id); const struct syscommon_resman_resource_attribute * -syscommon_resman_get_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id); +syscommon_resman_get_resource_attr(int resource_id, u_int64_t attr_id); struct syscommon_resman_resource_attribute_value * -syscommon_resman_get_resource_attr_value(struct syscommon_resman_resource *resource, u_int64_t attr_id); -int syscommon_resman_is_resource_attr_supported(struct syscommon_resman_resource *resource, u_int64_t attr_id, bool *supported); +syscommon_resman_get_resource_attr_value(int resource_id, u_int64_t attr_id); +int syscommon_resman_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported); static inline bool -syscommon_resman_resource_attr_supported_always(struct syscommon_resman_resource *resource, +syscommon_resman_resource_attr_supported_always(int resource_id, const struct syscommon_resman_resource_attribute *attr) { return true; } -int syscommon_resman_get_resource_attrs_json(struct syscommon_resman_resource *resource, char **json_string); -int syscommon_resman_get_resource_attr_json(struct syscommon_resman_resource *resource, u_int64_t attr_id, char **json_string); +int syscommon_resman_get_resource_attrs_json(int resource_id, char **json_string); +int syscommon_resman_get_resource_attr_json(int resource_id, u_int64_t attr_id, char **json_string); int syscommon_resman_get_resource_list_json(char **json_string); -int syscommon_resman_get_resource_attr_int(struct syscommon_resman_resource *resource, u_int64_t attr_id, int32_t *data); -int syscommon_resman_get_resource_attr_int64(struct syscommon_resman_resource *resource, u_int64_t attr_id, int64_t *data); -int syscommon_resman_get_resource_attr_uint(struct syscommon_resman_resource *resource, u_int64_t attr_id, u_int32_t *data); -int syscommon_resman_get_resource_attr_uint64(struct syscommon_resman_resource *resource, u_int64_t attr_id, u_int64_t *data); -int syscommon_resman_get_resource_attr_double(struct syscommon_resman_resource *resource, u_int64_t attr_id, double *data); -int syscommon_resman_get_resource_attr_string(struct syscommon_resman_resource *resource, u_int64_t attr_id, char *data); -int syscommon_resman_get_resource_attr_array(struct syscommon_resman_resource *resource, u_int64_t attr_id, - struct syscommon_resman_array_value **data); -int syscommon_resman_get_resource_attr_ptr(struct syscommon_resman_resource *resource, u_int64_t attr_id, void **data); - -int syscommon_resman_set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask); -int syscommon_resman_unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask); -bool syscommon_resman_is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask); -const char *syscommon_resman_get_resource_attr_name(struct syscommon_resman_resource *resource, u_int64_t attr_id); - -const char *syscommon_resman_get_resource_name(struct syscommon_resman_resource *resource); -void *syscommon_resman_get_resource_privdata(struct syscommon_resman_resource *resource); -int syscommon_resman_get_resource_type(struct syscommon_resman_resource *resource); - -int syscommon_resman_set_resource_privdata(struct syscommon_resman_resource *resource, void *priv); +int syscommon_resman_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data); +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_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); +int syscommon_resman_get_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); +const char *syscommon_resman_get_resource_attr_name(int resource_id, u_int64_t attr_id); + +const char *syscommon_resman_get_resource_name(int resource_id); +void *syscommon_resman_get_resource_privdata(int resource_id); +int syscommon_resman_get_resource_type(int resource_id); + +int syscommon_resman_set_resource_privdata(int resource_id, void *priv); void syscommon_resman_init_resource_drivers(void); void syscommon_resman_exit_resource_drivers(void); -- 2.34.1