util: resource: Add init/exit ops for resource driver 37/270837/2
authorDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 7 Feb 2022 12:53:50 +0000 (21:53 +0900)
committerDongwoo Lee <dwoo08.lee@samsung.com>
Thu, 10 Feb 2022 04:01:26 +0000 (13:01 +0900)
Change-Id: Ie71a2f7de493f198dc57d9daa0b939b3c9eb8e4b
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
include/util/resource.h
src/util/resource.c

index 5c7fd8f..107c194 100644 (file)
@@ -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;
index 7bc52a6..7895213 100644 (file)
@@ -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;
 }