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.
17 #include "daemon/backend/mm_resource_manager_backend.h"
18 #include "daemon/mm_resource_manager_daemon_conf.h"
19 #include "common/mm_resource_manager_utils.h"
27 } mm_resource_manager_backend_res_s;
31 /* These functions must be defined by the back-end */
32 int _mm_resource_manager_backend_init(void);
33 int _mm_resource_manager_backend_deinit(void);
34 int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type);
35 int _mm_resource_manager_backend_release(mm_resource_manager_res_type_e type);
37 static mm_resource_manager_backend_res_s resources[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
41 int mm_resource_manager_backend_init(void)
45 for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
46 resources[i].is_acquired = FALSE;
47 resources[i].ref_counter = 0;
48 resources[i].last_ref_counter = 0;
51 return _mm_resource_manager_backend_init();
54 int mm_resource_manager_backend_deinit(void)
58 for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
59 if (resources[i].is_acquired) {
60 _mm_resource_manager_backend_release(i);
61 resources[i].is_acquired = FALSE;
62 resources[i].ref_counter = 0;
63 resources[i].last_ref_counter = 0;
67 return _mm_resource_manager_backend_deinit();
70 int mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type)
72 MM_RM_RETVM_IF(type < MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER ||
73 type >= MM_RESOURCE_MANAGER_RES_TYPE_MAX,
74 MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "wrong type %d", type);
76 resources[type].ref_counter++;
78 return MM_RESOURCE_MANAGER_ERROR_NONE;
81 int mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
83 MM_RM_RETVM_IF(type < MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER ||
84 type >= MM_RESOURCE_MANAGER_RES_TYPE_MAX,
85 MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "wrong type %d", type);
87 if (resources[type].ref_counter > 0) {
88 resources[type].ref_counter--;
90 return MM_RESOURCE_MANAGER_ERROR_NONE;
92 MM_RM_ERROR("Reference counter is already 0");
93 return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
97 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
99 int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
101 if (resources[type].is_acquired) {
102 if (resources[type].ref_counter == 0) {
103 ret = _mm_resource_manager_backend_release(type);
104 if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
105 MM_RM_ERROR("Back-end's release function failed");
107 resources[type].is_acquired = FALSE;
110 if (resources[type].ref_counter > 0) {
111 ret = _mm_resource_manager_backend_acquire(type);
112 if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
113 MM_RM_ERROR("Back-end's acquire function failed");
115 resources[type].is_acquired = TRUE;
119 if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) {
120 resources[type].last_ref_counter = resources[type].ref_counter;
122 resources[type].ref_counter = resources[type].last_ref_counter;
123 MM_RM_DEBUG("Reference counter is restored");
129 gboolean mm_resource_manager_backend_commit_all(void)
132 gboolean error = FALSE;
134 for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
135 if (mm_resource_manager_backend_commit(i) != MM_RESOURCE_MANAGER_ERROR_NONE)
144 #ifdef MM_RM_MURPHY_BACKEND
145 #include "murphy/mm_resource_manager_backend.c"