You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
335 lines
18 KiB
335 lines
18 KiB
/******************************************************************************
|
|
*
|
|
* 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 */
|
|
/* */
|
|
/*****************************************************************************/
|