3 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is furnished
10 * to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30 #include "libsyscommon/resource-manager.h"
31 #include "libsyscommon/resource-type.h"
33 #define BIT64_INDEX(id) (63 - __builtin_clzll(id))
34 #define RESOURCE_ATTR_INDEX(id) BIT64_INDEX(id)
35 #define RESOURCE_CTRL_INDEX(id) BIT64_INDEX(id)
36 #define RESOURCE_FLAG_VISIBILITY_MASK (SYSCOMMON_RESMAN_RESOURCE_FLAG_PRIVATE \
37 | SYSCOMMON_RESMAN_RESOURCE_FLAG_PUBLIC)
38 #define RESOURCE_ATTR_FLAG_VISIBILITY_MASK (SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PRIVATE \
39 | SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC)
41 #define INSTANCE_TYPE_NORMAL 0
42 #define INSTANCE_TYPE_MONITOR 1
44 #define RESOURCE_TYPE_ALL (-1)
45 #define RESOURCE_ATTR_ALL (~0ULL)
47 struct syscommon_resman_resource {
50 const struct syscommon_resman_resource_driver *driver;
51 int resource_type; /* which type of resource */
52 int instance_type; /* how resource instance operates */
55 const struct syscommon_resman_resource_attribute *attrs;
56 struct syscommon_resman_resource_attribute_value *attrs_value;
58 const struct syscommon_resman_resource_control *ctrls;
64 u_int64_t attr_interest;
65 u_int64_t attr_supported;
68 struct attribute_is_supported_ops {
69 bool (*is_supported)(int resource_id,
70 const struct syscommon_resman_resource_attribute *attr);
71 int (*get)(int resource_id,
72 const struct syscommon_resman_resource_attribute *attr,
76 struct resource_event_data {
80 syscommon_resman_resource_event_cb callback;
84 static int set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
85 static int unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
86 static bool is_resource_attr_interested(struct syscommon_resman_resource *resource, u_int64_t interest_mask);
88 notify_resource_event(int resource_type, int resource_id, u_int64_t attr_id, const void *data, int count);
90 static GList *g_resource_driver_head;
91 static GList *g_resource_event_data_list;
94 * key: resource_id, value: struct syscommon_resman_resource
96 static GHashTable *g_resource_hash_table;
99 * key: resource_type, value: head of resource_id list
101 static GHashTable *g_resource_id_list_hash_table;
103 static GList** find_resource_id_list(int resource_type)
105 if (!g_resource_id_list_hash_table)
108 return g_hash_table_lookup(g_resource_id_list_hash_table, GINT_TO_POINTER(resource_type));
111 static int clear_sign_bit(unsigned int val)
113 return (int)((val << 1) >> 1);
116 static int init_resource_id(void)
121 gettimeofday(&tv, NULL);
122 val = tv.tv_sec * 1000 + tv.tv_usec / 1000;
123 return clear_sign_bit(val);
126 static int alloc_resource_id(void)
128 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
129 static int resource_id = -1;
132 pthread_mutex_lock(&lock);
135 resource_id = init_resource_id();
138 resource_id = clear_sign_bit(resource_id + 1);
140 pthread_mutex_unlock(&lock);
145 static void free_resource(struct syscommon_resman_resource *resource)
147 free(resource->name);
148 resource->name = NULL;
150 unset_resource_attr_interest(resource, resource->attr_interest);
151 free(resource->attrs_value);
152 resource->attrs_value = NULL;
154 resource->attrs = NULL;
155 resource->num_attrs = 0;
160 static void delete_resource(void *data)
162 GList **resource_id_list = NULL;
163 struct syscommon_resman_resource *resource = (struct syscommon_resman_resource *) data;
168 if (resource->driver && resource->driver->ops.delete)
169 resource->driver->ops.delete(resource->id);
171 resource_id_list = find_resource_id_list(resource->resource_type);
172 if (resource_id_list) {
173 *resource_id_list = g_list_remove(*resource_id_list, GINT_TO_POINTER(resource->id));
174 if (*resource_id_list == NULL)
175 g_hash_table_remove(g_resource_id_list_hash_table, resource_id_list);
178 free_resource(resource);
181 static int add_resource(struct syscommon_resman_resource *resource)
183 GList **resource_id_list = NULL;
188 if (!g_resource_hash_table) {
189 g_resource_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, delete_resource);
190 if (!g_resource_hash_table)
194 if (!g_resource_id_list_hash_table) {
195 g_resource_id_list_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free);
196 if (!g_resource_id_list_hash_table)
200 resource_id_list = find_resource_id_list(resource->resource_type);
201 if (!resource_id_list) {
202 resource_id_list = (GList **) calloc(1, sizeof(void *));
203 if (!resource_id_list)
205 g_hash_table_insert(g_resource_id_list_hash_table, GINT_TO_POINTER(resource->resource_type), resource_id_list);
208 g_hash_table_insert(g_resource_hash_table, GINT_TO_POINTER(resource->id), resource);
209 *resource_id_list = g_list_append(*resource_id_list, GINT_TO_POINTER(resource->id));
214 static struct syscommon_resman_resource * find_resource(int id)
216 if (!g_resource_hash_table)
219 return g_hash_table_lookup(g_resource_hash_table, GINT_TO_POINTER(id));
222 static gint __compare_resource_type(gconstpointer data, gconstpointer input)
224 struct syscommon_resman_resource_driver *driver;
225 int type = *(int *)input;
227 driver = (struct syscommon_resman_resource_driver *)data;
229 if (driver && driver->type == type)
234 const struct syscommon_resman_resource_driver *
235 syscommon_resman_find_resource_driver(int resource_type)
239 node = g_list_find_custom(g_resource_driver_head,
240 &resource_type, __compare_resource_type);
244 return (struct syscommon_resman_resource_driver *)node->data;
247 int syscommon_resman_get_number_of_resource_instance(int resource_type, int *n_instance)
249 GList **resource_id_list = NULL;
251 resource_id_list = find_resource_id_list(resource_type);
252 if (!resource_id_list)
255 *n_instance = g_list_length(*resource_id_list);
260 int syscommon_resman_get_resource_id(int resource_type, int *resource_id)
262 GList **resource_id_list = NULL;
264 resource_id_list = find_resource_id_list(resource_type);
265 if (!resource_id_list)
268 *resource_id = GPOINTER_TO_INT(g_list_nth_data(*resource_id_list, 0));
274 syscommon_resman_add_resource_driver(const struct syscommon_resman_resource_driver *driver)
279 g_resource_driver_head =
280 g_list_append(g_resource_driver_head, (gpointer)driver);
284 syscommon_resman_remove_resource_driver(const struct syscommon_resman_resource_driver *driver)
289 g_resource_driver_head =
290 g_list_remove(g_resource_driver_head, (gpointer)driver);
293 void syscommon_resman_delete_resource(int resource_id)
295 if (!g_resource_hash_table)
298 g_hash_table_remove(g_resource_hash_table, GINT_TO_POINTER(resource_id));
302 create_resource(int *resource_id, int resource_type, int instance_type)
304 const struct syscommon_resman_resource_driver *driver = NULL;
305 struct syscommon_resman_resource *resource = NULL;
311 driver = syscommon_resman_find_resource_driver(resource_type);
315 resource = calloc(1, sizeof(*resource));
319 resource->id = alloc_resource_id();
320 resource->resource_type = resource_type;
321 resource->instance_type = instance_type;
322 resource->name = g_strdup(driver->name);
323 resource->driver = driver;
324 resource->num_attrs = driver->num_attrs;
325 resource->attrs = driver->attrs;
326 resource->attrs_value = calloc(resource->num_attrs,
327 sizeof(*resource->attrs_value));
328 if (!resource->attrs_value) {
329 free_resource(resource);
333 ret = add_resource(resource);
335 free_resource(resource);
339 for (i = 0; i < resource->num_attrs; i++)
340 resource->attrs_value[i].type = driver->attrs[i].type;
342 resource->ctrls = driver->ctrls;
343 resource->num_ctrls = driver->num_ctrls;
344 resource->flag = SYSCOMMON_RESMAN_RESOURCE_FLAG_PRIVATE;
346 if (driver->ops.create) {
347 ret = driver->ops.create(resource->id);
349 g_hash_table_remove(g_resource_hash_table, GINT_TO_POINTER(resource->id));
354 *resource_id = resource->id;
359 static int set_resource_attr_interest_all(struct syscommon_resman_resource *resource)
363 if (!resource || !resource->num_attrs)
366 all = (1ULL << resource->num_attrs) - 1;
368 return set_resource_attr_interest(resource, all);
372 syscommon_resman_create_resource(int *resource_id, int resource_type)
375 struct syscommon_resman_resource *resource = NULL;
377 ret = create_resource(resource_id, resource_type, INSTANCE_TYPE_NORMAL);
381 resource = find_resource(*resource_id);
384 ret = set_resource_attr_interest_all(resource);
386 syscommon_resman_delete_resource(resource->id);
394 syscommon_resman_monitor_create_resource(int *resource_id, int resource_type)
396 return create_resource(resource_id, resource_type, INSTANCE_TYPE_MONITOR);
400 syscommon_resman_set_resource_flag(int resource_id, u_int64_t flag_mask)
402 struct syscommon_resman_resource *resource = find_resource(resource_id);
407 resource->flag = flag_mask;
412 syscommon_resman_set_resource_control(int resource_id, u_int64_t ctrl_id, const void *data)
414 const struct syscommon_resman_resource_control *ctrl;
417 struct syscommon_resman_resource *resource;
422 resource = find_resource(resource_id);
426 ctrl_index = RESOURCE_CTRL_INDEX(ctrl_id);
427 if (ctrl_index >= resource->num_ctrls)
430 ctrl = &resource->ctrls[ctrl_index];
434 ret = ctrl->ops.set(resource_id, ctrl, data);
442 syscommon_resman_get_resource_control_name(int resource_id, u_int64_t ctrl_id)
444 const struct syscommon_resman_resource_control *ctrl;
446 struct syscommon_resman_resource *resource;
451 resource = find_resource(resource_id);
455 ctrl_index = RESOURCE_CTRL_INDEX(ctrl_id);
456 if (ctrl_index >= resource->num_ctrls)
459 ctrl = &resource->ctrls[ctrl_index];
465 update_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id)
468 const struct syscommon_resman_resource_attribute *attr = NULL;
469 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
472 if (!resource || attr_id == 0)
475 attr_index = RESOURCE_ATTR_INDEX(attr_id);
476 if (attr_index >= resource->num_attrs)
479 attr = &resource->attrs[attr_index];
484 attr_value = &resource->attrs_value[attr_index];
486 ret = attr->ops.get(resource->id, attr, attr_value->data);
494 update_resource_attr_with_1_user_data(struct syscommon_resman_resource *resource, u_int64_t attr_id,
495 u_int64_t *user_data1, int user_count1)
498 const struct syscommon_resman_resource_attribute *attr = NULL;
499 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
502 if (!resource || attr_id == 0)
505 attr_index = RESOURCE_ATTR_INDEX(attr_id);
506 if (attr_index >= resource->num_attrs)
509 attr = &resource->attrs[attr_index];
514 attr_value = &resource->attrs_value[attr_index];
516 ret = attr->ops.get_with_1_user_data(resource->id, attr,
517 user_data1, user_count1, attr_value->data);
525 update_resource_attr_with_2_user_data(struct syscommon_resman_resource *resource, u_int64_t attr_id,
526 u_int64_t *user_data1, u_int64_t *user_data2,
527 int user_count1, int user_count2)
530 const struct syscommon_resman_resource_attribute *attr = NULL;
531 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
534 if (!resource || attr_id == 0)
537 attr_index = RESOURCE_ATTR_INDEX(attr_id);
538 if (attr_index >= resource->num_attrs)
541 attr = &resource->attrs[attr_index];
546 attr_value = &resource->attrs_value[attr_index];
548 ret = attr->ops.get_with_2_user_data(resource->id, attr,
549 user_data1, user_data2,
550 user_count1, user_count2, attr_value->data);
558 monitor_update_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id)
561 const struct syscommon_resman_resource_attribute *attr = NULL;
562 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
565 if (!resource || attr_id == 0)
568 attr_index = RESOURCE_ATTR_INDEX(attr_id);
569 if (attr_index >= resource->num_attrs)
572 attr = &resource->attrs[attr_index];
574 if (!attr->monitor_ops.get)
577 attr_value = &resource->attrs_value[attr_index];
579 ret = attr->monitor_ops.get(resource->id, attr, attr_value->data);
586 static bool is_valid_resource(struct syscommon_resman_resource *resource, int instance_type)
588 return (resource && resource->instance_type == instance_type);
592 syscommon_resman_monitor_update_resource_attrs(int resource_id)
595 struct syscommon_resman_resource *resource = find_resource(resource_id);
597 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
600 if (resource->driver && resource->driver->ops.prepare_update) {
601 ret = resource->driver->ops.prepare_update(resource->id);
606 for (i = 0; i < resource->num_attrs; i++) {
607 if (!(resource->attrs[i].id & resource->attr_interest))
609 monitor_update_resource_attr(resource, resource->attrs[i].id);
615 static const struct syscommon_resman_resource_attribute *
616 get_resource_attr(struct syscommon_resman_resource *resource, u_int64_t attr_id)
620 if (!resource || attr_id == 0)
623 attr_index = RESOURCE_ATTR_INDEX(attr_id);
624 if (attr_index >= resource->num_attrs)
627 return &resource->attrs[attr_index];
630 const struct syscommon_resman_resource_attribute *
631 syscommon_resman_get_resource_attr(int resource_id, u_int64_t attr_id)
633 struct syscommon_resman_resource *resource = find_resource(resource_id);
635 return get_resource_attr(resource, attr_id);
638 static struct syscommon_resman_resource_attribute_value *
639 get_resource_attr_value(struct syscommon_resman_resource *resource, u_int64_t attr_id)
643 if (!resource || attr_id == 0)
646 attr_index = RESOURCE_ATTR_INDEX(attr_id);
647 if (attr_index >= resource->num_attrs)
650 return &resource->attrs_value[attr_index];
653 struct syscommon_resman_resource_attribute_value *
654 syscommon_resman_get_resource_attr_value(int resource_id, u_int64_t attr_id)
656 struct syscommon_resman_resource *resource = find_resource(resource_id);
658 return get_resource_attr_value(resource, attr_id);
661 static int select_attribute_is_supported_ops(int instance_type,
662 const struct syscommon_resman_resource_attribute *attr, struct attribute_is_supported_ops *ops)
667 switch (instance_type) {
668 case INSTANCE_TYPE_NORMAL:
669 ops->is_supported = attr->ops.is_supported;
670 ops->get = attr->ops.get;
672 case INSTANCE_TYPE_MONITOR:
673 ops->is_supported = attr->monitor_ops.is_supported;
674 ops->get = attr->monitor_ops.get;
677 assert(0); // unreachable
683 static int is_resource_attr_supported(struct syscommon_resman_resource *resource, u_int64_t attr_id, bool *supported)
685 const struct syscommon_resman_resource_attribute *attr = NULL;
688 bool is_supported = false;
689 struct attribute_is_supported_ops ops = { 0 , };
694 if (!resource || attr_id == 0) {
699 attr_index = RESOURCE_ATTR_INDEX(attr_id);
700 if (attr_index >= resource->num_attrs) {
705 attr = &resource->attrs[attr_index];
707 /* Select ops for testing support by instance type */
708 ret = select_attribute_is_supported_ops(resource->instance_type, attr, &ops);
714 if (attr->id & resource->attr_supported) {
716 } else if (ops.is_supported) {
717 is_supported = ops.is_supported(resource->id, attr);
718 } else if (ops.get) {
720 * Optionally, if .is_supported ops is not implemented,
721 * use .get ops in order to check whether the resource attribute
722 * is supported or not.
724 char data[SYSCOMMON_RESMAN_BUFF_MAX] = {0, };
726 ret = ops.get(resource->id, attr, (void *)data);
727 is_supported = (ret < 0) ? false : true;
731 resource->attr_supported |= attr->id;
733 *supported = is_supported;
739 syscommon_resman_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported)
741 struct syscommon_resman_resource *resource = find_resource(resource_id);
743 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
746 return is_resource_attr_supported(resource, attr_id, supported);
750 syscommon_resman_monitor_is_resource_attr_supported(int resource_id, u_int64_t attr_id, bool *supported)
752 struct syscommon_resman_resource *resource = find_resource(resource_id);
754 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
757 return is_resource_attr_supported(resource, attr_id, supported);
761 check_attr_validate(struct syscommon_resman_resource *resource,
762 u_int64_t attr_id, int type)
764 const struct syscommon_resman_resource_attribute *attr;
766 attr = get_resource_attr(resource, attr_id);
770 if (attr->type != type)
773 if (!(attr->id & resource->attr_interest))
780 _get_resource_attr_json(const struct syscommon_resman_resource_attribute *attr,
781 const struct syscommon_resman_resource_attribute_value *attr_value)
783 json_object *jobj_attr, *jobj_attr_name, *jobj_attr_type, *jobj_attr_value, *jobj_temp;
784 struct syscommon_resman_array_value *array;
787 switch (attr->type) {
788 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
789 jobj_attr_value = json_object_new_int(*((int32_t *)attr_value->data));
791 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
792 jobj_attr_value = json_object_new_int(*((u_int32_t *)attr_value->data));
794 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
795 jobj_attr_value = json_object_new_int64(*((int64_t *)attr_value->data));
797 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
798 jobj_attr_value = json_object_new_uint64(*((u_int64_t *)attr_value->data));
800 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
801 jobj_attr_value = json_object_new_double(*((double *)attr_value->data));
803 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
804 jobj_attr_value = json_object_new_string((char *)attr_value->data);
806 case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
807 array = attr_value->data;
809 jobj_attr_value = json_object_new_array();
811 switch (array->type) {
812 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
813 for (i = 0; i < array->length; i++) {
814 int32_t *item = array->data;
816 jobj_temp = json_object_new_int(item[i]);
817 json_object_array_add(jobj_attr_value, jobj_temp);
820 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
821 for (i = 0; i < array->length; i++) {
822 u_int32_t *item = array->data;
824 jobj_temp = json_object_new_int(item[i]);
825 json_object_array_add(jobj_attr_value, jobj_temp);
828 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
829 for (i = 0; i < array->length; i++) {
830 int64_t *item = array->data;
832 jobj_temp = json_object_new_int64(item[i]);
833 json_object_array_add(jobj_attr_value, jobj_temp);
836 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
837 for (i = 0; i < array->length; i++) {
838 u_int64_t *item = array->data;
840 jobj_temp = json_object_new_uint64(item[i]);
841 json_object_array_add(jobj_attr_value, jobj_temp);
844 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
845 for (i = 0; i < array->length; i++) {
846 double *item = array->data;
848 jobj_temp = json_object_new_double(item[i]);
849 json_object_array_add(jobj_attr_value, jobj_temp);
852 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
853 for (i = 0; i < array->length; i++) {
854 char **item = array->data;
856 jobj_temp = json_object_new_string(item[i]);
857 json_object_array_add(jobj_attr_value, jobj_temp);
861 json_object_put(jobj_attr_value);
862 jobj_attr_value = json_object_new_null();
866 jobj_attr_value = json_object_new_null();
868 jobj_attr = json_object_new_object();
870 jobj_attr_name = json_object_new_string(attr->name);
872 * Since actually JSON format has no data type limitation itself, in many
873 * cases except converting JSON into json-c, type is not required. So,
874 * for the case of converting JSON generated here to json-c object again
875 * json_type is stored in each attributes.
877 jobj_attr_type = json_object_new_int(json_object_get_type(jobj_attr_value));
879 json_object_object_add(jobj_attr, "name", jobj_attr_name);
880 json_object_object_add(jobj_attr, "json_type", jobj_attr_type);
881 json_object_object_add(jobj_attr, "value", jobj_attr_value);
886 static void _put_resource_attr_json(json_object *jobj_attr)
888 json_object *jobj_attr_value;
890 json_object_object_del(jobj_attr, "name");
891 json_object_object_del(jobj_attr, "json_type");
893 if (json_object_object_get_ex(jobj_attr, "value", &jobj_attr_value) &&
894 json_object_is_type(jobj_attr_value, json_type_array))
895 json_object_array_del_idx(jobj_attr_value, 0,
896 json_object_array_length(jobj_attr_value));
898 json_object_object_del(jobj_attr, "value");
902 syscommon_resman_monitor_get_resource_attrs_json(int resource_id, char **json_string)
904 json_object *jobj_root, *jobj_res_name, *jobj_res_type, *jobj_res_attrs, *jobj_attr;
905 const struct syscommon_resman_resource_attribute *attr;
906 const struct syscommon_resman_resource_attribute_value *attr_value;
907 struct syscommon_resman_resource *resource = find_resource(resource_id);
910 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
913 jobj_root = json_object_new_object();
915 jobj_res_name = json_object_new_string(resource->name);
916 jobj_res_type = json_object_new_int(resource->resource_type);
917 jobj_res_attrs = json_object_new_array();
919 for (i = 0; i < resource->num_attrs; i++) {
920 if (!(resource->attrs[i].id & resource->attr_interest))
923 attr = &resource->attrs[i];
924 attr_value = &resource->attrs_value[i];
926 jobj_attr = _get_resource_attr_json(attr, attr_value);
928 json_object_array_add(jobj_res_attrs, jobj_attr);
931 json_object_object_add(jobj_root, "res_name", jobj_res_name);
932 json_object_object_add(jobj_root, "res_type", jobj_res_type);
933 json_object_object_add(jobj_root, "res_attrs", jobj_res_attrs);
935 *json_string = strdup(json_object_to_json_string(jobj_root));
937 for (i = 0; i < json_object_array_length(jobj_res_attrs); i++) {
938 jobj_attr = json_object_array_get_idx(jobj_res_attrs, i);
939 _put_resource_attr_json(jobj_attr);
941 json_object_array_del_idx(jobj_res_attrs, 0, json_object_array_length(jobj_res_attrs));
943 json_object_object_del(jobj_root, "res_attrs");
944 json_object_object_del(jobj_root, "res_type");
945 json_object_object_del(jobj_root, "res_name");
946 json_object_put(jobj_root);
952 syscommon_resman_monitor_get_resource_attr_json(int resource_id, u_int64_t attr_id, char **json_string)
954 const struct syscommon_resman_resource_attribute *attr;
955 const struct syscommon_resman_resource_attribute_value *attr_value;
956 json_object *jobj_attr;
957 struct syscommon_resman_resource *resource = find_resource(resource_id);
959 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
962 attr = get_resource_attr(resource, attr_id);
963 attr_value = get_resource_attr_value(resource, attr_id);
965 if (!attr || !attr_value)
968 jobj_attr = _get_resource_attr_json(attr, attr_value);
970 *json_string = strdup(json_object_to_json_string(jobj_attr));
972 _put_resource_attr_json(jobj_attr);
978 get_resource_driver_json(const struct syscommon_resman_resource_driver *driver)
980 json_object *jobj_drv, *jobj_drv_name, *jobj_drv_type;
981 json_object *jobj_drv_attrs_array, *jobj_drv_attr, *jobj_drv_ctrls_array, *jobj_drv_ctrl;
982 json_object *jobj_drv_attr_name, *jobj_drv_attr_type, *jobj_drv_attr_id;
983 json_object *jobj_drv_ctrl_name, *jobj_drv_ctrl_id;
984 const struct syscommon_resman_resource_attribute *attr;
985 const struct syscommon_resman_resource_control *ctrl;
988 jobj_drv = json_object_new_object();
990 jobj_drv_name = json_object_new_string(driver->name);
991 jobj_drv_type = json_object_new_int(driver->type);
993 jobj_drv_attrs_array = json_object_new_array();
995 for (i = 0; i < driver->num_attrs; i++) {
996 attr = &driver->attrs[i];
998 jobj_drv_attr = json_object_new_object();
1000 jobj_drv_attr_name = json_object_new_string(attr->name);
1001 jobj_drv_attr_type = json_object_new_int(attr->type);
1002 jobj_drv_attr_id = json_object_new_uint64(attr->id);
1004 json_object_object_add(jobj_drv_attr, "name", jobj_drv_attr_name);
1005 json_object_object_add(jobj_drv_attr, "type", jobj_drv_attr_type);
1006 json_object_object_add(jobj_drv_attr, "id", jobj_drv_attr_id);
1008 json_object_array_add(jobj_drv_attrs_array, jobj_drv_attr);
1011 jobj_drv_ctrls_array = json_object_new_array();
1013 for (i = 0; i < driver->num_ctrls; i++) {
1014 ctrl = &driver->ctrls[i];
1016 jobj_drv_ctrl = json_object_new_object();
1018 jobj_drv_ctrl_name = json_object_new_string(ctrl->name);
1019 jobj_drv_ctrl_id = json_object_new_uint64(ctrl->id);
1021 json_object_object_add(jobj_drv_ctrl, "name", jobj_drv_ctrl_name);
1022 json_object_object_add(jobj_drv_ctrl, "id", jobj_drv_ctrl_id);
1024 json_object_array_add(jobj_drv_ctrls_array, jobj_drv_ctrl);
1027 json_object_object_add(jobj_drv, "name", jobj_drv_name);
1028 json_object_object_add(jobj_drv, "type", jobj_drv_type);
1029 json_object_object_add(jobj_drv, "attrs", jobj_drv_attrs_array);
1030 json_object_object_add(jobj_drv, "ctrls", jobj_drv_ctrls_array);
1035 static void put_resource_driver_json(json_object *jobj_drv)
1037 json_object *jobj_array, *jobj_obj;
1040 if (json_object_object_get_ex(jobj_drv, "ctrls", &jobj_array)) {
1041 for (i = 0; i < json_object_array_length(jobj_array); i++) {
1042 jobj_obj = json_object_array_get_idx(jobj_array, i);
1044 json_object_object_del(jobj_obj, "id");
1045 json_object_object_del(jobj_obj, "name");
1047 json_object_array_del_idx(jobj_array, 0, json_object_array_length(jobj_array));
1050 if (json_object_object_get_ex(jobj_drv, "attrs", &jobj_array)) {
1051 for (i = 0; i < json_object_array_length(jobj_array); i++) {
1052 jobj_obj = json_object_array_get_idx(jobj_array, i);
1054 json_object_object_del(jobj_obj, "id");
1055 json_object_object_del(jobj_obj, "type");
1056 json_object_object_del(jobj_obj, "name");
1058 json_object_array_del_idx(jobj_array, 0, json_object_array_length(jobj_array));
1061 json_object_object_del(jobj_drv, "ctrls");
1062 json_object_object_del(jobj_drv, "attrs");
1063 json_object_object_del(jobj_drv, "type");
1064 json_object_object_del(jobj_drv, "name");
1067 int syscommon_resman_get_resource_list_json(char **json_string)
1069 const struct syscommon_resman_resource_driver *driver;
1070 json_object *jobj_root, *jobj_drvs_array, *jobj_drv;
1073 jobj_root = json_object_new_object();
1074 jobj_drvs_array = json_object_new_array();
1076 for (i = 0; i < g_list_length(g_resource_driver_head); i++) {
1077 driver = g_list_nth(g_list_first(g_resource_driver_head), i)->data;
1079 jobj_drv = get_resource_driver_json(driver);
1080 json_object_array_add(jobj_drvs_array, jobj_drv);
1083 json_object_object_add(jobj_root, "resources", jobj_drvs_array);
1085 *json_string = strdup(json_object_to_json_string(jobj_root));
1087 for (i = 0; i < json_object_array_length(jobj_drvs_array); i++) {
1088 jobj_drv = json_object_array_get_idx(jobj_drvs_array, i);
1090 put_resource_driver_json(jobj_drv);
1092 json_object_array_del_idx(jobj_drvs_array, 0, json_object_array_length(jobj_drvs_array));
1094 json_object_object_del(jobj_root, "resources");
1095 json_object_put(jobj_root);
1101 get_resource_attr_value_data(struct syscommon_resman_resource *resource, u_int64_t attr_id, enum syscommon_resman_data_type type, void *data)
1103 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
1105 if (!check_attr_validate(resource, attr_id, type))
1108 attr_value = get_resource_attr_value(resource, attr_id);
1113 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
1114 *(int *) data = *((int32_t *) attr_value->data);
1116 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
1117 *(int64_t *) data = *((int64_t *) attr_value->data);
1119 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
1120 *(u_int32_t *) data = *((u_int32_t *)attr_value->data);
1122 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
1123 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA:
1124 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA:
1125 *(u_int64_t *) data = *((u_int64_t *)attr_value->data);
1127 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
1128 *(double *) data = *((double *)attr_value->data);
1130 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
1131 strncpy(data, (char *)attr_value->data, SYSCOMMON_RESMAN_BUFF_MAX);
1133 case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
1134 *(struct syscommon_resman_array_value **) data = (struct syscommon_resman_array_value *)attr_value->data;
1136 case SYSCOMMON_RESMAN_DATA_TYPE_PTR:
1137 *(void **) data = attr_value->data;
1139 case SYSCOMMON_RESMAN_DATA_TYPE_BOOLEAN:
1140 case SYSCOMMON_RESMAN_DATA_TYPE_NUM:
1149 syscommon_resman_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data)
1151 struct syscommon_resman_resource *resource = find_resource(resource_id);
1154 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1157 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT))
1160 ret = update_resource_attr(resource, attr_id);
1164 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT, data);
1168 syscommon_resman_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data)
1170 struct syscommon_resman_resource *resource = find_resource(resource_id);
1173 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1176 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64))
1179 ret = update_resource_attr(resource, attr_id);
1183 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64, data);
1187 syscommon_resman_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data)
1189 struct syscommon_resman_resource *resource = find_resource(resource_id);
1192 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1195 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT))
1198 ret = update_resource_attr(resource, attr_id);
1202 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT, data);
1206 syscommon_resman_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data)
1208 struct syscommon_resman_resource *resource = find_resource(resource_id);
1211 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1214 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64))
1217 ret = update_resource_attr(resource, attr_id);
1221 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64, data);
1225 syscommon_resman_get_resource_attr_uint64_with_1_user_data(int resource_id, u_int64_t attr_id, u_int64_t *user_data1, u_int64_t *data)
1227 struct syscommon_resman_resource *resource = find_resource(resource_id);
1230 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1233 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA))
1236 ret = update_resource_attr_with_1_user_data(resource, attr_id, user_data1, 1);
1240 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA, data);
1244 syscommon_resman_get_resource_attr_uint64_with_2_user_data(int resource_id, u_int64_t attr_id, u_int64_t *user_data1, u_int64_t *user_data2, u_int64_t *data)
1246 struct syscommon_resman_resource *resource = find_resource(resource_id);
1249 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1252 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA))
1255 ret = update_resource_attr_with_2_user_data(resource, attr_id, user_data1, user_data2, 1, 1);
1259 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA, data);
1263 syscommon_resman_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data)
1265 struct syscommon_resman_resource *resource = find_resource(resource_id);
1268 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1271 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE))
1274 ret = update_resource_attr(resource, attr_id);
1278 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE, data);
1282 syscommon_resman_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data)
1284 struct syscommon_resman_resource *resource = find_resource(resource_id);
1287 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1290 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING))
1293 ret = update_resource_attr(resource, attr_id);
1297 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING, data);
1301 syscommon_resman_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data)
1303 struct syscommon_resman_resource *resource = find_resource(resource_id);
1306 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1309 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY))
1312 ret = update_resource_attr(resource, attr_id);
1316 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY, data);
1320 syscommon_resman_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data)
1322 struct syscommon_resman_resource *resource = find_resource(resource_id);
1325 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1328 if (!check_attr_validate(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR))
1331 ret = update_resource_attr(resource, attr_id);
1335 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, data);
1339 syscommon_resman_monitor_get_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t *data)
1341 struct syscommon_resman_resource *resource = find_resource(resource_id);
1343 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1346 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT, data);
1350 syscommon_resman_monitor_get_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t *data)
1352 struct syscommon_resman_resource *resource = find_resource(resource_id);
1354 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1357 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64, data);
1361 syscommon_resman_monitor_get_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t *data)
1363 struct syscommon_resman_resource *resource = find_resource(resource_id);
1365 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1368 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT, data);
1372 syscommon_resman_monitor_get_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t *data)
1374 struct syscommon_resman_resource *resource = find_resource(resource_id);
1376 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1379 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64, data);
1383 syscommon_resman_monitor_get_resource_attr_double(int resource_id, u_int64_t attr_id, double *data)
1385 struct syscommon_resman_resource *resource = find_resource(resource_id);
1387 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1390 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE, data);
1394 syscommon_resman_monitor_get_resource_attr_string(int resource_id, u_int64_t attr_id, char *data)
1396 struct syscommon_resman_resource *resource = find_resource(resource_id);
1398 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1401 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING, data);
1405 syscommon_resman_monitor_get_resource_attr_array(int resource_id, u_int64_t attr_id, struct syscommon_resman_array_value **data)
1407 struct syscommon_resman_resource *resource = find_resource(resource_id);
1409 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1412 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY, data);
1416 syscommon_resman_monitor_get_resource_attr_ptr(int resource_id, u_int64_t attr_id, void **data)
1418 struct syscommon_resman_resource *resource = find_resource(resource_id);
1420 if (!is_valid_resource(resource, INSTANCE_TYPE_MONITOR))
1423 return get_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, data);
1427 set_resource_attr_value_data(struct syscommon_resman_resource *resource,
1428 u_int64_t attr_id, enum syscommon_resman_data_type type, const void *data, int count)
1430 const struct syscommon_resman_resource_attribute *attr = NULL;
1431 struct syscommon_resman_resource_attribute_value *attr_value = NULL;
1437 if (!check_attr_validate(resource, attr_id, type))
1440 attr = get_resource_attr(resource, attr_id);
1441 if (!attr || !attr->ops.set)
1444 attr_value = get_resource_attr_value(resource, attr_id);
1448 ret = attr->ops.set(resource->id, attr, data, count);
1452 /* TODO: We need to discuss about updating attr_value->data after ops.set() */
1454 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
1455 *((int32_t *) attr_value->data) = *(int32_t *) data;
1457 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
1458 *((int64_t *) attr_value->data) = *(int64_t *) data;
1460 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
1461 *((u_int32_t *) attr_value->data) = *(u_int32_t *) data;
1463 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
1464 *((u_int64_t *) attr_value->data) = *(u_int64_t *) data;
1466 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
1467 *((double *) attr_value->data) = *(double *) data;
1469 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
1470 strncpy((char *) attr_value->data, data, SYSCOMMON_RESMAN_BUFF_MAX);
1472 case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
1473 attr_value->data = *(struct syscommon_resman_array_value **) data;
1475 case SYSCOMMON_RESMAN_DATA_TYPE_PTR:
1476 attr_value->data = *(void **) data;
1478 case SYSCOMMON_RESMAN_DATA_TYPE_BOOLEAN:
1479 case SYSCOMMON_RESMAN_DATA_TYPE_NUM:
1484 notify_resource_event(resource->resource_type, resource->id, attr_id, attr_value->data, count);
1490 set_resource_attr_value_data_2_tuple(struct syscommon_resman_resource *resource,
1491 u_int64_t attr_id, enum syscommon_resman_data_type type,
1492 const void *data1, const void *data2,
1493 int count1, int count2)
1495 const struct syscommon_resman_resource_attribute *attr = NULL;
1498 if (!data1 || !data2)
1501 if (!check_attr_validate(resource, attr_id, type))
1504 attr = get_resource_attr(resource, attr_id);
1508 if (!attr->ops.set_2_tuple)
1511 ret = attr->ops.set_2_tuple(resource->id, attr,
1512 data1, data2, count1, count2);
1517 * FIXME: N-tuple data doesn't support the getter temporarily.
1518 * So that don't store the passed data to attr_value.
1519 * I will be implemented for getter on later.
1526 set_resource_attr_value_data_3_tuple(struct syscommon_resman_resource *resource,
1527 u_int64_t attr_id, enum syscommon_resman_data_type type,
1528 const void *data1, const void *data2, const void *data3,
1529 int count1, int count2, int count3)
1531 const struct syscommon_resman_resource_attribute *attr = NULL;
1534 if (!data1 || !data2 || !data3)
1537 if (!check_attr_validate(resource, attr_id, type))
1540 attr = get_resource_attr(resource, attr_id);
1544 if (!attr->ops.set_3_tuple)
1547 ret = attr->ops.set_3_tuple(resource->id, attr,
1548 data1, data2, data3,
1549 count1, count2, count3);
1554 * FIXME: N-tuple data doesn't support the getter temporarily.
1555 * So that don't store the passed data to attr_value.
1556 * I will be implemented for getter on later.
1563 set_resource_attr_value_data_4_tuple(struct syscommon_resman_resource *resource,
1564 u_int64_t attr_id, enum syscommon_resman_data_type type,
1565 const void *data1, const void *data2, const void *data3, const void *data4,
1566 int count1, int count2, int count3, int count4)
1568 const struct syscommon_resman_resource_attribute *attr = NULL;
1571 if (!data1 || !data2 || !data3 || !data4)
1574 if (!check_attr_validate(resource, attr_id, type))
1577 attr = get_resource_attr(resource, attr_id);
1581 if (!attr->ops.set_4_tuple)
1584 ret = attr->ops.set_4_tuple(resource->id, attr,
1585 data1, data2, data3, data4,
1586 count1, count2, count3, count4);
1591 * FIXME: N-tuple data doesn't support the getter temporarily.
1592 * So that don't store the passed data to attr_value.
1593 * I will be implemented for getter on later.
1600 syscommon_resman_set_resource_attr_int(int resource_id, u_int64_t attr_id, int32_t data)
1602 struct syscommon_resman_resource *resource = find_resource(resource_id);
1604 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1607 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT, &data, 1);
1611 syscommon_resman_set_resource_attr_int64(int resource_id, u_int64_t attr_id, int64_t data)
1613 struct syscommon_resman_resource *resource = find_resource(resource_id);
1615 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1618 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_INT64, &data, 1);
1622 syscommon_resman_set_resource_attr_uint(int resource_id, u_int64_t attr_id, u_int32_t data)
1624 struct syscommon_resman_resource *resource = find_resource(resource_id);
1626 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1629 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT, &data, 1);
1633 syscommon_resman_set_resource_attr_uint64(int resource_id, u_int64_t attr_id, u_int64_t data)
1635 struct syscommon_resman_resource *resource = find_resource(resource_id);
1637 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1640 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_UINT64, &data, 1);
1644 syscommon_resman_set_resource_attr_double(int resource_id, u_int64_t attr_id, double data)
1646 struct syscommon_resman_resource *resource = find_resource(resource_id);
1648 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1651 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE, &data, 1);
1655 syscommon_resman_set_resource_attr_string(int resource_id, u_int64_t attr_id, char data)
1657 struct syscommon_resman_resource *resource = find_resource(resource_id);
1659 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1662 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_STRING, &data, 1);
1666 syscommon_resman_set_resource_attr_array(int resource_id, u_int64_t attr_id, void *data, int count)
1668 struct syscommon_resman_resource *resource = find_resource(resource_id);
1670 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1673 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_ARRAY, &data, count);
1677 syscommon_resman_set_resource_attr_ptr(int resource_id, u_int64_t attr_id, void *data)
1679 struct syscommon_resman_resource *resource = find_resource(resource_id);
1681 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1684 return set_resource_attr_value_data(resource, attr_id, SYSCOMMON_RESMAN_DATA_TYPE_PTR, &data, 1);
1688 syscommon_resman_set_resource_attr_uint64_2(int resource_id, u_int64_t attr_id,
1689 u_int64_t data1, u_int64_t data2)
1691 struct syscommon_resman_resource *resource = find_resource(resource_id);
1693 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1696 return set_resource_attr_value_data_2_tuple(resource, attr_id,
1697 SYSCOMMON_RESMAN_DATA_TYPE_2_UINT64,
1698 &data1, &data2, 1, 1);
1702 syscommon_resman_set_resource_attr_uint64_3(int resource_id, u_int64_t attr_id,
1703 u_int64_t data1, u_int64_t data2, u_int64_t data3)
1705 struct syscommon_resman_resource *resource = find_resource(resource_id);
1707 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1710 return set_resource_attr_value_data_3_tuple(resource, attr_id,
1711 SYSCOMMON_RESMAN_DATA_TYPE_3_UINT64,
1712 &data1, &data2, &data3, 1, 1, 1);
1716 syscommon_resman_set_resource_attr_uint64_4(int resource_id, u_int64_t attr_id,
1717 u_int64_t data1, u_int64_t data2, u_int64_t data3, u_int64_t data4)
1719 struct syscommon_resman_resource *resource = find_resource(resource_id);
1721 if (!is_valid_resource(resource, INSTANCE_TYPE_NORMAL))
1724 return set_resource_attr_value_data_4_tuple(resource, attr_id,
1725 SYSCOMMON_RESMAN_DATA_TYPE_4_UINT64,
1726 &data1, &data2, &data3, &data4, 1, 1, 1, 1);
1730 is_resource_attr_visible(struct syscommon_resman_resource *resource,
1731 const struct syscommon_resman_resource_attribute *attr)
1733 u_int64_t res_visibility, attr_visibility;
1735 res_visibility = resource->flag & RESOURCE_FLAG_VISIBILITY_MASK;
1736 attr_visibility = attr->flag & RESOURCE_ATTR_FLAG_VISIBILITY_MASK;
1738 /* bigger visibility means smaller privilege */
1739 if (res_visibility > attr_visibility)
1746 set_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask)
1748 struct syscommon_resman_resource_attribute_value *attr_value;
1751 bool setter_only = false;
1756 for (i = 0; i < resource->num_attrs; i++) {
1757 if (!(resource->attrs[i].id & interest_mask))
1760 ret = is_resource_attr_supported(resource, resource->attrs[i].id, &supported);
1763 } else if (!supported) {
1768 if (!is_resource_attr_visible(resource, &resource->attrs[i])) {
1773 attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
1779 if (resource->attrs[i].listener_ops.init) {
1780 ret = resource->attrs[i].listener_ops.init(resource->id, &resource->attrs[i]);
1786 * In resource monitor, each resource has a lot of attributes, but
1787 * only updated attributes are selected by clients on demand. So,
1788 * instead of allocating memory at the resource creation, allocate
1789 * at the set interest.
1791 if (!attr_value->data) {
1792 switch (attr_value->type) {
1793 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
1794 attr_value->data = calloc(1, sizeof(int32_t));
1796 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
1797 attr_value->data = calloc(1, sizeof(int64_t));
1799 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
1800 attr_value->data = calloc(1, sizeof(u_int32_t));
1802 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
1803 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA:
1804 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA:
1805 attr_value->data = calloc(1, sizeof(u_int64_t));
1807 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
1808 attr_value->data = calloc(1, sizeof(double));
1810 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
1811 attr_value->data = calloc(SYSCOMMON_RESMAN_BUFF_MAX, sizeof(char));
1813 case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
1814 attr_value->data = calloc(1, sizeof(struct syscommon_resman_array_value));
1816 case SYSCOMMON_RESMAN_DATA_TYPE_2_UINT64:
1817 case SYSCOMMON_RESMAN_DATA_TYPE_3_UINT64:
1818 case SYSCOMMON_RESMAN_DATA_TYPE_4_UINT64:
1820 * FIXME: N-tuple data doesn't support the getter temporarily.
1821 * Don't store the passed data to attr_value.
1822 * So that don't allocate the memory for attr_value->data.
1823 * I will be implemented on later.
1832 if (!setter_only && !attr_value->data) {
1839 resource->attr_interest |= interest_mask;
1844 for (; i >= 0; i--) {
1845 if (!(resource->attrs[i].id & interest_mask))
1848 if (resource->attrs[i].listener_ops.exit)
1849 resource->attrs[i].listener_ops.exit(resource->id, &resource->attrs[i]);
1851 attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
1855 if (attr_value->data) {
1856 free(attr_value->data);
1857 attr_value->data = NULL;
1865 syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_mask)
1867 struct syscommon_resman_resource *resource = find_resource(resource_id);
1869 return set_resource_attr_interest(resource, interest_mask);
1873 unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64_t interest_mask)
1875 struct syscommon_resman_resource_attribute_value *attr_value;
1881 if (!is_resource_attr_interested(resource, interest_mask))
1884 for (i = 0; i < resource->num_attrs; i++) {
1885 if (!(resource->attrs[i].id & interest_mask))
1888 if (resource->attrs[i].listener_ops.exit)
1889 resource->attrs[i].listener_ops.exit(resource->id, &resource->attrs[i]);
1891 attr_value = get_resource_attr_value(resource, resource->attrs[i].id);
1895 if (attr_value->data) {
1896 switch (attr_value->type) {
1897 case SYSCOMMON_RESMAN_DATA_TYPE_ARRAY:
1899 struct syscommon_resman_array_value *array = attr_value->data;
1907 case SYSCOMMON_RESMAN_DATA_TYPE_INT:
1908 case SYSCOMMON_RESMAN_DATA_TYPE_INT64:
1909 case SYSCOMMON_RESMAN_DATA_TYPE_UINT:
1910 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64:
1911 case SYSCOMMON_RESMAN_DATA_TYPE_DOUBLE:
1912 case SYSCOMMON_RESMAN_DATA_TYPE_STRING:
1913 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_1_USER_DATA:
1914 case SYSCOMMON_RESMAN_DATA_TYPE_UINT64_WITH_2_USER_DATA:
1915 free(attr_value->data);
1916 attr_value->data = NULL;
1924 resource->attr_interest &= ~interest_mask;
1930 syscommon_resman_unset_resource_attr_interest(int resource_id, u_int64_t interest_mask)
1932 struct syscommon_resman_resource *resource = find_resource(resource_id);
1934 return unset_resource_attr_interest(resource, interest_mask);
1938 is_resource_attr_interested(struct syscommon_resman_resource *resource,
1939 u_int64_t interest_mask)
1944 if (resource->attr_interest != (resource->attr_interest | interest_mask))
1951 syscommon_resman_is_resource_attr_interested(int resource_id, u_int64_t interest_mask)
1953 struct syscommon_resman_resource *resource = find_resource(resource_id);
1955 return is_resource_attr_interested(resource, interest_mask);
1959 notify_resource_event(int resource_type, int resource_id, u_int64_t attr_id, const void *data, int count)
1962 struct resource_event_data *event_data;
1964 for (elem = g_resource_event_data_list; elem; elem = elem->next) {
1965 event_data = (struct resource_event_data *) elem->data;
1969 if ((event_data->resource_type != RESOURCE_TYPE_ALL) && (event_data->resource_type != resource_type))
1972 if ((event_data->attr_mask & attr_id) == 0)
1975 event_data->callback(resource_type, resource_id, attr_id, data, event_data->user_data, count);
1979 static gboolean find_resource_event_data(gconstpointer data, gconstpointer id)
1981 const struct resource_event_data *_event_data = (const struct resource_event_data *) data;
1982 const int _id = *(const int *) id;
1984 return (_event_data->id - _id);
1987 int syscommon_resman_subscribe_resource_attribute_event(int resource_type,
1988 u_int64_t attr_mask, syscommon_resman_resource_event_cb callback, void *user_data, int *id)
1990 struct resource_event_data *event_data = NULL;
1992 if (!callback || !id)
1995 event_data = calloc(1, sizeof(*event_data));
1999 *event_data = (struct resource_event_data) {
2000 .id = alloc_resource_id(),
2001 .resource_type = resource_type,
2002 .attr_mask = attr_mask,
2003 .callback = callback,
2004 .user_data = user_data,
2007 g_resource_event_data_list = g_list_append(g_resource_event_data_list, event_data);
2009 *id = event_data->id;
2014 int syscommon_resman_subscribe_resource_event(int resource_type,
2015 syscommon_resman_resource_event_cb callback, void *user_data, int *id)
2017 return syscommon_resman_subscribe_resource_attribute_event(resource_type,
2018 RESOURCE_ATTR_ALL, callback, user_data, id);
2021 int syscommon_resman_subscribe_event(syscommon_resman_resource_event_cb callback,
2022 void *user_data, int *id)
2024 return syscommon_resman_subscribe_resource_event(RESOURCE_TYPE_ALL, callback, user_data, id);
2027 void syscommon_resman_unsubscribe_event(int id)
2031 list = g_list_find_custom(g_resource_event_data_list, &id, find_resource_event_data);
2035 g_resource_event_data_list = g_list_remove_link(g_resource_event_data_list, list);
2043 syscommon_resman_get_resource_attr_name(int resource_id, u_int64_t attr_id)
2045 const struct syscommon_resman_resource_attribute *attr;
2046 struct syscommon_resman_resource *resource = find_resource(resource_id);
2048 attr = get_resource_attr(resource, attr_id);
2056 *syscommon_resman_get_resource_name(int resource_id)
2058 struct syscommon_resman_resource *resource = find_resource(resource_id);
2060 return resource ? resource->name : NULL;
2064 syscommon_resman_get_resource_privdata(int resource_id)
2066 struct syscommon_resman_resource *resource = find_resource(resource_id);
2068 return resource ? resource->priv : NULL;
2072 syscommon_resman_get_resource_type(int resource_id)
2074 struct syscommon_resman_resource *resource = find_resource(resource_id);
2076 return resource ? resource->resource_type : -EINVAL;
2080 syscommon_resman_set_resource_privdata(int resource_id, void *priv)
2082 struct syscommon_resman_resource *resource = find_resource(resource_id);
2087 resource->priv = priv;
2092 static void init_resource_driver(gpointer data, gpointer udata)
2094 struct syscommon_resman_resource_driver *driver = (struct syscommon_resman_resource_driver *) data;
2097 if (driver && driver->ops.init) {
2098 ret = driver->ops.init();
2100 syscommon_resman_remove_resource_driver(driver);
2104 static void exit_resource_driver(gpointer data, gpointer udata)
2106 struct syscommon_resman_resource_driver *driver = (struct syscommon_resman_resource_driver *) data;
2108 if (driver && driver->ops.exit)
2112 void syscommon_resman_init_resource_drivers(void)
2114 g_list_foreach(g_resource_driver_head, init_resource_driver, NULL);
2117 void syscommon_resman_exit_resource_drivers(void)
2119 g_list_foreach(g_resource_driver_head, exit_resource_driver, NULL);