/****************************************************************************** * * 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_cond_var.c */ /* */ /* Description : This file contains all the necessary function */ /* definitions required to operate on Conditional */ /* Variable. */ /* */ /* List of Functions : osal_cond_var_create */ /* osal_cond_var_destroy */ /* osal_cond_var_wait */ /* osal_cond_var_wait_timed */ /* osal_cond_var_signal */ /* */ /* Issues / Problems : None */ /* */ /* Revision History : */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 05 09 2006 Ittiam Draft */ /* */ /*****************************************************************************/ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /* System include files */ #include #include #include #include #include #include /* User include files */ #include "cast_types.h" #include "osal.h" #include "osal_handle.h" #include "osal_mutex.h" #include "osal_cond_var.h" /*****************************************************************************/ /* */ /* Function Name : osal_cond_var_create */ /* */ /* Description : This function initializes the conditional variable and */ /* returns the handle to it. */ /* */ /* Inputs : OSAL handle */ /* Memory manager handle */ /* */ /* Globals : None */ /* */ /* Processing : Calls system specific API and returns handle to the */ /* conditional variable. */ /* */ /* Outputs : Handle to Condtional Variable */ /* */ /* Returns : On SUCCESS - Handle to Conditional Varaible */ /* On FAILURE - NULL */ /* */ /* Issues : None */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 05 09 2006 Ittiam Draft */ /* */ /*****************************************************************************/ void *osal_cond_var_create(IN void *osal_handle) { if(0 == osal_handle) return 0; { osal_t *handle = osal_handle; cond_var_handle_t *cond_var_handle = 0; void *mmr_handle = 0; if(0 == handle || 0 == handle->alloc || 0 == handle->free) return 0; /* Initialize MMR handle */ mmr_handle = handle->mmr_handle; /* Allocate memory for the Handle */ cond_var_handle = handle->alloc(mmr_handle, sizeof(cond_var_handle_t)); /* Error in memory allocation */ if(0 == cond_var_handle) return 0; cond_var_handle->mmr_handle = mmr_handle; cond_var_handle->hdl = handle; /* Create semaphore */ if(0 != pthread_cond_init(&(cond_var_handle->cond_var), 0)) { handle->free(mmr_handle, cond_var_handle); return 0; } return cond_var_handle; } } /*****************************************************************************/ /* */ /* Function Name : osal_cond_var_destroy */ /* */ /* Description : This function destroys all the OS resources allocated by */ /* 'osal_cond_var_create' API. */ /* */ /* Inputs : Conditional Variable handle */ /* */ /* Globals : None */ /* */ /* Processing : Validates the input and destroys all the OS allocated */ /* resources. */ /* */ /* Outputs : Status of closure */ /* */ /* Returns : On SUCCESS - OSAL_SUCCESS */ /* On FAILURE - OSAL_ERROR */ /* */ /* Issues : None */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 10 05 2006 Ittiam Draft */ /* */ /*****************************************************************************/ WORD32 osal_cond_var_destroy(IN void *cond_var_handle) { if(0 == cond_var_handle) return OSAL_ERROR; { cond_var_handle_t *handle = (cond_var_handle_t *)cond_var_handle; WORD32 status = 0; if(0 == handle->hdl || 0 == handle->hdl->free) return OSAL_ERROR; /* Destroy the mutex */ status = pthread_cond_destroy(&(handle->cond_var)); if(0 != status) return OSAL_ERROR; /* Free the handle */ handle->hdl->free(handle->mmr_handle, handle); return OSAL_SUCCESS; } } /*****************************************************************************/ /* */ /* Function Name : osal_cond_var_wait */ /* */ /* Description : This function waits infinitely on conditional varaiable. */ /* */ /* Inputs : Conditional Variable handle */ /* Mutex handle for lock */ /* */ /* Globals : None */ /* */ /* Processing : This function waits on Conditional variable signal. Till */ /* signal is not, lock on mutex is relinquished. */ /* */ /* Outputs : Status of wait on conditional variable */ /* */ /* Returns : On SUCCESS - OSAL_SUCCESS */ /* On FAILURE - OSAL_ERROR */ /* */ /* Issues : None */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 10 05 2006 Ittiam Draft */ /* */ /*****************************************************************************/ WORD32 osal_cond_var_wait(IN void *cond_var_handle, IN void *mutex_handle) { if(0 == cond_var_handle || 0 == mutex_handle) return OSAL_ERROR; { mutex_handle_t *mutex = (mutex_handle_t *)mutex_handle; cond_var_handle_t *cond_var = (cond_var_handle_t *)cond_var_handle; return pthread_cond_wait(&(cond_var->cond_var), &(mutex->mutex_handle)); } } /*****************************************************************************/ /* */ /* Function Name : osal_cond_var_signal */ /* */ /* Description : This function signals on a conditional variable. */ /* */ /* Inputs : Conditional Variable handle */ /* */ /* Globals : None */ /* */ /* Processing : Calls the underlaying API to signal on a conditional */ /* variable. */ /* */ /* Outputs : Status of signalling */ /* */ /* Returns : On SUCCESS - OSAL_SUCCESS */ /* On FAILURE - OSAL_ERROR */ /* */ /* Issues : None */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 10 05 2006 Ittiam Draft */ /* */ /*****************************************************************************/ WORD32 osal_cond_var_signal(IN void *cond_var_handle) { if(0 == cond_var_handle) return OSAL_ERROR; { cond_var_handle_t *cond_var = (cond_var_handle_t *)cond_var_handle; return pthread_cond_signal(&(cond_var->cond_var)); } }