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