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_mutex.c                                         */
24 /*                                                                           */
25 /*  Description       : This file contains all the necessary function        */
26 /*                      definitions required to operate on mutex             */
27 /*                                                                           */
28 /*  List of Functions : osal_get_mutex_handle_size                           */
29 /*                      osal_mutex_create                                    */
30 /*                      osal_mutex_destroy                                   */
31 /*                      osal_mutex_lock                                      */
32 /*                      osal_mutex_lock_timed                                */
33 /*                      osal_mutex_unlock                                    */
34 /*                                                                           */
35 /*  Issues / Problems : None                                                 */
36 /*                                                                           */
37 /*  Revision History  :                                                      */
38 /*                                                                           */
39 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
40 /*         20 03 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 <semaphore.h>
53 #include <pthread.h>
54 #include <time.h>
55 
56 /* User include files */
57 #include "cast_types.h"
58 #include "osal.h"
59 #include "osal_handle.h"
60 #include "osal_mutex.h"
61 
62 /*****************************************************************************/
63 /*                                                                           */
64 /*  Function Name : osal_mutex_create                                        */
65 /*                                                                           */
66 /*  Description   : This function creates the mutex and returns the handle   */
67 /*                  to the user.                                             */
68 /*                                                                           */
69 /*  Inputs        : OSAL handle                                              */
70 /*                  Pointer to Memory manager handle                         */
71 /*                                                                           */
72 /*  Globals       : None                                                     */
73 /*                                                                           */
74 /*  Processing    : Allocates memory for Mutex handle and calls OS specific  */
75 /*                  mutex create API call.                                   */
76 /*                                                                           */
77 /*  Outputs       : Mutex handle                                             */
78 /*                                                                           */
79 /*  Returns       : On SUCCESS - Mutex handle                                */
80 /*                  On FAILURE - NULL                                        */
81 /*                                                                           */
82 /*  Issues        : None                                                     */
83 /*                                                                           */
84 /*  Revision History:                                                        */
85 /*                                                                           */
86 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
87 /*         20 03 2006   Ittiam          Draft                                */
88 /*                                                                           */
89 /*****************************************************************************/
90 
osal_mutex_create(IN void * osal_handle)91 void *osal_mutex_create(IN void *osal_handle)
92 {
93     void *mmr_handle = 0;
94 
95     /* Currenlty naming semaphores is not supported */
96     {
97         osal_t *handle = osal_handle;
98         mutex_handle_t *mutex_handle = 0;
99 
100         if(0 == handle || 0 == handle->alloc || 0 == handle->free)
101             return 0;
102 
103         /* Initialize MMR handle */
104         mmr_handle = handle->mmr_handle;
105 
106         /* Allocate memory for the Handle */
107         mutex_handle = handle->alloc(mmr_handle, sizeof(mutex_handle_t));
108 
109         /* Error in memory allocation */
110         if(0 == mutex_handle)
111             return 0;
112 
113         mutex_handle->mmr_handle = mmr_handle;
114         mutex_handle->hdl = handle;
115 
116         /* Create semaphore */
117         if(0 != pthread_mutex_init(&(mutex_handle->mutex_handle), NULL))
118         {
119             handle->free(mmr_handle, mutex_handle);
120             return 0;
121         }
122 
123         return mutex_handle;
124     }
125 }
126 
127 /*****************************************************************************/
128 /*                                                                           */
129 /*  Function Name : osal_mutex_destroy                                       */
130 /*                                                                           */
131 /*  Description   : This function destroys the mutex.                        */
132 /*                                                                           */
133 /*  Inputs        : Mutex Handle                                             */
134 /*                                                                           */
135 /*  Globals       : None                                                     */
136 /*                                                                           */
137 /*  Processing    : This function destroys the mutex refernced by the handle */
138 /*                  and frees the memory held by the handle.                 */
139 /*                                                                           */
140 /*  Outputs       : Status of mutex destroy                                  */
141 /*                                                                           */
142 /*  Returns       : On SUCCESS - 0                                           */
143 /*                  On FAILURE - -1                                          */
144 /*                                                                           */
145 /*  Issues        : None                                                     */
146 /*                                                                           */
147 /*  Revision History:                                                        */
148 /*                                                                           */
149 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
150 /*         22 03 2006   Ittiam          Draft                                */
151 /*                                                                           */
152 /*****************************************************************************/
153 
osal_mutex_destroy(IN void * mutex_handle)154 WORD32 osal_mutex_destroy(IN void *mutex_handle)
155 {
156     if(0 == mutex_handle)
157         return OSAL_ERROR;
158 
159     {
160         mutex_handle_t *handle = (mutex_handle_t *)mutex_handle;
161         WORD32 status = 0;
162 
163         if(0 == handle->hdl || 0 == handle->hdl->free)
164             return OSAL_ERROR;
165 
166         /* Destroy the mutex */
167         status = pthread_mutex_destroy(&(handle->mutex_handle));
168 
169         if(0 != status)
170             return OSAL_ERROR;
171 
172         /* Free the handle */
173         handle->hdl->free(handle->mmr_handle, handle);
174         return OSAL_SUCCESS;
175     }
176 }
177 
178 /*****************************************************************************/
179 /*                                                                           */
180 /*  Function Name : osal_mutex_lock                                          */
181 /*                                                                           */
182 /*  Description   : This function locks the mutex.                           */
183 /*                                                                           */
184 /*  Inputs        : Mutex handle                                             */
185 /*                                                                           */
186 /*  Globals       : None                                                     */
187 /*                                                                           */
188 /*  Processing    : Calls OS specific mutex lock API.                        */
189 /*                                                                           */
190 /*  Outputs       : Status of mutex lock                                     */
191 /*                                                                           */
192 /*  Returns       : On SUCCESS - 0                                           */
193 /*                  On FAILURE - -1                                          */
194 /*                                                                           */
195 /*  Issues        : None                                                     */
196 /*                                                                           */
197 /*  Revision History:                                                        */
198 /*                                                                           */
199 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
200 /*         22 03 2006   Ittiam          Draft                                */
201 /*                                                                           */
202 /*****************************************************************************/
203 
osal_mutex_lock(IN void * mutex_handle)204 WORD32 osal_mutex_lock(IN void *mutex_handle)
205 {
206     if(0 == mutex_handle)
207         return OSAL_ERROR;
208 
209     {
210         mutex_handle_t *handle = (mutex_handle_t *)mutex_handle;
211 
212         /* Wait on mutex lock */
213         return pthread_mutex_lock(&(handle->mutex_handle));
214     }
215 }
216 
217 /*****************************************************************************/
218 /*                                                                           */
219 /*  Function Name : osal_mutex_unlock                                        */
220 /*                                                                           */
221 /*  Description   : This function unlocks the mutex                          */
222 /*                                                                           */
223 /*  Inputs        : Mutex handle                                             */
224 /*                                                                           */
225 /*  Globals       : None                                                     */
226 /*                                                                           */
227 /*  Processing    : Calls OS specific unlock mutex API.                      */
228 /*                                                                           */
229 /*  Outputs       : Status of mutex unlock                                   */
230 /*                                                                           */
231 /*  Returns       : On SUCCESS - 0                                           */
232 /*                  On FAILURE - -1                                          */
233 /*                                                                           */
234 /*  Issues        : None                                                     */
235 /*                                                                           */
236 /*  Revision History:                                                        */
237 /*                                                                           */
238 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
239 /*         22 03 2006   Ittiam          Draft                                */
240 /*                                                                           */
241 /*****************************************************************************/
242 
osal_mutex_unlock(IN void * mutex_handle)243 WORD32 osal_mutex_unlock(IN void *mutex_handle)
244 {
245     if(0 == mutex_handle)
246         return OSAL_ERROR;
247 
248     {
249         mutex_handle_t *handle = (mutex_handle_t *)mutex_handle;
250 
251         /* Release the lock */
252         if(0 == pthread_mutex_unlock(&(handle->mutex_handle)))
253             return OSAL_SUCCESS;
254 
255         return OSAL_ERROR;
256     }
257 }
258