From 40be16ec3e93f3beed0cbe3ffe2ea4c51558b69d Mon Sep 17 00:00:00 2001 From: Youngjae Cho Date: Tue, 1 Aug 2023 14:00:08 +0900 Subject: [PATCH] resource-manager: Add syscommon_resman_get_resource_id() It is necessary that a plugin know about resource_id so that the plugin invoke resource-manager functions that works on top of resource_id. To this end, added getter for resource_id. - syscommon_resman_get_resource_id() The function gets resource_id of the given type. The id is resource instance created first. - syscommon_resman_get_number_of_instance() The function gets how may resource instances have been created on a specific resource type. To support these operations, the resource-manager internally manages hashtable dedicated to reosurce_id. The hashtable maps resource_type into head of resource_id list. Change-Id: I9d0df9a098444af506a94a81d14fae0f20bc1e04 Signed-off-by: Youngjae Cho --- include/libsyscommon/resource-manager.h | 2 + src/resource-manager/resource-manager.c | 68 +++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/include/libsyscommon/resource-manager.h b/include/libsyscommon/resource-manager.h index d89f08b..1df9244 100644 --- a/include/libsyscommon/resource-manager.h +++ b/include/libsyscommon/resource-manager.h @@ -177,6 +177,8 @@ syscommon_resman_resource_attr_supported_always(int resource_id, int syscommon_resman_monitor_get_resource_attrs_json(int resource_id, char **json_string); int syscommon_resman_monitor_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_number_of_resource_instance(int resource_type, int *n_instance); +int syscommon_resman_get_resource_id(int resource_type, int *resource_id); 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); diff --git a/src/resource-manager/resource-manager.c b/src/resource-manager/resource-manager.c index 25817ce..03737cb 100644 --- a/src/resource-manager/resource-manager.c +++ b/src/resource-manager/resource-manager.c @@ -75,8 +75,25 @@ static int unset_resource_attr_interest(struct syscommon_resman_resource *resour static bool is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask); static GList *g_resource_driver_head; + +/** + * key: resource_id, value: struct syscommon_resman_resource + */ static GHashTable *g_resource_hash_table; +/** + * key: resource_type, value: head of resource_id list + */ +static GHashTable *g_resource_id_list_hash_table; + +static GList** find_resource_id_list(int resource_type) +{ + if (!g_resource_id_list_hash_table) + return NULL; + + return g_hash_table_lookup(g_resource_id_list_hash_table, GINT_TO_POINTER(resource_type)); +} + static int clear_sign_bit(unsigned int val) { return (int)((val << 1) >> 1); @@ -128,6 +145,7 @@ static void free_resource(struct syscommon_resman_resource *resource) static void delete_resource(void *data) { + GList **resource_id_list = NULL; struct syscommon_resman_resource *resource = (struct syscommon_resman_resource *) data; if (!resource) @@ -136,11 +154,20 @@ static void delete_resource(void *data) if (resource->driver && resource->driver->ops.delete) resource->driver->ops.delete(resource->id); + resource_id_list = find_resource_id_list(resource->resource_type); + if (resource_id_list) { + *resource_id_list = g_list_remove(*resource_id_list, GINT_TO_POINTER(resource->id)); + if (*resource_id_list == NULL) + g_hash_table_remove(g_resource_id_list_hash_table, resource_id_list); + } + free_resource(resource); } static int add_resource(struct syscommon_resman_resource *resource) { + GList **resource_id_list = NULL; + if (!resource) return -EINVAL; @@ -150,7 +177,22 @@ static int add_resource(struct syscommon_resman_resource *resource) return -ENOMEM; } + if (!g_resource_id_list_hash_table) { + g_resource_id_list_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free); + if (!g_resource_id_list_hash_table) + return -ENOMEM; + } + + resource_id_list = find_resource_id_list(resource->resource_type); + if (!resource_id_list) { + resource_id_list = (GList **) calloc(1, sizeof(void *)); + if (!resource_id_list) + return -ENOMEM; + g_hash_table_insert(g_resource_id_list_hash_table, GINT_TO_POINTER(resource->resource_type), resource_id_list); + } + g_hash_table_insert(g_resource_hash_table, GINT_TO_POINTER(resource->id), resource); + *resource_id_list = g_list_append(*resource_id_list, GINT_TO_POINTER(resource->id)); return 0; } @@ -188,6 +230,32 @@ syscommon_resman_find_resource_driver(int resource_type) return (struct syscommon_resman_resource_driver *)node->data; } +int syscommon_resman_get_number_of_resource_instance(int resource_type, int *n_instance) +{ + GList **resource_id_list = NULL; + + resource_id_list = find_resource_id_list(resource_type); + if (!resource_id_list) + *n_instance = 0; + else + *n_instance = g_list_length(*resource_id_list); + + return 0; +} + +int syscommon_resman_get_resource_id(int resource_type, int *resource_id) +{ + GList **resource_id_list = NULL; + + resource_id_list = find_resource_id_list(resource_type); + if (!resource_id_list) + return -EINVAL; + + *resource_id = GPOINTER_TO_INT(g_list_nth_data(*resource_id_list, 0)); + + return 0; +} + void syscommon_resman_add_resource_driver(const struct syscommon_resman_resource_driver *driver) { -- 2.7.4