2 * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "daemon/backend/murphy/mm_resource_manager_rset.h"
20 #include "daemon/backend/murphy/mm_resource_manager_mloop.h"
21 #include "daemon/mm_resource_manager_daemon_priv.h"
25 static mm_resource_manager_mloop_s *mrp;
26 static mm_resource_manager_rset_s *rset[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
30 static void __mm_resource_manager_mloop_error_cb(mm_resource_manager_mloop_s *mrp,
31 mm_resource_manager_mloop_error_e err, void *user_data);
32 static int __mm_resource_manager_add_resource(mm_resource_manager_res_type_e type);
33 static void __mm_resource_manager_release_cb(mm_resource_manager_res_type_e type,
38 int _mm_resource_manager_backend_init(void)
44 for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++)
47 ret = _mm_resource_manager_mloop_create(&mrp);
48 if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
51 ret = _mm_resource_manager_mloop_set_error_cb(mrp,
52 __mm_resource_manager_mloop_error_cb, NULL);
53 if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
56 return MM_RESOURCE_MANAGER_ERROR_NONE;
59 int _mm_resource_manager_backend_deinit()
63 MM_RM_RETVM_IF(mrp == NULL,
64 MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "mloop is NULL");
66 ret = _mm_resource_manager_mloop_destroy(mrp);
72 int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type)
74 gboolean is_run = FALSE;
75 int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
77 MM_RM_RETVM_IF(rset[type] != NULL,
78 MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION,
79 "%s is already acquired", _mm_resource_manager_get_res_str(type));
81 ret = _mm_resource_manager_mloop_is_run(mrp, &is_run);
82 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
83 MM_RM_ERROR("Failed to get is_run property from mloop");
87 MM_RM_ERROR("mloop is not ran");
88 return MM_RESOURCE_MANAGER_ERROR_INVALID_STATE;
91 ret = __mm_resource_manager_add_resource(type);
92 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
93 MM_RM_ERROR("Failed to add resource");
97 ret = _mm_resource_manager_rset_acquire(rset[type]);
98 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
99 MM_RM_ERROR("Failed to acquire rset %p", rset[type]);
100 _mm_resource_manager_backend_release(type);
104 MM_RM_INFO("%s is acquired successfully",
105 _mm_resource_manager_get_res_str(type));
107 return MM_RESOURCE_MANAGER_ERROR_NONE;
110 int _mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
112 gboolean is_run = FALSE;
113 int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
115 MM_RM_RETVM_IF(rset[type] == NULL,
116 MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION,
117 "%s is not acquired", _mm_resource_manager_get_res_str(type));
119 ret = _mm_resource_manager_mloop_is_run(mrp, &is_run);
120 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
121 MM_RM_ERROR("Failed to get is_run property from mloop");
125 MM_RM_ERROR("mloop is not ran");
126 return MM_RESOURCE_MANAGER_ERROR_INVALID_STATE;
129 ret = _mm_resource_manager_rset_destroy(rset[type]);
130 /* rset is destroyed even if the function returns an error */
132 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
133 MM_RM_ERROR("Failed to release rset %p", rset[type]);
137 MM_RM_INFO("%s is released successfully",
138 _mm_resource_manager_get_res_str(type));
140 return MM_RESOURCE_MANAGER_ERROR_NONE;
145 static void __mm_resource_manager_mloop_error_cb(mm_resource_manager_mloop_s *mrp,
146 mm_resource_manager_mloop_error_e err, void *user_data)
148 MM_RM_ERROR("Received error %d from mloop %p", err, mrp);
150 if (MM_RESOURCE_MANAGER_MLOOP_ERROR_CONNECTION_LOST == err)
151 kill(getpid(), SIGHUP);
154 static int __mm_resource_manager_add_resource(
155 mm_resource_manager_res_type_e type)
157 int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
159 ret = _mm_resource_manager_rset_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
161 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
162 MM_RM_ERROR("Failed to create new resource set for resource type %d", type);
166 ret = _mm_resource_manager_rset_set_release_cb(rset[type],
167 __mm_resource_manager_release_cb, NULL);
168 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
169 MM_RM_ERROR("Failed to set release callback to resource set %p", rset[type]);
173 ret = _mm_resource_manager_rset_add_resource(rset[type], type);
174 if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
175 MM_RM_ERROR("Failed to add resource to resource set");
179 return MM_RESOURCE_MANAGER_ERROR_NONE;
182 static void __mm_resource_manager_release_cb(mm_resource_manager_res_type_e type,
185 kill(getpid(), SIGHUP);