* 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;
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);
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;
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;
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)
{
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;
}
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;
}
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)
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)
{