Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop 319c69eae -> 7ddaff526


MYNEWT-568 Initial idx incorrect when logs empty.

At boot time, Mynewt determines the next log index to use by reading the
last entry from all persisted logs.  If there were no persisted entries,
a garbage value would be used.

Now: if all logs are empty, 0 is used.


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/7ddaff52
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/7ddaff52
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/7ddaff52

Branch: refs/heads/develop
Commit: 7ddaff5261c0143567801eb5e045784cc5fbff5f
Parents: 319c69e
Author: Christopher Collins <[email protected]>
Authored: Fri Jan 27 14:28:51 2017 -0800
Committer: Christopher Collins <[email protected]>
Committed: Fri Jan 27 14:28:51 2017 -0800

----------------------------------------------------------------------
 sys/log/full/src/log.c | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/7ddaff52/sys/log/full/src/log.c
----------------------------------------------------------------------
diff --git a/sys/log/full/src/log.c b/sys/log/full/src/log.c
index f9ca59b..05992f9 100644
--- a/sys/log/full/src/log.c
+++ b/sys/log/full/src/log.c
@@ -106,20 +106,27 @@ log_registered(struct log *log)
     return 0;
 }
 
+struct log_read_hdr_arg {
+    struct log_entry_hdr *hdr;
+    int read_success;
+};
+
 static int
 log_read_hdr_walk(struct log *log, struct log_offset *log_offset, void *dptr,
                   uint16_t len)
 {
-    struct log_entry_hdr *hdr;
+    struct log_read_hdr_arg *arg;
     int rc;
 
-    hdr = log_offset->lo_arg;
+    arg = log_offset->lo_arg;
 
-    rc = log_read(log, dptr, hdr, 0, sizeof *hdr);
-    if (rc < sizeof *hdr) {
-        return -1;
+    rc = log_read(log, dptr, arg->hdr, 0, sizeof *arg->hdr);
+    if (rc >= sizeof *arg->hdr) {
+        arg->read_success = 1;
     }
-    return 0;
+
+    /* Abort the walk; only one header needed. */
+    return 1;
 }
 
 /**
@@ -134,16 +141,23 @@ log_read_hdr_walk(struct log *log, struct log_offset 
*log_offset, void *dptr,
 static int
 log_read_last_hdr(struct log *log, struct log_entry_hdr *out_hdr)
 {
+    struct log_read_hdr_arg arg;
     struct log_offset log_offset;
-    int rc;
 
-    log_offset.lo_arg = out_hdr;
+    arg.hdr = out_hdr;
+    arg.read_success = 0;
+
+    log_offset.lo_arg = &arg;
     log_offset.lo_ts = -1;
     log_offset.lo_index = 0;
     log_offset.lo_data_len = 0;
 
-    rc = log_walk(log, log_read_hdr_walk, &log_offset);
-    return rc;
+    log_walk(log, log_read_hdr_walk, &log_offset);
+    if (!arg.read_success) {
+        return -1;
+    }
+
+    return 0;
 }
 
 /*

Reply via email to