resource-manager: Add syscommon_resman_get_resource_id() 99/296599/5
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 1 Aug 2023 05:00:08 +0000 (14:00 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Wed, 2 Aug 2023 10:10:52 +0000 (19:10 +0900)
 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 <y0.cho@samsung.com>
include/libsyscommon/resource-manager.h
src/resource-manager/resource-manager.c

index d89f08b..1df9244 100644 (file)
@@ -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);
index 25817ce..03737cb 100644 (file)
@@ -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)
 {