Add new api of stream and instance for multi-instance
[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         } else {
92                 MM_RM_ERROR("Reference counter is already 0");
93                 return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
94         }
95 }
96
97 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
98 {
99         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
100
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");
106                         else
107                                 resources[type].is_acquired = FALSE;
108                 }
109         } else {
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");
114                         else
115                                 resources[type].is_acquired = TRUE;
116                 }
117         }
118
119         if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) {
120                 resources[type].last_ref_counter = resources[type].ref_counter;
121         } else {
122                 resources[type].ref_counter = resources[type].last_ref_counter;
123                 MM_RM_DEBUG("Reference counter is restored");
124         }
125
126         return ret;
127 }
128
129 gboolean mm_resource_manager_backend_commit_all(void)
130 {
131         int i;
132         gboolean error = FALSE;
133
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)
136                         error = TRUE;
137         }
138
139         return !error;
140 }
141
142
143
144 #ifdef MM_RM_MURPHY_BACKEND
145 #include "murphy/mm_resource_manager_backend.c"
146 #endif