• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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