void remove_resource_device(struct resource_device *resource_device);
/* Create/delete resource instance */
-struct resource *create_resource(int resource_type);
+int create_resource(struct resource **res, int resource_type);
void delete_resource(struct resource *resource);
/* Set flag of the resource to given flag mask */
static int handle_request_create_resource(struct request_client *client, char *args)
{
struct resource *res;
- int resource_type;
+ int resource_type, ret;
if (!client || !args) {
_E("Invalid parameter\n");
*/
resource_type = atoi(args);
- res = create_resource(resource_type);
- if (!res) {
+ ret = create_resource(&res, resource_type);
+ if (ret < 0) {
_E("failed to create resource, res:type(%d)\n", resource_type);
- return -EINVAL;
+ return ret;
}
register_resource_to_client(client, res);
g_resource_id = clear_sign_bit(val);
}
-struct resource *create_resource(int resource_type)
+int create_resource(struct resource **res, int resource_type)
{
const struct resource_driver *driver = NULL;
struct resource *resource = NULL;
if (!driver) {
_E("failed to find resource driver, res:type(%d)\n",
resource_type);
- return NULL;
+ return -EINVAL;
}
resource = calloc(1, sizeof(*resource));
if (!resource)
- return NULL;
+ return -ENOMEM;
resource->id = clear_sign_bit(
(unsigned int)__sync_fetch_and_add(&g_resource_id, 1));
sizeof(*resource->attrs_value));
if (!resource->attrs_value) {
do_delete_resource(resource);
- return NULL;
+ return -ENOMEM;
}
for (i = 0; i < resource->num_attrs; i++)
_E("failed to initialize resource driver, res:type(%s)id(%d)\n",
resource->name, resource->id);
do_delete_resource(resource);
- return NULL;
+ return ret;
}
}
- return resource;
+ *res = resource;
+
+ return 0;
}
int set_resource_flag(struct resource *resource, u_int64_t flag_mask)