Loading...
Searching...
No Matches
mutex.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _PICO_MUTEX_H
8#define _PICO_MUTEX_H
9
10#include "pico/lock_core.h"
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
43
47typedef struct {
48 lock_core_t core;
49 lock_owner_id_t owner;
50 uint8_t enter_count;
51#if PICO_MUTEX_ENABLE_SDK120_COMPATIBILITY
52 bool recursive;
53#endif
55
59#if !PICO_MUTEX_ENABLE_SDK120_COMPATIBILITY
60typedef struct mutex {
61 lock_core_t core;
62 lock_owner_id_t owner;
64#else
65typedef recursive_mutex_t mutex_t; // they are one and the same when backwards compatible with SDK1.2.0
66#endif
67
73void mutex_init(mutex_t *mtx);
74
83
93
103
115bool mutex_try_enter(mutex_t *mtx, uint32_t *owner_out);
116
130
143bool recursive_mutex_try_enter(recursive_mutex_t *mtx, uint32_t *owner_out);
144
156bool mutex_enter_timeout_ms(mutex_t *mtx, uint32_t timeout_ms);
157
170bool recursive_mutex_enter_timeout_ms(recursive_mutex_t *mtx, uint32_t timeout_ms);
171
184bool mutex_enter_timeout_us(mutex_t *mtx, uint32_t timeout_us);
185
198bool recursive_mutex_enter_timeout_us(recursive_mutex_t *mtx, uint32_t timeout_us);
199
213
227
233void mutex_exit(mutex_t *mtx);
234
241
248static inline bool mutex_is_initialized(mutex_t *mtx) {
249 return mtx->core.spin_lock != 0;
250}
251
259 return mtx->core.spin_lock != 0;
260}
261
283#define auto_init_mutex(name) static __attribute__((section(".mutex_array"))) mutex_t name
284
306#define auto_init_recursive_mutex(name) static __attribute__((section(".mutex_array"))) recursive_mutex_t name = { .core = { .spin_lock = (spin_lock_t *)1 /* marker for runtime_init */ }, .owner = 0, .enter_count = 0 }
307
308void runtime_init_mutex(void);
309
310#ifdef __cplusplus
311}
312#endif
313#endif
#define lock_owner_id_t
type to use to store the 'owner' of a lock.
Definition lock_core.h:96
void recursive_mutex_exit(recursive_mutex_t *mtx)
Release ownership of a recursive mutex.
Definition mutex.c:222
void recursive_mutex_init(recursive_mutex_t *mtx)
Initialise a recursive mutex structure.
Definition mutex.c:52
bool mutex_enter_timeout_ms(mutex_t *mtx, uint32_t timeout_ms)
Wait for mutex with timeout.
Definition mutex.c:146
bool mutex_enter_timeout_us(mutex_t *mtx, uint32_t timeout_us)
Wait for mutex with timeout.
Definition mutex.c:154
void mutex_enter_blocking(mutex_t *mtx)
Take ownership of a mutex.
Definition mutex.c:62
bool mutex_enter_block_until(mutex_t *mtx, absolute_time_t until)
Wait for mutex until a specific time.
Definition mutex.c:162
bool recursive_mutex_enter_block_until(recursive_mutex_t *mtx, absolute_time_t until)
Wait for mutex until a specific time.
Definition mutex.c:187
bool mutex_try_enter_block_until(mutex_t *mtx, absolute_time_t until)
Attempt to take ownership of a mutex until the specified time.
Definition mutex.c:118
static bool recursive_mutex_is_initialized(recursive_mutex_t *mtx)
Test for recursive mutex initialized state.
Definition mutex.h:258
bool mutex_try_enter(mutex_t *mtx, uint32_t *owner_out)
Attempt to take ownership of a mutex.
Definition mutex.c:99
void mutex_init(mutex_t *mtx)
Initialise a mutex structure.
Definition mutex.c:43
struct mutex mutex_t
regular (non recursive) mutex instance
void recursive_mutex_enter_blocking(recursive_mutex_t *mtx)
Take ownership of a recursive mutex.
Definition mutex.c:82
bool recursive_mutex_enter_timeout_ms(recursive_mutex_t *mtx, uint32_t timeout_ms)
Wait for recursive mutex with timeout.
Definition mutex.c:150
bool recursive_mutex_try_enter(recursive_mutex_t *mtx, uint32_t *owner_out)
Attempt to take ownership of a recursive mutex.
Definition mutex.c:129
static bool mutex_is_initialized(mutex_t *mtx)
Test for mutex initialized state.
Definition mutex.h:248
bool recursive_mutex_enter_timeout_us(recursive_mutex_t *mtx, uint32_t timeout_us)
Wait for recursive mutex with timeout.
Definition mutex.c:158
void mutex_exit(mutex_t *mtx)
Release ownership of a mutex.
Definition mutex.c:209
uint64_t absolute_time_t
An opaque 64 bit timestamp in microseconds.
Definition types.h:43
spin_lock_t * spin_lock
Spin lock protecting this lock's state.
Definition lock_core.h:70
regular (non recursive) mutex instance
Definition mutex.h:60
lock_core_t core
Core lock primitive shared by all lock types.
Definition mutex.h:61
recursive mutex instance
Definition mutex.h:47
lock_core_t core
Core lock primitive shared by all lock types.
Definition mutex.h:48
uint8_t enter_count
owner id LOCK_INVALID_OWNER_ID for unowned
Definition mutex.h:50