Explorar o código

fix: fdb/fskv库的迭代器运行异常 https://gitee.com/openLuat/LuatOS/issues/I6DX8P

Wendal Chen %!s(int64=3) %!d(string=hai) anos
pai
achega
8f3963f668
Modificáronse 3 ficheiros con 35 adicións e 5 borrados
  1. 5 3
      components/fskv/luat_fskv.c
  2. 1 0
      components/fskv/luat_lib_fskv.c
  3. 29 2
      demo/fdb/main.lua

+ 5 - 3
components/fskv/luat_fskv.c

@@ -102,18 +102,20 @@ int luat_fskv_size(const char* key, char buff[4]) {
 int luat_fskv_next(char* buff, size_t offset) {
 int luat_fskv_next(char* buff, size_t offset) {
     lfs_dir_t dir = {0};
     lfs_dir_t dir = {0};
     struct lfs_info info = {0};
     struct lfs_info info = {0};
+    // offset要+2, 因为前2个值是"."和".."两个dir
+    offset += 2;
     int ret = lfs_dir_open(&sfd_lfs->lfs, &dir, "");
     int ret = lfs_dir_open(&sfd_lfs->lfs, &dir, "");
-    if (ret != LFS_ERR_OK) {
+    if (ret < 0) {
         LLOGW("lfs_dir_open ret %d", ret);
         LLOGW("lfs_dir_open ret %d", ret);
         return -1;
         return -1;
     }
     }
     ret = lfs_dir_seek(&sfd_lfs->lfs, &dir, offset);
     ret = lfs_dir_seek(&sfd_lfs->lfs, &dir, offset);
-    if (ret != LFS_ERR_OK) {
+    if (ret < 0) {
         lfs_dir_close(&sfd_lfs->lfs, &dir);
         lfs_dir_close(&sfd_lfs->lfs, &dir);
         return -2;
         return -2;
     }
     }
     ret = lfs_dir_read(&sfd_lfs->lfs, &dir, &info);
     ret = lfs_dir_read(&sfd_lfs->lfs, &dir, &info);
-    if (ret != LFS_ERR_OK) {
+    if (ret <= 0) {
         lfs_dir_close(&sfd_lfs->lfs, &dir);
         lfs_dir_close(&sfd_lfs->lfs, &dir);
         return -3;
         return -3;
     }
     }

+ 1 - 0
components/fskv/luat_lib_fskv.c

@@ -373,6 +373,7 @@ static int l_fskv_next(lua_State *L) {
     size_t *offset = lua_touserdata(L, 1);
     size_t *offset = lua_touserdata(L, 1);
     char buff[256] = {0};
     char buff[256] = {0};
     int ret = luat_fskv_next(buff, *offset);
     int ret = luat_fskv_next(buff, *offset);
+    // LLOGD("fskv.next %d %d", *offset, ret);
     if (ret == 0) {
     if (ret == 0) {
         lua_pushstring(L, buff);
         lua_pushstring(L, buff);
         *offset = *offset + 1;
         *offset = *offset + 1;

+ 29 - 2
demo/fdb/main.lua

@@ -54,10 +54,37 @@ sys.taskInit(function()
     local t = fdb.kv_get("my_bool")
     local t = fdb.kv_get("my_bool")
     log.info("fdb", "my_bool",      type(t),    t)
     log.info("fdb", "my_bool",      type(t),    t)
 
 
-    while true do
-        sys.wait(100)
+    if fdb.kv_iter then
+        local iter = fdb.kv_iter()
+        if iter then
+            while 1 do
+                local k = fdb.kv_next(iter)
+                if not k then
+                    log.info("fdb", "iter exit")
+                    break
+                end
+                log.info("fdb", k, "value", fdb.kv_get(k))
+            end
+        else
+            log.info("fdb", "iter is null")
+        end
+    else
+        log.info("fdb", "without iter")
     end
     end
 
 
+    -- 压力测试
+    local start = mcu.ticks()
+    local count = 1000
+    while count > 0 do
+        -- sys.wait(10)
+        count = count - 1
+        -- fdb.kv_set("BENT1", "--" .. os.date() .. "--")
+        -- fdb.kv_set("BENT2", "--" .. os.date() .. "--")
+        -- fdb.kv_set("BENT3", "--" .. os.date() .. "--")
+        -- fdb.kv_set("BENT4", "--" .. os.date() .. "--")
+        fdb.kv_get("my_bool")
+    end
+    log.info("fdb", (mcu.ticks() - start) / 1000)
 end)
 end)
 
 
 -- 用户代码已结束---------------------------------------------
 -- 用户代码已结束---------------------------------------------