1 /******************************************************************************
2 *
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20
21 /*****************************************************************************/
22 /* */
23 /* File Name : osal_cond_var.c */
24 /* */
25 /* Description : This file contains all the necessary function */
26 /* definitions required to operate on Conditional */
27 /* Variable. */
28 /* */
29 /* List of Functions : osal_cond_var_create */
30 /* osal_cond_var_destroy */
31 /* osal_cond_var_wait */
32 /* osal_cond_var_wait_timed */
33 /* osal_cond_var_signal */
34 /* */
35 /* Issues / Problems : None */
36 /* */
37 /* Revision History : */
38 /* */
39 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
40 /* 05 09 2006 Ittiam Draft */
41 /* */
42 /*****************************************************************************/
43
44 /*****************************************************************************/
45 /* File Includes */
46 /*****************************************************************************/
47
48 /* System include files */
49 #include <stdio.h>
50
51 #include <errno.h>
52 #include <pthread.h>
53 #include <stdlib.h>
54 #include <unistd.h>
55 #include <time.h>
56
57 /* User include files */
58 #include "cast_types.h"
59 #include "osal.h"
60 #include "osal_handle.h"
61 #include "osal_mutex.h"
62 #include "osal_cond_var.h"
63
64 /*****************************************************************************/
65 /* */
66 /* Function Name : osal_cond_var_create */
67 /* */
68 /* Description : This function initializes the conditional variable and */
69 /* returns the handle to it. */
70 /* */
71 /* Inputs : OSAL handle */
72 /* Memory manager handle */
73 /* */
74 /* Globals : None */
75 /* */
76 /* Processing : Calls system specific API and returns handle to the */
77 /* conditional variable. */
78 /* */
79 /* Outputs : Handle to Condtional Variable */
80 /* */
81 /* Returns : On SUCCESS - Handle to Conditional Varaible */
82 /* On FAILURE - NULL */
83 /* */
84 /* Issues : None */
85 /* */
86 /* Revision History: */
87 /* */
88 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
89 /* 05 09 2006 Ittiam Draft */
90 /* */
91 /*****************************************************************************/
92
osal_cond_var_create(IN void * osal_handle)93 void *osal_cond_var_create(IN void *osal_handle)
94 {
95 if(0 == osal_handle)
96 return 0;
97
98 {
99 osal_t *handle = osal_handle;
100 cond_var_handle_t *cond_var_handle = 0;
101 void *mmr_handle = 0;
102
103 if(0 == handle || 0 == handle->alloc || 0 == handle->free)
104 return 0;
105
106 /* Initialize MMR handle */
107 mmr_handle = handle->mmr_handle;
108
109 /* Allocate memory for the Handle */
110 cond_var_handle = handle->alloc(mmr_handle, sizeof(cond_var_handle_t));
111
112 /* Error in memory allocation */
113 if(0 == cond_var_handle)
114 return 0;
115
116 cond_var_handle->mmr_handle = mmr_handle;
117 cond_var_handle->hdl = handle;
118
119 /* Create semaphore */
120 if(0 != pthread_cond_init(&(cond_var_handle->cond_var), 0))
121 {
122 handle->free(mmr_handle, cond_var_handle);
123 return 0;
124 }
125
126 return cond_var_handle;
127 }
128 }
129
130 /*****************************************************************************/
131 /* */
132 /* Function Name : osal_cond_var_destroy */
133 /* */
134 /* Description : This function destroys all the OS resources allocated by */
135 /* 'osal_cond_var_create' API. */
136 /* */
137 /* Inputs : Conditional Variable handle */
138 /* */
139 /* Globals : None */
140 /* */
141 /* Processing : Validates the input and destroys all the OS allocated */
142 /* resources. */
143 /* */
144 /* Outputs : Status of closure */
145 /* */
146 /* Returns : On SUCCESS - OSAL_SUCCESS */
147 /* On FAILURE - OSAL_ERROR */
148 /* */
149 /* Issues : None */
150 /* */
151 /* Revision History: */
152 /* */
153 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
154 /* 10 05 2006 Ittiam Draft */
155 /* */
156 /*****************************************************************************/
157
osal_cond_var_destroy(IN void * cond_var_handle)158 WORD32 osal_cond_var_destroy(IN void *cond_var_handle)
159 {
160 if(0 == cond_var_handle)
161 return OSAL_ERROR;
162
163 {
164 cond_var_handle_t *handle = (cond_var_handle_t *)cond_var_handle;
165 WORD32 status = 0;
166
167 if(0 == handle->hdl || 0 == handle->hdl->free)
168 return OSAL_ERROR;
169
170 /* Destroy the mutex */
171 status = pthread_cond_destroy(&(handle->cond_var));
172
173 if(0 != status)
174 return OSAL_ERROR;
175
176 /* Free the handle */
177 handle->hdl->free(handle->mmr_handle, handle);
178 return OSAL_SUCCESS;
179 }
180 }
181
182 /*****************************************************************************/
183 /* */
184 /* Function Name : osal_cond_var_wait */
185 /* */
186 /* Description : This function waits infinitely on conditional varaiable. */
187 /* */
188 /* Inputs : Conditional Variable handle */
189 /* Mutex handle for lock */
190 /* */
191 /* Globals : None */
192 /* */
193 /* Processing : This function waits on Conditional variable signal. Till */
194 /* signal is not, lock on mutex is relinquished. */
195 /* */
196 /* Outputs : Status of wait on conditional variable */
197 /* */
198 /* Returns : On SUCCESS - OSAL_SUCCESS */
199 /* On FAILURE - OSAL_ERROR */
200 /* */
201 /* Issues : None */
202 /* */
203 /* Revision History: */
204 /* */
205 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
206 /* 10 05 2006 Ittiam Draft */
207 /* */
208 /*****************************************************************************/
209
osal_cond_var_wait(IN void * cond_var_handle,IN void * mutex_handle)210 WORD32 osal_cond_var_wait(IN void *cond_var_handle, IN void *mutex_handle)
211 {
212 if(0 == cond_var_handle || 0 == mutex_handle)
213 return OSAL_ERROR;
214
215 {
216 mutex_handle_t *mutex = (mutex_handle_t *)mutex_handle;
217 cond_var_handle_t *cond_var = (cond_var_handle_t *)cond_var_handle;
218
219 return pthread_cond_wait(&(cond_var->cond_var), &(mutex->mutex_handle));
220 }
221 }
222
223 /*****************************************************************************/
224 /* */
225 /* Function Name : osal_cond_var_signal */
226 /* */
227 /* Description : This function signals on a conditional variable. */
228 /* */
229 /* Inputs : Conditional Variable handle */
230 /* */
231 /* Globals : None */
232 /* */
233 /* Processing : Calls the underlaying API to signal on a conditional */
234 /* variable. */
235 /* */
236 /* Outputs : Status of signalling */
237 /* */
238 /* Returns : On SUCCESS - OSAL_SUCCESS */
239 /* On FAILURE - OSAL_ERROR */
240 /* */
241 /* Issues : None */
242 /* */
243 /* Revision History: */
244 /* */
245 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
246 /* 10 05 2006 Ittiam Draft */
247 /* */
248 /*****************************************************************************/
249
osal_cond_var_signal(IN void * cond_var_handle)250 WORD32 osal_cond_var_signal(IN void *cond_var_handle)
251 {
252 if(0 == cond_var_handle)
253 return OSAL_ERROR;
254
255 {
256 cond_var_handle_t *cond_var = (cond_var_handle_t *)cond_var_handle;
257 return pthread_cond_signal(&(cond_var->cond_var));
258 }
259 }
260