7#ifndef _PICO_LOCK_CORE_H
8#define _PICO_LOCK_CORE_H
42#ifndef PARAM_ASSERTIONS_ENABLED_LOCK_CORE
43#define PARAM_ASSERTIONS_ENABLED_LOCK_CORE 0
47#ifndef PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND
48#ifdef PICO_SYNC_RP2350_SPIN_LOCK_WORKAROUND
49#define PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND PICO_SYNC_RP2350_SPIN_LOCK_WORKAROUND
51#define PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND (PICO_USE_SW_SPIN_LOCKS && PICO_EXCLUSIVE_ACCESS_SETS_OWN_EVENT)
87void lock_init(lock_core_t *core, uint lock_num);
89#ifndef lock_owner_id_t
96#define lock_owner_id_t int8_t
99#ifndef LOCK_INVALID_OWNER_ID
103#define LOCK_INVALID_OWNER_ID ((lock_owner_id_t)-1)
106#ifndef lock_get_caller_owner_id
112#define lock_get_caller_owner_id() ((lock_owner_id_t)get_core_num())
113#ifndef lock_is_owner_id_valid
114#define lock_is_owner_id_valid(id) ((id)>=0)
118#ifndef lock_is_owner_id_valid
119#define lock_is_owner_id_valid(id) ((id) != LOCK_INVALID_OWNER_ID)
122#ifdef lock_internal_spin_unlock_with_wait
123#define LOCK_INTERNAL_SPIN_UNLOCK_WITH_WAIT_OVERRIDDEN 1
145#if !PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND
146#define lock_internal_spin_unlock_with_wait(lock, save) spin_unlock((lock)->spin_lock, save), __wfe()
148extern volatile uint8_t lock_internal_notify_count;
167#define lock_internal_spin_unlock_with_wait(lock, save) ({ \
168 uint8_t _notify_count = lock_internal_notify_count; \
169 spin_unlock_unsafe((lock)->spin_lock); \
171 restore_interrupts_from_disabled(save); \
172 if (_notify_count == lock_internal_notify_count) __wfe(); \
177#ifdef lock_internal_spin_unlock_with_notify
178#define LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_OVERRIDDEN 1
205#if !PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND
206#define lock_internal_spin_unlock_with_notify(lock, save) spin_unlock((lock)->spin_lock, save), __sev()
211#define lock_internal_spin_unlock_with_notify(lock, save) ({ \
212 lock_internal_notify_count++; \
213 spin_unlock((lock)->spin_lock, save); \
219#ifdef lock_internal_spin_unlock_with_best_effort_wait_or_timeout
220#define LOCK_INTERNAL_SPIN_UNLOCK_WITH_BEST_EFFORT_WAIT_OR_TIMEOUT_OVERRIDDEN 1
244#if !PICO_SYNC_EXCLUSIVE_ACCESS_EVENT_WORKAROUND
245#define lock_internal_spin_unlock_with_best_effort_wait_or_timeout(lock, save, until) ({ \
246 spin_unlock((lock)->spin_lock, save); \
247 best_effort_wfe_or_timeout(until); \
252#define lock_internal_spin_unlock_with_best_effort_wait_or_timeout(lock, save, until) ({ \
253 uint8_t _notify_count = lock_internal_notify_count; \
254 spin_unlock_unsafe((lock)->spin_lock); \
256 restore_interrupts_from_disabled(save); \
257 _notify_count == lock_internal_notify_count ? best_effort_wfe_or_timeout(until) \
258 : time_reached(until); \
284#ifndef LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_WAKES_ALL
285#if !(LOCK_INTERNAL_SPIN_UNLOCK_WITH_WAIT_OVERRIDDEN | LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_OVERRIDDEN | LOCK_INTERNAL_SPIN_UNLOCK_WITH_BEST_EFFORT_WAIT_OR_TIMEOUT_OVERRIDDEN)
286#define LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_WAKES_ALL 1
288#define LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_WAKES_ALL 0
316#if LOCK_INTERNAL_SPIN_UNLOCK_WITH_NOTIFY_WAKES_ALL
317#define lock_internal_spin_unlock_maybe_notify(lock, save, others_may_proceed) spin_unlock((lock)->spin_lock, save)
319#define lock_internal_spin_unlock_maybe_notify(lock, save, others_may_proceed) ({ \
320 if (others_may_proceed) { \
321 lock_internal_spin_unlock_with_notify(lock, save); \
323 spin_unlock((lock)->spin_lock, save); \
328#ifndef sync_internal_yield_until_before
341#define sync_internal_yield_until_before(until) ((void)0)
void lock_init(lock_core_t *core, uint lock_num)
Initialise a lock structure.
Definition lock_core.c:44
Core state shared by all lock primitives.
Definition lock_core.h:69
spin_lock_t * spin_lock
Spin lock protecting this lock's state.
Definition lock_core.h:70