/****************************************************************************** * * 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 #include #include /* 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 */ /* */ /*****************************************************************************/