From: Dongwoo Lee Date: Mon, 7 Feb 2022 12:53:50 +0000 (+0900) Subject: util: resource: Add init/exit ops for resource driver X-Git-Tag: accepted/tizen/unified/20220302.131908~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=04c556f10ee88c1b1be7074dd74a22f335a7360e;p=platform%2Fcore%2Fsystem%2Fpass.git util: resource: Add init/exit ops for resource driver Change-Id: Ie71a2f7de493f198dc57d9daa0b939b3c9eb8e4b Signed-off-by: Dongwoo Lee --- diff --git a/include/util/resource.h b/include/util/resource.h index 5c7fd8f..107c194 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -65,11 +65,17 @@ struct resource_attribute { const struct resource_attribute_ops ops; }; +struct resource_driver_ops { + int (*init)(struct resource *res); + void (*exit)(struct resource *res); +}; + struct resource_driver { const char *name; const int type; const int num_attrs; const struct resource_attribute *attrs; + const struct resource_driver_ops ops; }; struct resource_device { @@ -88,6 +94,7 @@ struct resource { int type; int index; void *user_data; + void *priv; int num_attrs; const struct resource_attribute *attrs; diff --git a/src/util/resource.c b/src/util/resource.c index 7bc52a6..7895213 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -130,11 +130,8 @@ static const struct resource_driver *find_resource_driver(int resource_type) return (struct resource_driver *)node->data; } -void delete_resource(struct resource *resource) +static void do_delete_resource(struct resource *resource) { - if (!resource) - return; - if (!resource->name) free(resource->name); if (!resource->attrs_value) @@ -145,13 +142,32 @@ void delete_resource(struct resource *resource) free(resource); } +void delete_resource(struct resource *resource) +{ + const struct resource_driver *driver = NULL; + + if (!resource) + return; + + driver = find_resource_driver(resource->type); + if (!driver) { + _E("failed to find driver for resource type: %d\n", resource->type); + return; + } + + if (driver->ops.exit) + driver->ops.exit(resource); + + do_delete_resource(resource); +} + struct resource *create_resource(int resource_type, int resource_index, void *user_data) { const struct resource_device *device = NULL; const struct resource_driver *driver = NULL; struct resource *resource = NULL; - int i; + int i, ret; device = find_resource_device(resource_type, resource_index); if (!device) @@ -174,13 +190,21 @@ struct resource *create_resource(int resource_type, int resource_index, resource->attrs_value = calloc(resource->num_attrs, sizeof(*resource->attrs_value)); if (!resource->attrs_value) { - delete_resource(resource); + do_delete_resource(resource); return NULL; } for (i = 0; i < resource->num_attrs; i++) resource->attrs_value[i].type = driver->attrs[i].type; + if (driver->ops.init) { + ret = driver->ops.init(resource); + if (ret < 0) { + do_delete_resource(resource); + return NULL; + } + } + return resource; }