172 lines
4.4 KiB
C
172 lines
4.4 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
|
|
* Description: OS Abstract Layer.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup osal_mutex osal_mutex
|
|
*/
|
|
#ifndef __OSAL_MUTEX_H__
|
|
#define __OSAL_MUTEX_H__
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif
|
|
|
|
#define OSAL_MUTEX_WAIT_FOREVER (-1)
|
|
|
|
typedef struct {
|
|
void *mutex;
|
|
} osal_mutex;
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Initialize the mutex.
|
|
*
|
|
* @par Description:
|
|
* This API is used to initialize the mutex.
|
|
*
|
|
* @param mutex [in] the mutex to be initialized.
|
|
*
|
|
* @return OSAL_FAILURE/OSAL_SUCCESS
|
|
*
|
|
* @par Support System:
|
|
* linux liteos freertos.
|
|
*/
|
|
int osal_mutex_init(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Acquire the mutex.
|
|
*
|
|
* @par Description:
|
|
* Acquire the mutex. Lock the mutex exclusively for this task.
|
|
* If the mutex is not available right now, it will sleep until it can get it.
|
|
*
|
|
* @param mutex [in] the mutex to be initialized.
|
|
*
|
|
* @return OSAL_FAILURE/OSAL_SUCCESS
|
|
*
|
|
* @note
|
|
* The mutex must later on be released by the same task that acquired it. Recursive locking is not allowed.
|
|
* The task may not exit without first unlocking the mutex.
|
|
* Also, kernel memory where the mutex resides must not be freed with the mutex still locked.
|
|
* The mutex must first be initialized (or statically defined) before it can be locked.
|
|
* memset()-ing the mutex to 0 is not allowed.
|
|
*
|
|
* @par Support System:
|
|
* linux liteos freertos.
|
|
* @par System Differ:LiteOS and Freertos supports the nested lock feature.
|
|
*/
|
|
int osal_mutex_lock(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Acquire the mutex until timeout.
|
|
*
|
|
* @par Description:
|
|
* This API is used to wait for a specified period of time to acquire the mutex.
|
|
*
|
|
* @param mutex [in] The mutex to be acquired.
|
|
* @param timeout [in] how long to wait before failing.
|
|
*
|
|
* @return OSAL_FAILURE/OSAL_SUCCESS
|
|
*
|
|
* @par Support System:
|
|
* liteos freertos.
|
|
* @par System Differ: LiteOS and Freertos supports the nested lock feature.
|
|
*/
|
|
int osal_mutex_lock_timeout(osal_mutex *mutex, unsigned int timeout);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Acquire the mutex until timeout, interruptible by signals.
|
|
*
|
|
* @par Description:
|
|
* Acquire the mutex, interruptible by signals. Lock the mutex like mutex_lock().
|
|
* If a signal is delivered while the process is sleeping, this function will return without acquiring the mutex.
|
|
*
|
|
* @param mutex [in] The mutex to be acquired.
|
|
*
|
|
* @return OSAL_FAILURE/OSAL_SUCCESS/OSAL_EINTR
|
|
*
|
|
* @par Support System:
|
|
* linux liteos.
|
|
* @par System Differ: Only LiteOS supports the nested lock feature.
|
|
*/
|
|
int osal_mutex_lock_interruptible(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Try to acquire the mutex.
|
|
*
|
|
* @par Description:
|
|
* try to acquire the mutex, without waiting.
|
|
*
|
|
* @param mutex [in] The mutex to be acquired.
|
|
*
|
|
* @return TRUE/FALSE
|
|
*
|
|
* @par Support System:
|
|
* linux liteos freertos.
|
|
* @par System Differ: LiteOS and Freertos supports the nested lock feature.
|
|
*/
|
|
int osal_mutex_trylock(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Release the mutex.
|
|
*
|
|
* @par Description:
|
|
* Release the mutex. Unlock a mutex that has been locked by this task previously.
|
|
* This function must not be used in interrupt context. Unlocking of a not locked mutex is not allowed.
|
|
*
|
|
* @param mutex [in] the mutex to be released.
|
|
*
|
|
* @par Support System:
|
|
* linux liteos freertos.
|
|
*/
|
|
void osal_mutex_unlock(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief is the mutex locked.
|
|
*
|
|
* @par Description:
|
|
* is the mutex locked.
|
|
*
|
|
* @param mutex [in] The mutex to be acquired.
|
|
*
|
|
* @return true if the mutex is locked, false if unlocked.
|
|
*
|
|
* @par Support System:
|
|
* linux freertos.
|
|
*/
|
|
int osal_mutex_is_locked(osal_mutex *mutex);
|
|
|
|
/**
|
|
* @ingroup osal_mutex
|
|
* @brief Destroy the mutex.
|
|
*
|
|
* @par Description:
|
|
* This API is used to destroy the mutex.
|
|
*
|
|
* @param mutex [in] The mutex to be destroyed.
|
|
*
|
|
* @attention
|
|
* must be called when kmod exit, otherwise will lead to memory leak; osal_mutex_destroy will free memory,
|
|
* caller should clear pointer to be NULL after called.
|
|
*
|
|
* @par Support System:
|
|
* linux liteos freertos.
|
|
*/
|
|
void osal_mutex_destroy(osal_mutex *mutex);
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
#endif /* __OSAL_MUTEX_H__ */ |