| /****************************************************************************** |
| * |
| * 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_mutex.c */ |
| /* */ |
| /* Description : This file contains all the necessary function */ |
| /* definitions required to operate on mutex */ |
| /* */ |
| /* List of Functions : osal_get_mutex_handle_size */ |
| /* osal_mutex_create */ |
| /* osal_mutex_destroy */ |
| /* osal_mutex_lock */ |
| /* osal_mutex_lock_timed */ |
| /* osal_mutex_unlock */ |
| /* */ |
| /* Issues / Problems : None */ |
| /* */ |
| /* Revision History : */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 20 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* File Includes */ |
| /*****************************************************************************/ |
| |
| /* System include files */ |
| #include <stdio.h> |
| |
| #include <errno.h> |
| #include <semaphore.h> |
| #include <pthread.h> |
| #include <time.h> |
| |
| /* User include files */ |
| #include "cast_types.h" |
| #include "osal.h" |
| #include "osal_handle.h" |
| #include "osal_mutex.h" |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_mutex_create */ |
| /* */ |
| /* Description : This function creates the mutex and returns the handle */ |
| /* to the user. */ |
| /* */ |
| /* Inputs : OSAL handle */ |
| /* Pointer to Memory manager handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Allocates memory for Mutex handle and calls OS specific */ |
| /* mutex create API call. */ |
| /* */ |
| /* Outputs : Mutex handle */ |
| /* */ |
| /* Returns : On SUCCESS - Mutex handle */ |
| /* On FAILURE - NULL */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 20 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| void *osal_mutex_create(IN void *osal_handle) |
| { |
| void *mmr_handle = 0; |
| |
| /* Currenlty naming semaphores is not supported */ |
| { |
| osal_t *handle = osal_handle; |
| mutex_handle_t *mutex_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 */ |
| mutex_handle = handle->alloc(mmr_handle, sizeof(mutex_handle_t)); |
| |
| /* Error in memory allocation */ |
| if(0 == mutex_handle) |
| return 0; |
| |
| mutex_handle->mmr_handle = mmr_handle; |
| mutex_handle->hdl = handle; |
| |
| /* Create semaphore */ |
| if(0 != pthread_mutex_init(&(mutex_handle->mutex_handle), NULL)) |
| { |
| handle->free(mmr_handle, mutex_handle); |
| return 0; |
| } |
| |
| return mutex_handle; |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_mutex_destroy */ |
| /* */ |
| /* Description : This function destroys the mutex. */ |
| /* */ |
| /* Inputs : Mutex Handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : This function destroys the mutex refernced by the handle */ |
| /* and frees the memory held by the handle. */ |
| /* */ |
| /* Outputs : Status of mutex destroy */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 22 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_mutex_destroy(IN void *mutex_handle) |
| { |
| if(0 == mutex_handle) |
| return OSAL_ERROR; |
| |
| { |
| mutex_handle_t *handle = (mutex_handle_t *)mutex_handle; |
| WORD32 status = 0; |
| |
| if(0 == handle->hdl || 0 == handle->hdl->free) |
| return OSAL_ERROR; |
| |
| /* Destroy the mutex */ |
| status = pthread_mutex_destroy(&(handle->mutex_handle)); |
| |
| if(0 != status) |
| return OSAL_ERROR; |
| |
| /* Free the handle */ |
| handle->hdl->free(handle->mmr_handle, handle); |
| return OSAL_SUCCESS; |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_mutex_lock */ |
| /* */ |
| /* Description : This function locks the mutex. */ |
| /* */ |
| /* Inputs : Mutex handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Calls OS specific mutex lock API. */ |
| /* */ |
| /* Outputs : Status of mutex lock */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 22 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_mutex_lock(IN void *mutex_handle) |
| { |
| if(0 == mutex_handle) |
| return OSAL_ERROR; |
| |
| { |
| mutex_handle_t *handle = (mutex_handle_t *)mutex_handle; |
| |
| /* Wait on mutex lock */ |
| return pthread_mutex_lock(&(handle->mutex_handle)); |
| } |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : osal_mutex_unlock */ |
| /* */ |
| /* Description : This function unlocks the mutex */ |
| /* */ |
| /* Inputs : Mutex handle */ |
| /* */ |
| /* Globals : None */ |
| /* */ |
| /* Processing : Calls OS specific unlock mutex API. */ |
| /* */ |
| /* Outputs : Status of mutex unlock */ |
| /* */ |
| /* Returns : On SUCCESS - 0 */ |
| /* On FAILURE - -1 */ |
| /* */ |
| /* Issues : None */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 22 03 2006 Ittiam Draft */ |
| /* */ |
| /*****************************************************************************/ |
| |
| WORD32 osal_mutex_unlock(IN void *mutex_handle) |
| { |
| if(0 == mutex_handle) |
| return OSAL_ERROR; |
| |
| { |
| mutex_handle_t *handle = (mutex_handle_t *)mutex_handle; |
| |
| /* Release the lock */ |
| if(0 == pthread_mutex_unlock(&(handle->mutex_handle))) |
| return OSAL_SUCCESS; |
| |
| return OSAL_ERROR; |
| } |
| } |