resource-manager: operate based on resource id 56/283856/4
authorYoungjae Cho <y0.cho@samsung.com>
Fri, 4 Nov 2022 05:45:16 +0000 (14:45 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Tue, 8 Nov 2022 04:14:20 +0000 (13:14 +0900)
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 <y0.cho@samsung.com>
src/resource-manager/resource-manager.c
src/resource-manager/resource-manager.h

index 7faa87b712544b879ff9e1ce4ad4187b1de60b2c..fca77439c481f97c97f394de5c7090dc5e63673d 100644 (file)
@@ -17,6 +17,8 @@
 #include <glib.h>
 #include <stdio.h>
 #include <json.h>
+#include <sys/time.h>
+#include <pthread.h>
 
 #include "resource-manager.h"
 #include "resource-type.h"
 #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;
 
index f070dd5512608533d794348fbea7ba8e19244a06..4ebf694ef9932b930ff090a9fdb3f7832ee35042 100644 (file)
@@ -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);