用文件作为存储后端,有锁首次初始化时,_fdb_kv_load 中调用 fdb_kv_set_default 死锁
设了锁后,fdb_kvdb_init里调了一次db_lock: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1757-L1758
再在 _fdb_kv_load里检查到失败计数check_failed_count 和SECTOR_NUM相等时,调用fdb_kv_set_default:
https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1643-L1646
fdb_kv_set_default里又调一次db_lock:
https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1392-L1399
用递归锁可以规避,但是文档中没有见到相关描述
是的,我也遇到这个问题,第一次初始化时如果用了操作系统的锁功能会出现死锁卡死,我的环境是:STM32F429+FreeRTOS.使用互斥锁会卡死在: /* all sector header check failed */ if (check_failed_count == SECTOR_NUM) { FDB_INFO("All sector header is incorrect. Set it to default.\n"); fdb_kv_set_default(db); },我看好多人反馈这个问题了,作者是不继续维护了吗?
我的解决方法:进入fdb_kv_set_default()前先解锁。 /* all sector header check failed / if (check_failed_count == SECTOR_NUM) { FDB_INFO("All sector header is incorrect. Set it to default.\n"); / unlock the KVDB */ db_unlock(db); //if not unlock will cause a deadlock in "fdb_kv_set_default(db);" fdb_kv_set_default(db); }
我这边没有用过 FreeRTOS 呢,RT-Thread/Zephyr 及 PC 系统 Linux/Windows/MACOS + GCC 都没有问题的
欢迎提交 PR 哈