Skip to content

[nrf fromlist] settings: Only use mutexes when multithreading is enabled #3036

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions subsys/settings/src/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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) {
Expand All @@ -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;
}

Expand Down Expand Up @@ -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
}
7 changes: 3 additions & 4 deletions subsys/settings/src/settings_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
#include <zephyr/settings/settings.h>
#include "settings/settings_file.h"
#include <zephyr/kernel.h>

extern struct k_mutex settings_lock;
#include "settings_priv.h"

bool settings_subsys_initialized;

Expand All @@ -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();
Expand All @@ -40,7 +39,7 @@ int settings_subsys_init(void)
}
}

k_mutex_unlock(&settings_lock);
settings_lock_release();

return err;
}
6 changes: 6 additions & 0 deletions subsys/settings/src/settings_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 10 additions & 11 deletions subsys/settings/src/settings_store.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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;
}
Expand Down