diff --git a/src/database/env_esp.cpp b/src/database/env_esp.cpp index 62d0a645..8cddd09a 100644 --- a/src/database/env_esp.cpp +++ b/src/database/env_esp.cpp @@ -36,6 +36,7 @@ #include "leveldb/slice.h" #include "leveldb/status.h" +#include "spi.hpp" #include "tasks.hpp" namespace leveldb { @@ -101,9 +102,13 @@ class EspSequentialFile final : public SequentialFile { public: EspSequentialFile(const std::string& filename, FIL file) : file_(file), filename_(filename) {} - ~EspSequentialFile() override { f_close(&file_); } + ~EspSequentialFile() override { + auto lock = drivers::acquire_spi(); + f_close(&file_); + } Status Read(size_t n, Slice* result, char* scratch) override { + auto lock = drivers::acquire_spi(); UINT read_size = 0; FRESULT res = f_read(&file_, scratch, n, &read_size); if (res != FR_OK) { // Read error. @@ -114,6 +119,7 @@ class EspSequentialFile final : public SequentialFile { } Status Skip(uint64_t n) override { + auto lock = drivers::acquire_spi(); DWORD current_pos = f_tell(&file_); FRESULT res = f_lseek(&file_, current_pos + n); if (res != FR_OK) { @@ -145,6 +151,7 @@ class EspRandomAccessFile final : public RandomAccessFile { size_t n, Slice* result, char* scratch) const override { + auto lock = drivers::acquire_spi(); FIL file; FRESULT res = f_open(&file, filename_.c_str(), FA_READ); if (res != FR_OK) { @@ -193,6 +200,7 @@ class EspWritableFile final : public WritableFile { return EspError(filename_, FR_NOT_ENABLED); } + auto lock = drivers::acquire_spi(); size_t write_size = data.size(); const char* write_data = data.data(); @@ -206,6 +214,7 @@ class EspWritableFile final : public WritableFile { } Status Close() override { + auto lock = drivers::acquire_spi(); is_open_ = false; FRESULT res = f_close(&file_); if (res != FR_OK) { @@ -220,6 +229,7 @@ class EspWritableFile final : public WritableFile { if (!is_open_) { return EspError(filename_, FR_NOT_ENABLED); } + auto lock = drivers::acquire_spi(); FRESULT res = f_sync(&file_); if (res != FR_OK) { return EspError(filename_, res); @@ -275,6 +285,7 @@ EspEnv::~EspEnv() { Status EspEnv::NewSequentialFile(const std::string& filename, SequentialFile** result) { + auto lock = drivers::acquire_spi(); FIL file; FRESULT res = f_open(&file, filename.c_str(), FA_READ); if (res != FR_OK) { @@ -288,6 +299,7 @@ Status EspEnv::NewSequentialFile(const std::string& filename, Status EspEnv::NewRandomAccessFile(const std::string& filename, RandomAccessFile** result) { + auto lock = drivers::acquire_spi(); // EspRandomAccessFile doesn't try to open the file until it's needed, so // we need to first ensure the file exists to handle the NotFound case // correctly. @@ -304,6 +316,7 @@ Status EspEnv::NewRandomAccessFile(const std::string& filename, Status EspEnv::NewWritableFile(const std::string& filename, WritableFile** result) { + auto lock = drivers::acquire_spi(); FIL file; FRESULT res = f_open(&file, filename.c_str(), FA_WRITE | FA_CREATE_ALWAYS); if (res != FR_OK) { @@ -317,6 +330,7 @@ Status EspEnv::NewWritableFile(const std::string& filename, Status EspEnv::NewAppendableFile(const std::string& filename, WritableFile** result) { + auto lock = drivers::acquire_spi(); FIL file; FRESULT res = f_open(&file, filename.c_str(), FA_WRITE | FA_OPEN_APPEND); if (res != FR_OK) { @@ -329,6 +343,7 @@ Status EspEnv::NewAppendableFile(const std::string& filename, } bool EspEnv::FileExists(const std::string& filename) { + auto lock = drivers::acquire_spi(); FILINFO info; return f_stat(filename.c_str(), &info) == FR_OK; } @@ -337,6 +352,7 @@ Status EspEnv::GetChildren(const std::string& directory_path, std::vector* result) { result->clear(); + auto lock = drivers::acquire_spi(); FF_DIR dir; FRESULT res = f_opendir(&dir, directory_path.c_str()); if (res != FR_OK) { @@ -364,6 +380,7 @@ Status EspEnv::GetChildren(const std::string& directory_path, } Status EspEnv::RemoveFile(const std::string& filename) { + auto lock = drivers::acquire_spi(); FRESULT res = f_unlink(filename.c_str()); if (res != FR_OK) { return EspError(filename, res); @@ -372,6 +389,7 @@ Status EspEnv::RemoveFile(const std::string& filename) { } Status EspEnv::CreateDir(const std::string& dirname) { + auto lock = drivers::acquire_spi(); FRESULT res = f_mkdir(dirname.c_str()); if (res != FR_OK) { return EspError(dirname, res); @@ -384,6 +402,7 @@ Status EspEnv::RemoveDir(const std::string& dirname) { } Status EspEnv::GetFileSize(const std::string& filename, uint64_t* size) { + auto lock = drivers::acquire_spi(); FILINFO info; FRESULT res = f_stat(filename.c_str(), &info); if (res != FR_OK) { @@ -402,6 +421,7 @@ Status EspEnv::RenameFile(const std::string& from, const std::string& to) { return s; } } + auto lock = drivers::acquire_spi(); FRESULT res = f_rename(from.c_str(), to.c_str()); if (res != FR_OK) { return EspError(from, res); @@ -440,6 +460,7 @@ Status EspEnv::GetTestDirectory(std::string* result) { } Status EspEnv::NewLogger(const std::string& filename, Logger** result) { + auto lock = drivers::acquire_spi(); FIL file; FRESULT res = f_open(&file, filename.c_str(), FA_WRITE | FA_OPEN_APPEND); if (res != FR_OK) {