resource-manager: Introduce resource instance type 46/288646/10
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 21 Feb 2023 01:41:58 +0000 (10:41 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Wed, 8 Mar 2023 01:03:35 +0000 (10:03 +0900)
 To clearly partition the way how resource works, added instance_type
to resource, INSTANCE_TYPE_NORMAL and INSTANCE_TYPE_MONITOR. Resource
instance of each type can be created by the below functions:
  - INSTANCE_TYPE_NORMAL: syscommon_resman_create_resource()
  - INSTANCE_TYPE_MONITOR: syscommon_resman_monitor_create_resource()

 Instance type of NORMAL sets all interest bits by default. Therefore,
it doesn't need to set interest bit additionally. On the other hand,
instance type of MONITOR clears all interest bits by default. Therefore,
it should set bit manually in which a monitor interest before it starts
monitoring.
 In addition, instance type of NORMAL always invoke its attribute
getter for every access to attribute value. That is, it always fetches
the latest value. On the other hand, instance type of MONITOR fetches
attribute value on a specific time that must have been synchronized by
syscommon_resman_monitor_update_resource_attrs().

Change-Id: I39b2089a21d5b5d7b59704a7835e2646939a20c2
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/resource-manager/resource-manager.c
src/resource-manager/resource-manager.h

index 5f3fa1e..953ed85 100644 (file)
@@ -20,6 +20,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE. */
 
+#include <assert.h>
 #include <glib.h>
 #include <stdio.h>
 #include <json.h>
 #define RESOURCE_ATTR_FLAG_VISIBILITY_MASK     (SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PRIVATE \
                                                | SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC)
 
+#define INSTANCE_TYPE_NORMAL                   0
+#define INSTANCE_TYPE_MONITOR                  1
+
 struct syscommon_resman_resource {
        char *name;
        int id;
        const struct syscommon_resman_resource_driver *driver;
        int resource_type; /* which type of resource */
+       int instance_type; /* how resource instance operates */
 
        int num_attrs;
        const struct syscommon_resman_resource_attribute *attrs;
@@ -57,6 +62,7 @@ struct syscommon_resman_resource {
        u_int64_t attr_supported;
 };
 
+static int set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
 static int unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
 static bool is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
 
@@ -202,8 +208,8 @@ void syscommon_resman_delete_resource(int resource_id)
        g_hash_table_remove(g_resource_hash_table, GINT_TO_POINTER(resource_id));
 }
 
-int
-syscommon_resman_create_resource(int *resource_id, int resource_type)
+static int
+create_resource(int *resource_id, int resource_type, int instance_type)
 {
        const struct syscommon_resman_resource_driver *driver = NULL;
        struct syscommon_resman_resource *resource = NULL;
@@ -222,6 +228,7 @@ syscommon_resman_create_resource(int *resource_id, int resource_type)
 
        resource->id = alloc_resource_id();
        resource->resource_type = resource_type;
+       resource->instance_type = instance_type;
        resource->name = g_strdup(driver->name);
        resource->driver = driver;
        resource->num_attrs = driver->num_attrs;
@@ -259,6 +266,46 @@ syscommon_resman_create_resource(int *resource_id, int resource_type)
        return 0;
 }
 
+static int set_resource_attr_interest_all(struct syscommon_resman_resource *resource)
+{
+       u_int64_t all;
+
+       if (!resource || !resource->num_attrs)
+               return -EINVAL;
+
+       all = (1ULL << resource->num_attrs) - 1;
+
+       return set_resource_attr_interest(resource, all);
+}
+
+int
+syscommon_resman_create_resource(int *resource_id, int resource_type)
+{
+       int ret;
+       struct syscommon_resman_resource *resource = NULL;
+
+       ret = create_resource(resource_id, resource_type, INSTANCE_TYPE_NORMAL);
+       if (ret < 0)
+               return ret;
+
+       resource = find_resource(*resource_id);
+       assert(resource);
+
+       ret = set_resource_attr_interest_all(resource);
+       if (ret < 0) {
+               free_resource(resource);
+               return ret;
+       }
+
+       return 0;
+}
+
+int
+syscommon_resman_monitor_create_resource(int *resource_id, int resource_type)
+{
+       return create_resource(resource_id, resource_type, INSTANCE_TYPE_MONITOR);
+}
+
 int
 syscommon_resman_set_resource_flag(int resource_id, u_int64_t flag_mask)
 {
@@ -891,13 +938,12 @@ is_resource_attr_visible(struct syscommon_resman_resource *resource,
        return true;
 }
 
-int
-syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask)
+static int
+set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask)
 {
        struct syscommon_resman_resource_attribute_value *attr_value;
        int i, ret;
        bool supported;
-       struct syscommon_resman_resource *resource = find_resource(resource_id);
 
        if (!resource)
                return -EINVAL;
@@ -928,7 +974,7 @@ syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_
                }
 
                if (resource->attrs[i].listener_ops.init) {
-                       ret = resource->attrs[i].listener_ops.init(resource_id, &resource->attrs[i]);
+                       ret = resource->attrs[i].listener_ops.init(resource->id, &resource->attrs[i]);
                        if (ret < 0)
                                goto err;
                }
@@ -984,7 +1030,7 @@ err:
                        continue;
 
                if (resource->attrs[i].listener_ops.exit)
-                       resource->attrs[i].listener_ops.exit(resource_id, &resource->attrs[i]);
+                       resource->attrs[i].listener_ops.exit(resource->id, &resource->attrs[i]);
 
                attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
                if (!attr_value)
@@ -999,6 +1045,14 @@ err:
        return ret;
 }
 
+int
+syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask)
+{
+       struct syscommon_resman_resource *resource = find_resource(resource_id);
+
+       return set_resource_attr_interest(resource, interest_mask);
+}
+
 static int
 unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask)
 {
index 8c7b006..5086cf4 100644 (file)
@@ -132,6 +132,7 @@ void syscommon_resman_remove_resource_driver(const struct syscommon_resman_resou
 
 /* Create/delete resource instance */
 int syscommon_resman_create_resource(int *resource_id, int resource_type);
+int syscommon_resman_monitor_create_resource(int *resource_id, int resource_type);
 void syscommon_resman_delete_resource(int resource_id);
 
 /* Set flag of the resource to given flag mask */