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
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))
if (!attr_value) {
_E("failed to get attribute value: resource: %s, attribute: %s",
resource->name, resource->attrs[i].name);
- return;
+ ret = -EINVAL;
+ goto err;
}
/*
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))
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) {
break;
default:
_E("Not supported data type: %d", attr_value->type);
- return;
+ return -EINVAL;
}
}
}
resource->attr_interest &= ~interest_mask;
+
+ return 0;
}