12#ifndef ZEPHYR_INCLUDE_SPINLOCK_H_
13#define ZEPHYR_INCLUDE_SPINLOCK_H_
18#include <zephyr/arch/cpu.h>
34struct z_spinlock_key {
50#ifdef CONFIG_SPIN_VALIDATE
55#ifdef CONFIG_SPIN_LOCK_TIME_LIMIT
62#if defined(CONFIG_CPP) && !defined(CONFIG_SMP) && \
63 !defined(CONFIG_SPIN_VALIDATE)
85#ifdef CONFIG_SPIN_VALIDATE
88void z_spin_lock_set_owner(
struct k_spinlock *l);
89BUILD_ASSERT(CONFIG_MP_MAX_NUM_CPUS <= 4,
"Too many CPUs for mask");
91# ifdef CONFIG_KERNEL_COHERENCE
92bool z_spin_lock_mem_coherent(
struct k_spinlock *l);
113#ifdef CONFIG_SPIN_VALIDATE
114 __ASSERT(z_spin_lock_valid(l),
"Invalid spinlock %p", l);
115#ifdef CONFIG_KERNEL_COHERENCE
116 __ASSERT_NO_MSG(z_spin_lock_mem_coherent(l));
124#ifdef CONFIG_SPIN_VALIDATE
125 z_spin_lock_set_owner(l);
126#if defined(CONFIG_SPIN_LOCK_TIME_LIMIT) && (CONFIG_SPIN_LOCK_TIME_LIMIT != 0)
171 z_spinlock_validate_pre(l);
177 z_spinlock_validate_post(l);
200 z_spinlock_validate_pre(l);
207 z_spinlock_validate_post(l);
239#ifdef CONFIG_SPIN_VALIDATE
240 __ASSERT(z_spin_unlock_valid(l),
"Not my spinlock %p", l);
242#if defined(CONFIG_SPIN_LOCK_TIME_LIMIT) && (CONFIG_SPIN_LOCK_TIME_LIMIT != 0)
245 __ASSERT(delta < CONFIG_SPIN_LOCK_TIME_LIMIT,
246 "Spin lock %p held %u cycles, longer than limit of %u cycles",
247 l, delta, CONFIG_SPIN_LOCK_TIME_LIMIT);
268#if defined(CONFIG_SMP) && defined(CONFIG_TEST)
286#ifdef CONFIG_SPIN_VALIDATE
287 __ASSERT(z_spin_unlock_valid(l),
"Not my spinlock %p", l);
294#if defined(CONFIG_SPIN_VALIDATE) && defined(__GNUC__)
297 __ASSERT(k->key,
"K_SPINLOCK exited with goto, break or return, "
298 "use K_SPINLOCK_BREAK instead.");
300#define K_SPINLOCK_ONEXIT __attribute__((__cleanup__(z_spin_onexit)))
302#define K_SPINLOCK_ONEXIT
315#define K_SPINLOCK_BREAK continue
358#define K_SPINLOCK(lck) \
359 for (k_spinlock_key_t __i K_SPINLOCK_ONEXIT = {}, __key = k_spin_lock(lck); !__i.key; \
360 k_spin_unlock(lck, __key), __i.key = 1)
uint32_t sys_clock_cycle_get_32(void)
static ALWAYS_INLINE unsigned int arch_irq_lock(void)
Disable all interrupts on the local CPU.
Definition: irq.h:168
static ALWAYS_INLINE void arch_irq_unlock(unsigned int key)
Definition: irq.h:176
void arch_spin_relax(void)
Perform architecture specific processing within spin loops.
long atomic_t
Definition: atomic.h:22
static ALWAYS_INLINE bool atomic_cas(atomic_t *target, atomic_val_t oldval, atomic_val_t newval)
Definition: atomic_xtensa.h:42
static ALWAYS_INLINE atomic_val_t atomic_clear(atomic_t *target)
Definition: atomic_xtensa.h:133
#define ALWAYS_INLINE
Definition: common.h:129
static ALWAYS_INLINE int k_spin_trylock(struct k_spinlock *l, k_spinlock_key_t *k)
Attempt to lock a spinlock.
Definition: spinlock.h:196
static ALWAYS_INLINE void k_spin_unlock(struct k_spinlock *l, k_spinlock_key_t key)
Unlock a spin lock.
Definition: spinlock.h:235
static ALWAYS_INLINE k_spinlock_key_t k_spin_lock(struct k_spinlock *l)
Lock a spinlock.
Definition: spinlock.h:160
struct z_spinlock_key k_spinlock_key_t
Spinlock key type.
Definition: spinlock.h:108
#define EBUSY
Mount device busy.
Definition: errno.h:55
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:105
Kernel Spin Lock.
Definition: spinlock.h:45
atomic_t locked
Definition: spinlock.h:47