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);
 }