diff options
author | Petri Savolainen <petri.savolainen@nokia.com> | 2015-09-09 13:52:24 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2015-12-29 14:07:51 +0300 |
commit | a0b30a27b75bfef55d72f05da3b43cd26c6a4543 (patch) | |
tree | 8060a57ac8da585aee96a06dab470b1a393d18e0 /include/odp/api/spinlock_recursive.h | |
parent | 7168948a67a0317008c6fd9dc4abff3948bfecc9 (diff) |
api: spinlock_recursive: added recursive spinlock
Applications can use recursive spinlocks to avoid deadlock from
single thread acquiring the same lock multiple times. Recursive
locks are used in legacy applications. ODP version of recursive
spinlock enable porting of those applications.
Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com>
Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Conflicts:
platform/linux-generic/Makefile.am
Diffstat (limited to 'include/odp/api/spinlock_recursive.h')
-rw-r--r-- | include/odp/api/spinlock_recursive.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/include/odp/api/spinlock_recursive.h b/include/odp/api/spinlock_recursive.h new file mode 100644 index 000000000..46b6be762 --- /dev/null +++ b/include/odp/api/spinlock_recursive.h @@ -0,0 +1,82 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP recursive spinlock + */ + +#ifndef ODP_API_SPINLOCK_RECURSIVE_H_ +#define ODP_API_SPINLOCK_RECURSIVE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup odp_synchronizers + * Operations on recursive spinlocks. + * @{ + */ + +/** + * @typedef odp_spinlock_recursive_t + * Recursive spinlock + * + * A thread can acquire the lock multiple times without a deadlock. To release + * the lock, the thread must unlock it the same number of times. + */ + +/** + * Initialize recursive spinlock. + * + * @param lock Pointer to a lock + */ +void odp_spinlock_recursive_init(odp_spinlock_recursive_t *lock); + +/** + * Acquire recursive spinlock. + * + * @param lock Pointer to a lock + */ +void odp_spinlock_recursive_lock(odp_spinlock_recursive_t *lock); + +/** + * Try to acquire recursive spinlock. + * + * @param lock Pointer to a lock + * + * @retval 1 lock acquired + * @retval 0 lock not acquired + */ +int odp_spinlock_recursive_trylock(odp_spinlock_recursive_t *lock); + +/** + * Release recursive spinlock. + * + * @param lock Pointer to a lock + */ +void odp_spinlock_recursive_unlock(odp_spinlock_recursive_t *lock); + +/** + * Check if recursive spinlock is locked. + * + * @param lock Pointer to a lock + * + * @retval 1 lock is locked + * @retval 0 lock is not locked + */ +int odp_spinlock_recursive_is_locked(odp_spinlock_recursive_t *lock); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif |