You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/04/18 20:04:32 UTC
[14/14] incubator-mynewt-core git commit: config;
don't write value to storage if it's not changing.
config; don't write value to storage if it's not changing.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/39a6b3df
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/39a6b3df
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/39a6b3df
Branch: refs/heads/develop
Commit: 39a6b3dff68e7f511175e58dd5753db6a6dea498
Parents: 07cdc2e
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Fri Apr 15 18:29:05 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Apr 18 10:49:42 2016 -0700
----------------------------------------------------------------------
sys/config/src/config_store.c | 55 +++++++++++++++++++++++++++++++++++++-
1 file changed, 54 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/39a6b3df/sys/config/src/config_store.c
----------------------------------------------------------------------
diff --git a/sys/config/src/config_store.c b/sys/config/src/config_store.c
index 1caf600..e0905a9 100644
--- a/sys/config/src/config_store.c
+++ b/sys/config/src/config_store.c
@@ -25,6 +25,12 @@
#include "config/config.h"
#include "config_priv.h"
+struct conf_dup_check_arg {
+ const char *name;
+ const char *val;
+ int is_dup;
+};
+
struct conf_store_head conf_load_srcs = SLIST_HEAD_INITIALIZER(&conf_load_srcs);
struct conf_store *conf_save_dst;
@@ -74,18 +80,65 @@ conf_load(void)
return conf_commit(NULL);
}
+static void
+conf_dup_check_cb(char *name, char *val, void *cb_arg)
+{
+ struct conf_dup_check_arg *cdca = (struct conf_dup_check_arg *)cb_arg;
+
+ if (strcmp(name, cdca->name)) {
+ return;
+ }
+ if (!val) {
+ if (!cdca->val) {
+ cdca->is_dup = 1;
+ } else {
+ cdca->is_dup = 0;
+ }
+ } else {
+ if (cdca->val && !strcmp(val, cdca->val)) {
+ cdca->is_dup = 1;
+ } else {
+ cdca->is_dup = 0;
+ }
+ }
+}
+
/*
- * Append a single value to persisted config.
+ * Append a single value to persisted config. Don't store duplicate value.
*/
int
conf_save_one(const struct conf_handler *ch, const char *name, char *value)
{
struct conf_store *cs;
+ struct conf_dup_check_arg cdca;
+ char name_str[CONF_MAX_NAME_LEN];
+ int clen, nlen;
cs = conf_save_dst;
if (!cs) {
return OS_ENOENT;
}
+
+ /*
+ * Check if we're writing the same value again.
+ */
+ clen = strlen(ch->ch_name);
+ nlen = strlen(name);
+ if (clen + nlen + 1 > sizeof(name_str)) {
+ return OS_INVALID_PARM;
+ }
+ memcpy(name_str, ch->ch_name, clen);
+ name_str[clen++] = '/';
+ memcpy(name_str + clen, name, nlen);
+ name_str[clen + nlen] = '\0';
+
+ cdca.name = name_str;
+ cdca.val = value;
+ cdca.is_dup = 0;
+ cs->cs_itf->csi_load(cs, conf_dup_check_cb, &cdca);
+ if (cdca.is_dup == 1) {
+ return 0;
+ }
return cs->cs_itf->csi_save(cs, ch, name, value);
}