a607d838b485cb180c3268e9f6e3d4d35e13abd0
[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 "common/mm_resource_manager_utils.h"
19
20
21
22 typedef struct {
23         gboolean is_acquired;
24         int ref_counter;
25         int last_ref_counter;
26 } mm_resource_manager_backend_res_s;
27
28
29
30 /* These functions must be defined by the back-end */
31 int _mm_resource_manager_backend_init(void);
32 int _mm_resource_manager_backend_deinit(void);
33 int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type);
34 int _mm_resource_manager_backend_release(mm_resource_manager_res_type_e type);
35
36
37
38 static mm_resource_manager_backend_res_s resources[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
39
40
41
42 int mm_resource_manager_backend_init(void)
43 {
44         int i;
45
46         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
47                 resources[i].is_acquired = FALSE;
48                 resources[i].ref_counter = 0;
49                 resources[i].last_ref_counter = 0;
50         }
51
52         return _mm_resource_manager_backend_init();
53 }
54
55 int mm_resource_manager_backend_deinit(void)
56 {
57         int i;
58
59         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
60                 if (resources[i].is_acquired) {
61                         _mm_resource_manager_backend_release(i);
62                         resources[i].is_acquired = FALSE;
63                         resources[i].ref_counter = 0;
64                         resources[i].last_ref_counter = 0;
65                 }
66         }
67
68         return _mm_resource_manager_backend_deinit();
69 }
70
71 int mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type)
72 {
73         resources[type].ref_counter++;
74
75         return MM_RESOURCE_MANAGER_ERROR_NONE;
76 }
77
78 int mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
79 {
80         if (resources[type].ref_counter > 0) {
81                 resources[type].ref_counter--;
82
83                 return MM_RESOURCE_MANAGER_ERROR_NONE;
84         } else {
85                 MM_RM_ERROR("Reference counter is 0 already");
86                 return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
87         }
88 }
89
90 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
91 {
92         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
93
94         if (resources[type].is_acquired) {
95                 if (resources[type].ref_counter == 0) {
96                         ret = _mm_resource_manager_backend_release(type);
97                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
98                                 MM_RM_ERROR("Back-end's release function failed");
99                         else
100                                 resources[type].is_acquired = FALSE;
101                 }
102         } else {
103                 if (resources[type].ref_counter > 0) {
104                         ret = _mm_resource_manager_backend_acquire(type);
105                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
106                                 MM_RM_ERROR("Back-end's acquire function failed");
107                         else
108                                 resources[type].is_acquired = TRUE;
109                 }
110         }
111
112         if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) {
113                 resources[type].last_ref_counter = resources[type].ref_counter;
114         } else {
115                 resources[type].ref_counter = resources[type].last_ref_counter;
116                 MM_RM_DEBUG("Reference counter is restored");
117         }
118
119         return ret;
120 }
121
122 gboolean mm_resource_manager_backend_commit_all()
123 {
124         int i;
125         gboolean error = FALSE;
126
127         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
128                 if (mm_resource_manager_backend_commit(i) !=
129                                 MM_RESOURCE_MANAGER_ERROR_NONE) {
130                         error = TRUE;
131                 }
132         }
133
134         return !error;
135 }
136
137
138
139 #ifdef MM_RM_MURPHY_BACKEND
140 #include "murphy/mm_resource_manager_backend.c"
141 #endif