da194817a28549d9877ed4f02da310c1246d99af
[platform/core/multimedia/mm-resource-manager.git] / src / daemon / backend / mm_resource_manager_backend.c
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
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"
20
21
22
23 typedef struct {
24         gboolean is_acquired;
25         int ref_counter;
26         int last_ref_counter;
27 } mm_resource_manager_backend_res_s;
28
29
30
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);
36
37 static mm_resource_manager_backend_res_s resources[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
38
39
40
41 int mm_resource_manager_backend_init(void)
42 {
43         int i;
44
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;
49         }
50
51         return _mm_resource_manager_backend_init();
52 }
53
54 int mm_resource_manager_backend_deinit(void)
55 {
56         int i;
57
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;
64                 }
65         }
66
67         return _mm_resource_manager_backend_deinit();
68 }
69
70 int mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type)
71 {
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);
75
76         resources[type].ref_counter++;
77
78         return MM_RESOURCE_MANAGER_ERROR_NONE;
79 }
80
81 int mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
82 {
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);
86
87         if (resources[type].ref_counter > 0)
88                 resources[type].ref_counter--;
89         else
90                 MM_RM_WARNING("Reference counter is already 0");
91
92         return MM_RESOURCE_MANAGER_ERROR_NONE;
93 }
94
95 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
96 {
97         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
98
99         if (resources[type].is_acquired) {
100                 if (resources[type].ref_counter == 0) {
101                         ret = _mm_resource_manager_backend_release(type);
102                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
103                                 MM_RM_ERROR("Back-end's release function failed");
104                         else
105                                 resources[type].is_acquired = FALSE;
106                 }
107         } else {
108                 if (resources[type].ref_counter > 0) {
109                         ret = _mm_resource_manager_backend_acquire(type);
110                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
111                                 MM_RM_ERROR("Back-end's acquire function failed");
112                         else
113                                 resources[type].is_acquired = TRUE;
114                 }
115         }
116
117         if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) {
118                 resources[type].last_ref_counter = resources[type].ref_counter;
119         } else {
120                 resources[type].ref_counter = resources[type].last_ref_counter;
121                 MM_RM_DEBUG("Reference counter is restored");
122         }
123
124         return ret;
125 }
126
127 gboolean mm_resource_manager_backend_commit_all(void)
128 {
129         int i;
130         gboolean error = FALSE;
131
132         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
133                 if (mm_resource_manager_backend_commit(i) != MM_RESOURCE_MANAGER_ERROR_NONE)
134                         error = TRUE;
135         }
136
137         return !error;
138 }
139
140
141
142 #ifdef MM_RM_MURPHY_BACKEND
143 #include "murphy/mm_resource_manager_backend.c"
144 #endif