util: resource: Return error for set/unset_resource_attr_interest 07/272207/3
authorChanwoo Choi <cw00.choi@samsung.com>
Fri, 11 Mar 2022 06:46:42 +0000 (15:46 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Fri, 11 Mar 2022 08:11:34 +0000 (17:11 +0900)
Change-Id: I5fe36ff6dd5e38ccdfe64a7d7bb153d22b8d641c
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
include/util/resource.h
src/util/resource.c

index 9290a29..ec3d821 100644 (file)
@@ -174,6 +174,6 @@ int get_resource_attr_array(struct resource *resource, u_int64_t attr_id,
                            struct array_value **data);
 int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data);
 
-void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
-void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
+int set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
+int unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
 #endif
index 9e25238..a03631d 100644 (file)
@@ -433,13 +433,13 @@ int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **d
        return 0;
 }
 
-void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
+int set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
 {
        struct resource_attribute_value *attr_value;
-       int i;
+       int i, ret;
 
        if (!resource)
-               return;
+               return -EINVAL;
 
        for (i = 0; i < resource->num_attrs; i++) {
                if (!(resource->attrs[i].id & interest_mask))
@@ -449,7 +449,8 @@ void set_resource_attr_interest(struct resource *resource, u_int64_t interest_ma
                if (!attr_value) {
                        _E("failed to get attribute value: resource: %s, attribute: %s",
                                        resource->name, resource->attrs[i].name);
-                       return;
+                       ret = -EINVAL;
+                       goto err;
                }
 
                /*
@@ -483,21 +484,48 @@ void set_resource_attr_interest(struct resource *resource, u_int64_t interest_ma
                                break;
                        default:
                                _E("Not supported data type: %d", attr_value->type);
-                               return;
+                               ret = -EINVAL;
+                               goto err;
+                       }
+
+                       if (!attr_value->data) {
+                               _E("failed to allocate attr_value memory: resource: %s, attribute: %s",
+                                       resource->name, resource->attrs[i].name);
+                               ret = -ENOMEM;
+                               goto err;
                        }
                }
        }
 
        resource->attr_interest |= interest_mask;
+
+       return 0;
+
+err:
+       for (; i >= 0;  i--) {
+               if (!(resource->attrs[i].id & interest_mask))
+                       continue;
+
+               attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
+               if (!attr_value)
+                       continue;
+
+               if (attr_value->data) {
+                       free(attr_value->data);
+                       attr_value->data = NULL;
+               }
+       }
+
+       return ret;
 }
 
-void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
+int unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
 {
        struct resource_attribute_value *attr_value;
        int i;
 
        if (!resource)
-               return;
+               return -EINVAL;
 
        for (i = 0; i < resource->num_attrs; i++) {
                if (!(resource->attrs[i].id & interest_mask))
@@ -507,7 +535,7 @@ void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_
                if (!attr_value) {
                        _E("failed to get attribute value: resource: %s, attribute: %s",
                                        resource->name, resource->attrs[i].name);
-                       return;
+                       return -EINVAL;
                }
 
                if (attr_value->data) {
@@ -533,10 +561,12 @@ void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_
                                break;
                        default:
                                _E("Not supported data type: %d", attr_value->type);
-                               return;
+                               return -EINVAL;
                        }
                }
        }
 
        resource->attr_interest &= ~interest_mask;
+
+       return 0;
 }