From f30c6430032560049e4f4a77498c58bfd3764583 Mon Sep 17 00:00:00 2001 From: Jamie McCrae Date: Wed, 9 Jul 2025 10:43:46 +0100 Subject: [PATCH] [nrf fromlist] settings: Only use mutexes when multithreading is enabled Allows usage of settings when multithreading is disabled Upstream PR #: 92886 Signed-off-by: Jamie McCrae --- subsys/settings/src/settings.c | 23 +++++++++++++++++++---- subsys/settings/src/settings_init.c | 7 +++---- subsys/settings/src/settings_priv.h | 6 ++++++ subsys/settings/src/settings_store.c | 21 ++++++++++----------- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/subsys/settings/src/settings.c b/subsys/settings/src/settings.c index dde6135a411..74f97bc79e5 100644 --- a/subsys/settings/src/settings.c +++ b/subsys/settings/src/settings.c @@ -23,8 +23,9 @@ LOG_MODULE_REGISTER(settings, CONFIG_SETTINGS_LOG_LEVEL); sys_slist_t settings_handlers; #endif /* CONFIG_SETTINGS_DYNAMIC_HANDLERS */ -K_MUTEX_DEFINE(settings_lock); - +#ifdef CONFIG_MULTITHREADING +static K_MUTEX_DEFINE(settings_lock); +#endif void settings_store_init(void); @@ -47,7 +48,7 @@ int settings_register_with_cprio(struct settings_handler *handler, int cprio) } } - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); struct settings_handler *ch; SYS_SLIST_FOR_EACH_CONTAINER(&settings_handlers, ch, node) { @@ -61,7 +62,7 @@ int settings_register_with_cprio(struct settings_handler *handler, int cprio) sys_slist_append(&settings_handlers, &handler->node); end: - k_mutex_unlock(&settings_lock); + settings_lock_release(); return rc; } @@ -319,3 +320,17 @@ int settings_commit_subtree(const char *subtree) return rc; } + +void settings_lock_take(void) +{ +#ifdef CONFIG_MULTITHREADING + k_mutex_lock(&settings_lock, K_FOREVER); +#endif +} + +void settings_lock_release(void) +{ +#ifdef CONFIG_MULTITHREADING + k_mutex_unlock(&settings_lock); +#endif +} diff --git a/subsys/settings/src/settings_init.c b/subsys/settings/src/settings_init.c index 7a478c8707b..a77152d712f 100644 --- a/subsys/settings/src/settings_init.c +++ b/subsys/settings/src/settings_init.c @@ -14,8 +14,7 @@ #include #include "settings/settings_file.h" #include - -extern struct k_mutex settings_lock; +#include "settings_priv.h" bool settings_subsys_initialized; @@ -28,7 +27,7 @@ int settings_subsys_init(void) int err = 0; - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); if (!settings_subsys_initialized) { settings_init(); @@ -40,7 +39,7 @@ int settings_subsys_init(void) } } - k_mutex_unlock(&settings_lock); + settings_lock_release(); return err; } diff --git a/subsys/settings/src/settings_priv.h b/subsys/settings/src/settings_priv.h index b732bcef2d8..93b47b9b789 100644 --- a/subsys/settings/src/settings_priv.h +++ b/subsys/settings/src/settings_priv.h @@ -111,6 +111,12 @@ extern sys_slist_t settings_load_srcs; extern sys_slist_t settings_handlers; extern struct settings_store *settings_save_dst; +/** Takes the settings mutex lock (if multithreading is enabled) */ +void settings_lock_take(void); + +/** Releases the settings mutex lock (if multithreading is enabled) */ +void settings_lock_release(void); + #ifdef __cplusplus } #endif diff --git a/subsys/settings/src/settings_store.c b/subsys/settings/src/settings_store.c index 4dcdb80b78f..cb5b8a0e5bd 100644 --- a/subsys/settings/src/settings_store.c +++ b/subsys/settings/src/settings_store.c @@ -22,7 +22,6 @@ LOG_MODULE_DECLARE(settings, CONFIG_SETTINGS_LOG_LEVEL); sys_slist_t settings_load_srcs; struct settings_store *settings_save_dst; -extern struct k_mutex settings_lock; void settings_src_register(struct settings_store *cs) { @@ -53,12 +52,12 @@ int settings_load_subtree(const char *subtree) * apply config * commit all */ - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) { cs->cs_itf->csi_load(cs, &arg); } rc = settings_commit_subtree(subtree); - k_mutex_unlock(&settings_lock); + settings_lock_release(); return rc; } @@ -80,11 +79,11 @@ int settings_load_subtree_direct( * apply config * commit all */ - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) { cs->cs_itf->csi_load(cs, &arg); } - k_mutex_unlock(&settings_lock); + settings_lock_release(); return 0; } @@ -144,7 +143,7 @@ ssize_t settings_get_val_len(const char *name) * for every config store that supports this function * get the value's length. */ - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) { if (cs->cs_itf->csi_get_val_len) { val_len = cs->cs_itf->csi_get_val_len(cs, name); @@ -157,7 +156,7 @@ ssize_t settings_get_val_len(const char *name) rc = cs->cs_itf->csi_load(cs, &arg); } } - k_mutex_unlock(&settings_lock); + settings_lock_release(); if (rc >= 0) { return val_len; @@ -177,7 +176,7 @@ ssize_t settings_load_one(const char *name, void *buf, size_t buf_len) * For every config store that defines csi_load_one() function use it. * Otherwise, use the csi_load() function to load the key/value pair */ - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) { if (cs->cs_itf->csi_load_one) { rc = cs->cs_itf->csi_load_one(cs, name, (char *)buf, buf_len); @@ -196,7 +195,7 @@ ssize_t settings_load_one(const char *name, void *buf, size_t buf_len) rc = cs->cs_itf->csi_load(cs, &arg); } } - k_mutex_unlock(&settings_lock); + settings_lock_release(); if (rc >= 0) { return val_len; @@ -217,11 +216,11 @@ int settings_save_one(const char *name, const void *value, size_t val_len) return -ENOENT; } - k_mutex_lock(&settings_lock, K_FOREVER); + settings_lock_take(); rc = cs->cs_itf->csi_save(cs, name, (char *)value, val_len); - k_mutex_unlock(&settings_lock); + settings_lock_release(); return rc; }