72 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-3-Clause
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * @file	spinlock.h
 | |
|  * @brief	Spinlock primitives for libmetal.
 | |
|  */
 | |
| 
 | |
| #ifndef __METAL_SPINLOCK__H__
 | |
| #define __METAL_SPINLOCK__H__
 | |
| 
 | |
| #include <metal/atomic.h>
 | |
| #include <metal/cpu.h>
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** \defgroup spinlock Spinlock Interfaces
 | |
|  *  @{ */
 | |
| struct metal_spinlock {
 | |
| 	union{
 | |
| 		atomic_int v;
 | |
| 		atomic_flag w;
 | |
| 	};
 | |
| };
 | |
| 
 | |
| /** Static metal spinlock initialization. */
 | |
| #define METAL_SPINLOCK_INIT		{ATOMIC_VAR_INIT(0)}
 | |
| 
 | |
| /**
 | |
|  * @brief	Initialize a libmetal spinlock.
 | |
|  * @param[in]	slock	Spinlock to initialize.
 | |
|  */
 | |
| static inline void metal_spinlock_init(struct metal_spinlock *slock)
 | |
| {
 | |
| 	atomic_store(&slock->v, 0);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief	Acquire a spinlock.
 | |
|  * @param[in]	slock   Spinlock to acquire.
 | |
|  * @see metal_spinlock_release
 | |
|  */
 | |
| static inline void metal_spinlock_acquire(struct metal_spinlock *slock)
 | |
| {
 | |
| 	while (atomic_flag_test_and_set(&slock->w)) {
 | |
| 		metal_cpu_yield();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief	Release a previously acquired spinlock.
 | |
|  * @param[in]	slock	Spinlock to release.
 | |
|  * @see metal_spinlock_acquire
 | |
|  */
 | |
| static inline void metal_spinlock_release(struct metal_spinlock *slock)
 | |
| {
 | |
| 	atomic_flag_clear(&slock->w);
 | |
| }
 | |
| 
 | |
| /** @} */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* __METAL_SPINLOCK__H__ */
 | 
