Guard leveldb file access with the SPI lock too

Same freeze as was previously ocurring, only this one was a fair bit
rarer.
custom
jacqueline 2 years ago
parent 5c04e2ad8d
commit 7a7fafdd92
  1. 23
      src/database/env_esp.cpp

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

Loading…
Cancel
Save