#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)
{
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);
if (!resource)
return -ENOMEM;
+ resource->id = alloc_resource_id();
resource->type = resource_type;
resource->name = g_strdup(driver->name);
resource->driver = driver;
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;
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;
}
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;
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;
}
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;
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;
}
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;
}
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);
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);
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,
*/
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;
}
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;
}
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)
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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) {
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;
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;
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;
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;
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)
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;
#define SYSCOMMON_RESMAN_BUFF_MAX 255
-struct syscommon_resman_resource;
struct syscommon_resman_resource_attribute;
struct syscommon_resman_resource_control;
};
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);
};
};
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);
};
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 {
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) \
{ \
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);