1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar *****************************************************************************
18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar
21*c83a76b0SSuyog Pawar /*****************************************************************************/
22*c83a76b0SSuyog Pawar /* */
23*c83a76b0SSuyog Pawar /* File Name : osal_semaphore.c */
24*c83a76b0SSuyog Pawar /* */
25*c83a76b0SSuyog Pawar /* Description : This file contains all the necessary function */
26*c83a76b0SSuyog Pawar /* definitions required to operate on semaphore */
27*c83a76b0SSuyog Pawar /* */
28*c83a76b0SSuyog Pawar /* List of Functions : osal_sem_create */
29*c83a76b0SSuyog Pawar /* osal_sem_destroy */
30*c83a76b0SSuyog Pawar /* osal_sem_wait */
31*c83a76b0SSuyog Pawar /* osal_sem_wait_timed */
32*c83a76b0SSuyog Pawar /* osal_sem_post */
33*c83a76b0SSuyog Pawar /* osal_sem_count */
34*c83a76b0SSuyog Pawar /* query_semaphore */
35*c83a76b0SSuyog Pawar /* */
36*c83a76b0SSuyog Pawar /* Issues / Problems : None */
37*c83a76b0SSuyog Pawar /* */
38*c83a76b0SSuyog Pawar /* Revision History : */
39*c83a76b0SSuyog Pawar /* */
40*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
41*c83a76b0SSuyog Pawar /* 07 03 2006 Ittiam Draft */
42*c83a76b0SSuyog Pawar /* */
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar
45*c83a76b0SSuyog Pawar /*****************************************************************************/
46*c83a76b0SSuyog Pawar /* File Includes */
47*c83a76b0SSuyog Pawar /*****************************************************************************/
48*c83a76b0SSuyog Pawar
49*c83a76b0SSuyog Pawar /* System include files */
50*c83a76b0SSuyog Pawar #include <stdio.h>
51*c83a76b0SSuyog Pawar
52*c83a76b0SSuyog Pawar #include <semaphore.h>
53*c83a76b0SSuyog Pawar #include <errno.h>
54*c83a76b0SSuyog Pawar
55*c83a76b0SSuyog Pawar /* User include files */
56*c83a76b0SSuyog Pawar #include "cast_types.h"
57*c83a76b0SSuyog Pawar #include "osal.h"
58*c83a76b0SSuyog Pawar #include "osal_handle.h"
59*c83a76b0SSuyog Pawar #include "osal_semaphore.h"
60*c83a76b0SSuyog Pawar
61*c83a76b0SSuyog Pawar /*****************************************************************************/
62*c83a76b0SSuyog Pawar /* Static Function Declarations */
63*c83a76b0SSuyog Pawar /*****************************************************************************/
64*c83a76b0SSuyog Pawar
65*c83a76b0SSuyog Pawar /*****************************************************************************/
66*c83a76b0SSuyog Pawar /* */
67*c83a76b0SSuyog Pawar /* Function Name : osal_sem_create */
68*c83a76b0SSuyog Pawar /* */
69*c83a76b0SSuyog Pawar /* Description : This function creates the semaphore and returns the */
70*c83a76b0SSuyog Pawar /* handle to the user. */
71*c83a76b0SSuyog Pawar /* */
72*c83a76b0SSuyog Pawar /* Inputs : Memory manager hamdle */
73*c83a76b0SSuyog Pawar /* Attributes to sempahore handle */
74*c83a76b0SSuyog Pawar /* */
75*c83a76b0SSuyog Pawar /* Globals : None */
76*c83a76b0SSuyog Pawar /* */
77*c83a76b0SSuyog Pawar /* Processing : Allocates memory for handle and creates the semaphore */
78*c83a76b0SSuyog Pawar /* with specified initialized value by calling OS specific */
79*c83a76b0SSuyog Pawar /* API's. */
80*c83a76b0SSuyog Pawar /* */
81*c83a76b0SSuyog Pawar /* Outputs : Semaphore handle */
82*c83a76b0SSuyog Pawar /* */
83*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - Semaphore handle */
84*c83a76b0SSuyog Pawar /* On FAILURE - NULL */
85*c83a76b0SSuyog Pawar /* */
86*c83a76b0SSuyog Pawar /* Issues : None */
87*c83a76b0SSuyog Pawar /* */
88*c83a76b0SSuyog Pawar /* Revision History: */
89*c83a76b0SSuyog Pawar /* */
90*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
91*c83a76b0SSuyog Pawar /* 07 03 2006 Ittiam Draft */
92*c83a76b0SSuyog Pawar /* */
93*c83a76b0SSuyog Pawar /*****************************************************************************/
94*c83a76b0SSuyog Pawar
osal_sem_create(IN void * osal_handle,IN osal_sem_attr_t * attr)95*c83a76b0SSuyog Pawar void *osal_sem_create(IN void *osal_handle, IN osal_sem_attr_t *attr)
96*c83a76b0SSuyog Pawar {
97*c83a76b0SSuyog Pawar osal_t *handle = (osal_t *)osal_handle;
98*c83a76b0SSuyog Pawar void *mmr_handle = 0;
99*c83a76b0SSuyog Pawar
100*c83a76b0SSuyog Pawar if(0 == handle || 0 == handle->alloc || 0 == handle->free)
101*c83a76b0SSuyog Pawar return 0;
102*c83a76b0SSuyog Pawar
103*c83a76b0SSuyog Pawar /* Initialize MMR handle */
104*c83a76b0SSuyog Pawar mmr_handle = handle->mmr_handle;
105*c83a76b0SSuyog Pawar
106*c83a76b0SSuyog Pawar if(0 == attr)
107*c83a76b0SSuyog Pawar return 0;
108*c83a76b0SSuyog Pawar
109*c83a76b0SSuyog Pawar /* Currenlty naming semaphores is not supported */
110*c83a76b0SSuyog Pawar {
111*c83a76b0SSuyog Pawar /* Allocate memory for the sempahore handle */
112*c83a76b0SSuyog Pawar sem_handle_t *sem_handle = handle->alloc(mmr_handle, sizeof(sem_handle_t));
113*c83a76b0SSuyog Pawar
114*c83a76b0SSuyog Pawar if(0 == sem_handle)
115*c83a76b0SSuyog Pawar return 0;
116*c83a76b0SSuyog Pawar
117*c83a76b0SSuyog Pawar /* Initialize Semaphore handle parameters */
118*c83a76b0SSuyog Pawar sem_handle->mmr_handle = mmr_handle;
119*c83a76b0SSuyog Pawar sem_handle->hdl = handle;
120*c83a76b0SSuyog Pawar
121*c83a76b0SSuyog Pawar /* Create a sempahore */
122*c83a76b0SSuyog Pawar if(-1 == sem_init(
123*c83a76b0SSuyog Pawar &(sem_handle->sem_handle), /* Semaphore handle */
124*c83a76b0SSuyog Pawar 0, /* Shared only between threads */
125*c83a76b0SSuyog Pawar attr->value)) /* Initialize value. */
126*c83a76b0SSuyog Pawar {
127*c83a76b0SSuyog Pawar handle->free(sem_handle->mmr_handle, sem_handle);
128*c83a76b0SSuyog Pawar return 0;
129*c83a76b0SSuyog Pawar }
130*c83a76b0SSuyog Pawar
131*c83a76b0SSuyog Pawar return sem_handle;
132*c83a76b0SSuyog Pawar }
133*c83a76b0SSuyog Pawar }
134*c83a76b0SSuyog Pawar
135*c83a76b0SSuyog Pawar /*****************************************************************************/
136*c83a76b0SSuyog Pawar /* */
137*c83a76b0SSuyog Pawar /* Function Name : osal_sem_destroy */
138*c83a76b0SSuyog Pawar /* */
139*c83a76b0SSuyog Pawar /* Description : This function closes the opened semaphore */
140*c83a76b0SSuyog Pawar /* */
141*c83a76b0SSuyog Pawar /* Inputs : Initialized Semaphore handle. */
142*c83a76b0SSuyog Pawar /* */
143*c83a76b0SSuyog Pawar /* Globals : None */
144*c83a76b0SSuyog Pawar /* */
145*c83a76b0SSuyog Pawar /* Processing : Calls OS specific API's to close the semaphore. */
146*c83a76b0SSuyog Pawar /* */
147*c83a76b0SSuyog Pawar /* Outputs : Status of Semaphore close */
148*c83a76b0SSuyog Pawar /* */
149*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
150*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
151*c83a76b0SSuyog Pawar /* */
152*c83a76b0SSuyog Pawar /* Issues : None */
153*c83a76b0SSuyog Pawar /* */
154*c83a76b0SSuyog Pawar /* Revision History: */
155*c83a76b0SSuyog Pawar /* */
156*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
157*c83a76b0SSuyog Pawar /* 07 03 2006 Ittiam Draft */
158*c83a76b0SSuyog Pawar /* */
159*c83a76b0SSuyog Pawar /*****************************************************************************/
160*c83a76b0SSuyog Pawar
osal_sem_destroy(IN void * sem_handle)161*c83a76b0SSuyog Pawar WORD32 osal_sem_destroy(IN void *sem_handle)
162*c83a76b0SSuyog Pawar {
163*c83a76b0SSuyog Pawar if(0 == sem_handle)
164*c83a76b0SSuyog Pawar return OSAL_ERROR;
165*c83a76b0SSuyog Pawar
166*c83a76b0SSuyog Pawar {
167*c83a76b0SSuyog Pawar sem_handle_t *handle = (sem_handle_t *)sem_handle;
168*c83a76b0SSuyog Pawar
169*c83a76b0SSuyog Pawar /* Validate OSAL handle */
170*c83a76b0SSuyog Pawar if(0 == handle->hdl || 0 == handle->hdl->free)
171*c83a76b0SSuyog Pawar return OSAL_ERROR;
172*c83a76b0SSuyog Pawar
173*c83a76b0SSuyog Pawar /* Destroy the semaphore */
174*c83a76b0SSuyog Pawar if(0 == sem_destroy(&(handle->sem_handle)))
175*c83a76b0SSuyog Pawar {
176*c83a76b0SSuyog Pawar handle->hdl->free(handle->mmr_handle, handle);
177*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
178*c83a76b0SSuyog Pawar }
179*c83a76b0SSuyog Pawar
180*c83a76b0SSuyog Pawar return OSAL_ERROR;
181*c83a76b0SSuyog Pawar }
182*c83a76b0SSuyog Pawar }
183*c83a76b0SSuyog Pawar
184*c83a76b0SSuyog Pawar /*****************************************************************************/
185*c83a76b0SSuyog Pawar /* */
186*c83a76b0SSuyog Pawar /* Function Name : osal_sem_wait */
187*c83a76b0SSuyog Pawar /* */
188*c83a76b0SSuyog Pawar /* Description : This function waits for semaphore to be unlocked and */
189*c83a76b0SSuyog Pawar /* then locks the semaphore and control returns back. */
190*c83a76b0SSuyog Pawar /* */
191*c83a76b0SSuyog Pawar /* Inputs : Initialized Semaphore handle */
192*c83a76b0SSuyog Pawar /* */
193*c83a76b0SSuyog Pawar /* Globals : None */
194*c83a76b0SSuyog Pawar /* */
195*c83a76b0SSuyog Pawar /* Processing : This fucntion calls blocking semaphore lock API's which */
196*c83a76b0SSuyog Pawar /* block the caller till semaphore is locked by them or a */
197*c83a76b0SSuyog Pawar /* signal occurs which results in API function failure */
198*c83a76b0SSuyog Pawar /* */
199*c83a76b0SSuyog Pawar /* Outputs : Status of Semaphore wait */
200*c83a76b0SSuyog Pawar /* */
201*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
202*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
203*c83a76b0SSuyog Pawar /* */
204*c83a76b0SSuyog Pawar /* Issues : None */
205*c83a76b0SSuyog Pawar /* */
206*c83a76b0SSuyog Pawar /* Revision History: */
207*c83a76b0SSuyog Pawar /* */
208*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
209*c83a76b0SSuyog Pawar /* 07 03 2006 Ittiam Draft */
210*c83a76b0SSuyog Pawar /* */
211*c83a76b0SSuyog Pawar /*****************************************************************************/
212*c83a76b0SSuyog Pawar
osal_sem_wait(IN void * sem_handle)213*c83a76b0SSuyog Pawar WORD32 osal_sem_wait(IN void *sem_handle)
214*c83a76b0SSuyog Pawar {
215*c83a76b0SSuyog Pawar if(0 == sem_handle)
216*c83a76b0SSuyog Pawar return OSAL_ERROR;
217*c83a76b0SSuyog Pawar
218*c83a76b0SSuyog Pawar {
219*c83a76b0SSuyog Pawar sem_handle_t *handle = (sem_handle_t *)sem_handle;
220*c83a76b0SSuyog Pawar
221*c83a76b0SSuyog Pawar /* Wait on Semaphore object infinitly */
222*c83a76b0SSuyog Pawar return sem_wait(&(handle->sem_handle));
223*c83a76b0SSuyog Pawar }
224*c83a76b0SSuyog Pawar }
225*c83a76b0SSuyog Pawar
226*c83a76b0SSuyog Pawar /*****************************************************************************/
227*c83a76b0SSuyog Pawar /* */
228*c83a76b0SSuyog Pawar /* Function Name : osal_sem_post */
229*c83a76b0SSuyog Pawar /* */
230*c83a76b0SSuyog Pawar /* Description : This function releases the lock on the semaphore */
231*c83a76b0SSuyog Pawar /* */
232*c83a76b0SSuyog Pawar /* Inputs : Initialized Semaphore handle */
233*c83a76b0SSuyog Pawar /* */
234*c83a76b0SSuyog Pawar /* Globals : None */
235*c83a76b0SSuyog Pawar /* */
236*c83a76b0SSuyog Pawar /* Processing : Calls OS specific API's to release the lock on Semaphore */
237*c83a76b0SSuyog Pawar /* */
238*c83a76b0SSuyog Pawar /* Outputs : Status of semaphore lock release */
239*c83a76b0SSuyog Pawar /* */
240*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
241*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
242*c83a76b0SSuyog Pawar /* */
243*c83a76b0SSuyog Pawar /* Issues : None */
244*c83a76b0SSuyog Pawar /* */
245*c83a76b0SSuyog Pawar /* Revision History: */
246*c83a76b0SSuyog Pawar /* */
247*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
248*c83a76b0SSuyog Pawar /* 07 03 2006 Ittiam Draft */
249*c83a76b0SSuyog Pawar /* */
250*c83a76b0SSuyog Pawar /*****************************************************************************/
251*c83a76b0SSuyog Pawar
osal_sem_post(IN void * sem_handle)252*c83a76b0SSuyog Pawar WORD32 osal_sem_post(IN void *sem_handle)
253*c83a76b0SSuyog Pawar {
254*c83a76b0SSuyog Pawar if(0 == sem_handle)
255*c83a76b0SSuyog Pawar return OSAL_ERROR;
256*c83a76b0SSuyog Pawar
257*c83a76b0SSuyog Pawar {
258*c83a76b0SSuyog Pawar sem_handle_t *handle = (sem_handle_t *)sem_handle;
259*c83a76b0SSuyog Pawar
260*c83a76b0SSuyog Pawar /* Semaphore Post */
261*c83a76b0SSuyog Pawar return sem_post(&(handle->sem_handle));
262*c83a76b0SSuyog Pawar }
263*c83a76b0SSuyog Pawar }
264*c83a76b0SSuyog Pawar
265*c83a76b0SSuyog Pawar /*****************************************************************************/
266*c83a76b0SSuyog Pawar /* */
267*c83a76b0SSuyog Pawar /* Function Name : osal_sem_count */
268*c83a76b0SSuyog Pawar /* */
269*c83a76b0SSuyog Pawar /* Description : This function returns the count of semaphore */
270*c83a76b0SSuyog Pawar /* */
271*c83a76b0SSuyog Pawar /* Inputs : Handle to Semaphore */
272*c83a76b0SSuyog Pawar /* Pointer to value holder */
273*c83a76b0SSuyog Pawar /* */
274*c83a76b0SSuyog Pawar /* Globals : None */
275*c83a76b0SSuyog Pawar /* */
276*c83a76b0SSuyog Pawar /* Processing : Calls OS specific API calls to query on semaphore */
277*c83a76b0SSuyog Pawar /* */
278*c83a76b0SSuyog Pawar /* Outputs : Status of Query */
279*c83a76b0SSuyog Pawar /* */
280*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
281*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
282*c83a76b0SSuyog Pawar /* */
283*c83a76b0SSuyog Pawar /* Issues : None */
284*c83a76b0SSuyog Pawar /* */
285*c83a76b0SSuyog Pawar /* Revision History: */
286*c83a76b0SSuyog Pawar /* */
287*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
288*c83a76b0SSuyog Pawar /* 30 03 2006 Ittiam Draft */
289*c83a76b0SSuyog Pawar /* */
290*c83a76b0SSuyog Pawar /*****************************************************************************/
291*c83a76b0SSuyog Pawar
osal_sem_count(IN void * sem_handle,OUT WORD32 * count)292*c83a76b0SSuyog Pawar WORD32 osal_sem_count(IN void *sem_handle, OUT WORD32 *count)
293*c83a76b0SSuyog Pawar {
294*c83a76b0SSuyog Pawar if(0 == sem_handle || 0 == count)
295*c83a76b0SSuyog Pawar return OSAL_ERROR;
296*c83a76b0SSuyog Pawar
297*c83a76b0SSuyog Pawar {
298*c83a76b0SSuyog Pawar sem_handle_t *handle = (sem_handle_t *)sem_handle;
299*c83a76b0SSuyog Pawar
300*c83a76b0SSuyog Pawar if(-1 == sem_getvalue(&(handle->sem_handle), count))
301*c83a76b0SSuyog Pawar return OSAL_ERROR;
302*c83a76b0SSuyog Pawar
303*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
304*c83a76b0SSuyog Pawar }
305*c83a76b0SSuyog Pawar }
306*c83a76b0SSuyog Pawar
307*c83a76b0SSuyog Pawar /*****************************************************************************/
308*c83a76b0SSuyog Pawar /* */
309*c83a76b0SSuyog Pawar /* Function Name : query_semaphore */
310*c83a76b0SSuyog Pawar /* */
311*c83a76b0SSuyog Pawar /* Description : This function calls NtQuerySemaphore() API call of */
312*c83a76b0SSuyog Pawar /* ntdll.dll */
313*c83a76b0SSuyog Pawar /* */
314*c83a76b0SSuyog Pawar /* Inputs : Handle to Semaphore */
315*c83a76b0SSuyog Pawar /* Pointer to value holder */
316*c83a76b0SSuyog Pawar /* */
317*c83a76b0SSuyog Pawar /* Globals : None */
318*c83a76b0SSuyog Pawar /* */
319*c83a76b0SSuyog Pawar /* Processing : This function calls NtQuerySemaphore() API call of */
320*c83a76b0SSuyog Pawar /* ntdll.dll */
321*c83a76b0SSuyog Pawar /* */
322*c83a76b0SSuyog Pawar /* Outputs : Status of Query */
323*c83a76b0SSuyog Pawar /* */
324*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
325*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
326*c83a76b0SSuyog Pawar /* */
327*c83a76b0SSuyog Pawar /* Issues : None */
328*c83a76b0SSuyog Pawar /* */
329*c83a76b0SSuyog Pawar /* Revision History: */
330*c83a76b0SSuyog Pawar /* */
331*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
332*c83a76b0SSuyog Pawar /* 30 03 2006 Ittiam Draft */
333*c83a76b0SSuyog Pawar /* */
334*c83a76b0SSuyog Pawar /*****************************************************************************/
335