Fix Bof issue : dbus error handling
[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
90         return MM_RESOURCE_MANAGER_ERROR_NONE;
91 }
92
93 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
94 {
95         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
96
97         if (resources[type].is_acquired) {
98                 if (resources[type].ref_counter == 0) {
99                         ret = _mm_resource_manager_backend_release(type);
100                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
101                                 MM_RM_ERROR("Back-end's release function failed");
102                         else
103                                 resources[type].is_acquired = FALSE;
104                 }
105         } else {
106                 if (resources[type].ref_counter > 0) {
107                         ret = _mm_resource_manager_backend_acquire(type);
108                         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
109                                 MM_RM_ERROR("Back-end's acquire function failed");
110                         else
111                                 resources[type].is_acquired = TRUE;
112                 }
113         }
114
115         if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) {
116                 resources[type].last_ref_counter = resources[type].ref_counter;
117         } else {
118                 resources[type].ref_counter = resources[type].last_ref_counter;
119                 MM_RM_DEBUG("Reference counter is restored");
120         }
121
122         return ret;
123 }
124
125 gboolean mm_resource_manager_backend_commit_all(void)
126 {
127         int i;
128         gboolean error = FALSE;
129
130         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) {
131                 if (mm_resource_manager_backend_commit(i) != MM_RESOURCE_MANAGER_ERROR_NONE)
132                         error = TRUE;
133         }
134
135         return !error;
136 }
137
138
139
140 #ifdef MM_RM_MURPHY_BACKEND
141 #include "murphy/mm_resource_manager_backend.c"
142 #endif