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);
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);
static void delete_resource(void *data)
{
+ GList **resource_id_list = NULL;
struct syscommon_resman_resource *resource = (struct syscommon_resman_resource *) data;
if (!resource)
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;
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;
}
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)
{