| /****************************************************************************** |
| * |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| |
| /*****************************************************************************/ |
| /* */ |
| /* File Name : osal_semaphore.c */ |
| /* */ |
| /* Description : This file contains all the necessary function */ |
| /* definitions required to operate on semaphore */ |
| /* */ |
| /* List of Functions : osal_sem_create */ |
| /* osal_sem_destroy */ |
| /* osal_sem_wait */ |
| /* osal_sem_wait_timed */ |
| /* osal_sem_post */ |
| /* osal_sem_count */ |
| /* query_semaphore */ |
| /* */ |
| /* Issues / Problems : None */ |
| /* */ |
| /* Revision History : */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 07 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* File Includes */ |
| /*****************************************************************************/ |
| |
| /* System include files */ |
| #include <stdio.h> |
| |
| #include <semaphore.h> |
| #include <errno.h> |
| |
| /* User include files */ |
| #include "cast_types.h" |
| #include "osal.h" |
| #include "osal_handle.h" |
| #include "osal_semaphore.h" |
| |
| /*****************************************************************************/ |
| /* Static Function Declarations */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_sem_create */ |
| /* */ |
| /* Description : This function creates the semaphore and returns the */ |
| /* handle to the user. */ |
| /* */ |
| /* Inputs : Memory manager hamdle */ |
| /* Attributes to sempahore handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Allocates memory for handle and creates the semaphore */ |
| /* with specified initialized value by calling OS specific */ |
| /* API's. */ |
| /* */ |
| /* Outputs : Semaphore handle */ |
| /* */ |
| /* Returns : On SUCCESS - Semaphore handle */ |
| /* On FAILURE - NULL */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 07 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| void *osal_sem_create(IN void *osal_handle, IN osal_sem_attr_t *attr) |
| { |
| osal_t *handle = (osal_t *)osal_handle; |
| void *mmr_handle = 0; |
| |
| if(0 == handle || 0 == handle->alloc || 0 == handle->free) |
| return 0; |
| |
| /* Initialize MMR handle */ |
| mmr_handle = handle->mmr_handle; |
| |
| if(0 == attr) |
| return 0; |
| |
| /* Currenlty naming semaphores is not supported */ |
| { |
| /* Allocate memory for the sempahore handle */ |
| sem_handle_t *sem_handle = handle->alloc(mmr_handle, sizeof(sem_handle_t)); |
| |
| if(0 == sem_handle) |
| return 0; |
| |
| /* Initialize Semaphore handle parameters */ |
| sem_handle->mmr_handle = mmr_handle; |
| sem_handle->hdl = handle; |
| |
| /* Create a sempahore */ |
| if(-1 == sem_init( |
| &(sem_handle->sem_handle), /* Semaphore handle */ |
| 0, /* Shared only between threads */ |
| attr->value)) /* Initialize value. */ |
| { |
| handle->free(sem_handle->mmr_handle, sem_handle); |
| return 0; |
| } |
| |
| return sem_handle; |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_sem_destroy */ |
| /* */ |
| /* Description : This function closes the opened semaphore */ |
| /* */ |
| /* Inputs : Initialized Semaphore handle. */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Calls OS specific API's to close the semaphore. */ |
| /* */ |
| /* Outputs : Status of Semaphore close */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 07 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_sem_destroy(IN void *sem_handle) |
| { |
| if(0 == sem_handle) |
| return OSAL_ERROR; |
| |
| { |
| sem_handle_t *handle = (sem_handle_t *)sem_handle; |
| |
| /* Validate OSAL handle */ |
| if(0 == handle->hdl || 0 == handle->hdl->free) |
| return OSAL_ERROR; |
| |
| /* Destroy the semaphore */ |
| if(0 == sem_destroy(&(handle->sem_handle))) |
| { |
| handle->hdl->free(handle->mmr_handle, handle); |
| return OSAL_SUCCESS; |
| } |
| |
| return OSAL_ERROR; |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_sem_wait */ |
| /* */ |
| /* Description : This function waits for semaphore to be unlocked and */ |
| /* then locks the semaphore and control returns back. */ |
| /* */ |
| /* Inputs : Initialized Semaphore handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : This fucntion calls blocking semaphore lock API's which */ |
| /* block the caller till semaphore is locked by them or a */ |
| /* signal occurs which results in API function failure */ |
| /* */ |
| /* Outputs : Status of Semaphore wait */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 07 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_sem_wait(IN void *sem_handle) |
| { |
| if(0 == sem_handle) |
| return OSAL_ERROR; |
| |
| { |
| sem_handle_t *handle = (sem_handle_t *)sem_handle; |
| |
| /* Wait on Semaphore object infinitly */ |
| return sem_wait(&(handle->sem_handle)); |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_sem_post */ |
| /* */ |
| /* Description : This function releases the lock on the semaphore */ |
| /* */ |
| /* Inputs : Initialized Semaphore handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Calls OS specific API's to release the lock on Semaphore */ |
| /* */ |
| /* Outputs : Status of semaphore lock release */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 07 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_sem_post(IN void *sem_handle) |
| { |
| if(0 == sem_handle) |
| return OSAL_ERROR; |
| |
| { |
| sem_handle_t *handle = (sem_handle_t *)sem_handle; |
| |
| /* Semaphore Post */ |
| return sem_post(&(handle->sem_handle)); |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_sem_count */ |
| /* */ |
| /* Description : This function returns the count of semaphore */ |
| /* */ |
| /* Inputs : Handle to Semaphore */ |
| /* Pointer to value holder */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Calls OS specific API calls to query on semaphore */ |
| /* */ |
| /* Outputs : Status of Query */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 30 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_sem_count(IN void *sem_handle, OUT WORD32 *count) |
| { |
| if(0 == sem_handle || 0 == count) |
| return OSAL_ERROR; |
| |
| { |
| sem_handle_t *handle = (sem_handle_t *)sem_handle; |
| |
| if(-1 == sem_getvalue(&(handle->sem_handle), count)) |
| return OSAL_ERROR; |
| |
| return OSAL_SUCCESS; |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : query_semaphore */ |
| /* */ |
| /* Description : This function calls NtQuerySemaphore() API call of */ |
| /* ntdll.dll */ |
| /* */ |
| /* Inputs : Handle to Semaphore */ |
| /* Pointer to value holder */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : This function calls NtQuerySemaphore() API call of */ |
| /* ntdll.dll */ |
| /* */ |
| /* Outputs : Status of Query */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 30 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |