| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (c) 2016, Linaro Limited |
| */ |
| |
| #include <assert.h> |
| #include <kernel/spinlock.h> |
| #include "thread_private.h" |
| |
| void spinlock_count_incr(void) |
| { |
| struct thread_core_local *l = thread_get_core_local(); |
| |
| l->locked_count++; |
| assert(l->locked_count); |
| } |
| |
| void spinlock_count_decr(void) |
| { |
| struct thread_core_local *l = thread_get_core_local(); |
| |
| assert(l->locked_count); |
| l->locked_count--; |
| } |
| |
| bool have_spinlock(void) |
| { |
| struct thread_core_local *l; |
| |
| if (!thread_foreign_intr_disabled()) { |
| /* |
| * Normally we can't be holding a spinlock since doing so would |
| * imply foreign interrupts are disabled (or the spinlock |
| * logic is flawed). |
| */ |
| return false; |
| } |
| |
| l = thread_get_core_local(); |
| |
| return !!l->locked_count; |
| } |