From: Dongwoo Lee Date: Thu, 12 Jan 2023 01:01:22 +0000 (+0900) Subject: resource-manager: Introduce attribute listener operations X-Git-Tag: accepted/tizen/7.0/unified/20230216.140319~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=35c859849daa2df0cb49d8664ecaf19a0ad79a19;p=platform%2Fcore%2Fsystem%2Flibsyscommon.git resource-manager: Introduce attribute listener operations Now each attribute can have 'listener_ops' which consists 'init', 'exit', and 'action', to watch changes for underlying state. Each operation has a role as below: - init: allocate resources and register listeners - exit: deallocate resources and unregister listeners - action: change attribute values as following listener parameters 'init'/'exit' is called automatically when each attribute interest is set/unset each, on the other hand, 'action' should be called by each listener. Change-Id: Ia2ae47ee1f7bfb42baed4ab6ddb8be545d42cee1 Signed-off-by: Dongwoo Lee --- diff --git a/CMakeLists.txt b/CMakeLists.txt index d9d7f07..50dabeb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ SET(HEADERS src/resource-manager/resource-manager.h src/resource-manager/resource-type.h src/resource-manager/resource-device.h + src/resource-manager/resource-listener.h ) # CHECK PKG diff --git a/src/resource-manager/resource-listener.h b/src/resource-manager/resource-listener.h new file mode 100644 index 0000000..980cf00 --- /dev/null +++ b/src/resource-manager/resource-listener.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RESOURCE_LISTENER_H__ +#define __RESOURCE_LISTENER_H__ + +enum syscommon_resman_listener_type { + SYSCOMMON_RESMAN_LISTENER_TYPE_UNKNOWN, + SYSCOMMON_RESMAN_LISTENER_TYPE_EPOLL, + SYSCOMMON_RESMAN_LISTENER_TYPE_UEVENT, + SYSCOMMON_RESMAN_LISTENER_TYPE_TIMER, + SYSCOMMON_RESMAN_LISTENER_TYPE_MAX, +}; + +#endif diff --git a/src/resource-manager/resource-manager.c b/src/resource-manager/resource-manager.c index fb01cd6..f3beaf6 100644 --- a/src/resource-manager/resource-manager.c +++ b/src/resource-manager/resource-manager.c @@ -970,6 +970,12 @@ syscommon_resman_set_resource_attr_interest(int resource_id, u_int64_t interest_ goto err; } + if (resource->attrs[i].listener_ops.init) { + ret = resource->attrs[i].listener_ops.init(resource_id, &resource->attrs[i]); + if (ret < 0) + goto err; + } + /* * In resource monitor, each resource has a lot of attributes, but * only updated attributes are selected by clients on demand. So, @@ -1020,6 +1026,9 @@ err: if (!(resource->attrs[i].id & interest_mask)) continue; + if (resource->attrs[i].listener_ops.exit) + 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) continue; @@ -1049,6 +1058,9 @@ unset_resource_attr_interest(struct syscommon_resman_resource *resource, u_int64 if (!(resource->attrs[i].id & interest_mask)) continue; + if (resource->attrs[i].listener_ops.exit) + 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 -EINVAL; diff --git a/src/resource-manager/resource-manager.h b/src/resource-manager/resource-manager.h index 4ebf694..4902c70 100644 --- a/src/resource-manager/resource-manager.h +++ b/src/resource-manager/resource-manager.h @@ -26,6 +26,8 @@ #define SYSCOMMON_RESMAN_BUFF_MAX 255 +enum syscommon_resman_listener_type; + struct syscommon_resman_resource_attribute; struct syscommon_resman_resource_control; @@ -55,12 +57,20 @@ struct syscommon_resman_resource_attribute_ops { const struct syscommon_resman_resource_attribute *attr); }; +struct syscommon_resman_resource_attribute_listener_ops { + int (*init)(int resource_id, const struct syscommon_resman_resource_attribute *attr); + void (*exit)(int resource_id, const struct syscommon_resman_resource_attribute *attr); + void (*action)(int resource_id, const struct syscommon_resman_resource_attribute *attr, + void *param, enum syscommon_resman_listener_type listener_type); +}; + struct syscommon_resman_resource_attribute { const char name[SYSCOMMON_RESMAN_BUFF_MAX]; const u_int64_t id; const int type; const u_int64_t flag; const struct syscommon_resman_resource_attribute_ops ops; + const struct syscommon_resman_resource_attribute_listener_ops listener_ops; }; struct syscommon_resman_resource_control_ops {