d8fde6d1e624a4bd4fb56bfa5f96ff3ee16bc08a
[platform/core/multimedia/mm-resource-manager.git] / src / daemon / backend / murphy / 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 <signal.h>
18
19 #include "daemon/backend/murphy/mm_resource_manager_rset.h"
20 #include "daemon/backend/murphy/mm_resource_manager_mloop.h"
21 #include "daemon/mm_resource_manager_daemon_priv.h"
22
23
24
25 static mm_resource_manager_mloop_s *mrp;
26 static mm_resource_manager_rset_s *rset[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
27
28
29
30 static void __mm_resource_manager_mloop_error_cb(mm_resource_manager_mloop_s *mrp,
31         mm_resource_manager_mloop_error_e err, void *user_data);
32 static int __mm_resource_manager_add_resource(mm_resource_manager_res_type_e type);
33 static void __mm_resource_manager_release_cb(mm_resource_manager_res_type_e type,
34                 void *user_data);
35
36
37
38 int _mm_resource_manager_backend_init(void)
39 {
40         int ret;
41         int i;
42
43         mrp = NULL;
44         for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++)
45                 rset[i] = NULL;
46
47         ret = _mm_resource_manager_mloop_create(&mrp);
48         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
49                 return ret;
50
51         ret = _mm_resource_manager_mloop_set_error_cb(mrp,
52                         __mm_resource_manager_mloop_error_cb, NULL);
53         if (ret != MM_RESOURCE_MANAGER_ERROR_NONE)
54                 return ret;
55
56         return MM_RESOURCE_MANAGER_ERROR_NONE;
57 }
58
59 int _mm_resource_manager_backend_deinit()
60 {
61         int ret;
62
63         MM_RM_RETVM_IF(mrp == NULL,
64                         MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "mloop is NULL");
65
66         ret = _mm_resource_manager_mloop_destroy(mrp);
67         mrp = NULL;
68
69         return ret;
70 }
71
72 int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type)
73 {
74         gboolean is_run = FALSE;
75         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
76
77         MM_RM_RETVM_IF(rset[type] != NULL,
78                         MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION,
79                         "%s is already acquired", _mm_resource_manager_get_res_str(type));
80
81         ret = _mm_resource_manager_mloop_is_run(mrp, &is_run);
82         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
83                 MM_RM_ERROR("Failed to get is_run property from mloop");
84                 return ret;
85         }
86         if (!is_run) {
87                 MM_RM_ERROR("mloop is not ran");
88                 return MM_RESOURCE_MANAGER_ERROR_INVALID_STATE;
89         }
90
91         ret = __mm_resource_manager_add_resource(type);
92         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
93                 MM_RM_ERROR("Failed to add resource");
94                 return ret;
95         }
96
97         ret = _mm_resource_manager_rset_acquire(rset[type]);
98         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
99                 MM_RM_ERROR("Failed to acquire rset %p", rset[type]);
100                 _mm_resource_manager_backend_release(type);
101                 return ret;
102         }
103
104         MM_RM_INFO("%s is acquired successfully",
105                         _mm_resource_manager_get_res_str(type));
106
107         return MM_RESOURCE_MANAGER_ERROR_NONE;
108 }
109
110 int _mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
111 {
112         gboolean is_run = FALSE;
113         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
114
115         MM_RM_RETVM_IF(rset[type] == NULL,
116                         MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION,
117                         "%s is not acquired", _mm_resource_manager_get_res_str(type));
118
119         ret = _mm_resource_manager_mloop_is_run(mrp, &is_run);
120         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
121                 MM_RM_ERROR("Failed to get is_run property from mloop");
122                 return ret;
123         }
124         if (!is_run) {
125                 MM_RM_ERROR("mloop is not ran");
126                 return MM_RESOURCE_MANAGER_ERROR_INVALID_STATE;
127         }
128
129         ret = _mm_resource_manager_rset_destroy(rset[type]);
130         /* rset is destroyed even if the function returns an error */
131         rset[type] = NULL;
132         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
133                 MM_RM_ERROR("Failed to release rset %p", rset[type]);
134                 return ret;
135         }
136
137         MM_RM_INFO("%s is released successfully",
138                         _mm_resource_manager_get_res_str(type));
139
140         return MM_RESOURCE_MANAGER_ERROR_NONE;
141 }
142
143
144
145 static void __mm_resource_manager_mloop_error_cb(mm_resource_manager_mloop_s *mrp,
146         mm_resource_manager_mloop_error_e err, void *user_data)
147 {
148         MM_RM_ERROR("Received error %d from mloop %p", err, mrp);
149
150         if (MM_RESOURCE_MANAGER_MLOOP_ERROR_CONNECTION_LOST == err)
151                 kill(getpid(), SIGHUP);
152 }
153
154 static int __mm_resource_manager_add_resource(
155                 mm_resource_manager_res_type_e type)
156 {
157         int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
158
159         ret = _mm_resource_manager_rset_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
160                         mrp, &rset[type]);
161         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
162                 MM_RM_ERROR("Failed to create new resource set for resource type %d", type);
163                 return ret;
164         }
165
166         ret = _mm_resource_manager_rset_set_release_cb(rset[type],
167                         __mm_resource_manager_release_cb, NULL);
168         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
169                 MM_RM_ERROR("Failed to set release callback to resource set %p", rset[type]);
170                 return ret;
171         }
172
173         ret = _mm_resource_manager_rset_add_resource(rset[type], type);
174         if (MM_RESOURCE_MANAGER_ERROR_NONE != ret) {
175                 MM_RM_ERROR("Failed to add resource to resource set");
176                 return ret;
177         }
178
179         return MM_RESOURCE_MANAGER_ERROR_NONE;
180 }
181
182 static void __mm_resource_manager_release_cb(mm_resource_manager_res_type_e type,
183                 void *user_data)
184 {
185         kill(getpid(), SIGHUP);
186 }