summaryrefslogtreecommitdiff
path: root/src/database/include/env_esp.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-05-02 19:12:26 +1000
committerjacqueline <me@jacqueline.id.au>2024-05-02 19:12:26 +1000
commit1573a8c4cde1cd9528b422b2dcc598e37ffe94a7 (patch)
treed162822b8fd7054f81bace0c7a65ab4d5e6f93ef /src/database/include/env_esp.hpp
parenta231fd1c8afedbeb14b0bc77d76bad61db986059 (diff)
downloadtangara-fw-1573a8c4cde1cd9528b422b2dcc598e37ffe94a7.tar.gz
WIP merge cyclically dependent components into one big component
Diffstat (limited to 'src/database/include/env_esp.hpp')
-rw-r--r--src/database/include/env_esp.hpp143
1 files changed, 0 insertions, 143 deletions
diff --git a/src/database/include/env_esp.hpp b/src/database/include/env_esp.hpp
deleted file mode 100644
index 472a72a6..00000000
--- a/src/database/include/env_esp.hpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2023 jacqueline <me@jacqueline.id.au>
- *
- * SPDX-License-Identifier: GPL-3.0-only
- */
-
-#pragma once
-
-#include <memory>
-#include <mutex>
-#include <set>
-#include <string>
-
-#include "leveldb/env.h"
-#include "leveldb/status.h"
-
-#include "tasks.hpp"
-
-namespace leveldb {
-
-extern tasks::WorkerPool* sBackgroundThread;
-
-// Tracks the files locked by EspEnv::LockFile().
-//
-// We maintain a separate set instead of relying on fcntl(F_SETLK) because
-// fcntl(F_SETLK) does not provide any protection against multiple uses from the
-// same process.
-//
-// Instances are thread-safe because all member data is guarded by a mutex.
-class InMemoryLockTable {
- public:
- bool Insert(const std::string& fname) {
- mu_.lock();
- bool succeeded = locked_files_.insert(fname).second;
- mu_.unlock();
- return succeeded;
- }
- void Remove(const std::string& fname) {
- mu_.lock();
- locked_files_.erase(fname);
- mu_.unlock();
- }
-
- private:
- std::mutex mu_;
- std::set<std::string> locked_files_;
-};
-
-class EspEnv : public leveldb::Env {
- public:
- EspEnv();
- ~EspEnv() override;
-
- Status NewSequentialFile(const std::string& filename,
- SequentialFile** result) override;
-
- Status NewRandomAccessFile(const std::string& filename,
- RandomAccessFile** result) override;
-
- Status NewWritableFile(const std::string& filename,
- WritableFile** result) override;
-
- Status NewAppendableFile(const std::string& filename,
- WritableFile** result) override;
-
- bool FileExists(const std::string& filename) override;
-
- Status GetChildren(const std::string& directory_path,
- std::vector<std::string>* result) override;
-
- Status RemoveFile(const std::string& filename) override;
-
- Status CreateDir(const std::string& dirname) override;
-
- Status RemoveDir(const std::string& dirname) override;
-
- Status GetFileSize(const std::string& filename, uint64_t* size) override;
-
- Status RenameFile(const std::string& from, const std::string& to) override;
-
- Status LockFile(const std::string& filename, FileLock** lock) override;
-
- Status UnlockFile(FileLock* lock) override;
-
- void Schedule(void (*background_work_function)(void* background_work_arg),
- void* background_work_arg) override;
-
- void StartThread(void (*thread_main)(void* thread_main_arg),
- void* thread_main_arg) override;
-
- Status GetTestDirectory(std::string* result) override;
-
- Status NewLogger(const std::string& filename, Logger** result) override;
-
- uint64_t NowMicros() override;
-
- void SleepForMicroseconds(int micros) override;
-
- void BackgroundThreadMain();
-
- private:
- InMemoryLockTable locks_; // Thread-safe.
-};
-
-} // namespace leveldb
-
-namespace database {
-
-// Wraps an Env instance whose destructor is never created.
-//
-// Intended usage:
-// using PlatformSingletonEnv = SingletonEnv<PlatformEnv>;
-// void ConfigurePosixEnv(int param) {
-// PlatformSingletonEnv::AssertEnvNotInitialized();
-// // set global configuration flags.
-// }
-// Env* Env::Default() {
-// static PlatformSingletonEnv default_env;
-// return default_env.env();
-// }
-template <typename EnvType>
-class SingletonEnv {
- public:
- SingletonEnv() {
- static_assert(sizeof(env_storage_) >= sizeof(EnvType),
- "env_storage_ will not fit the Env");
- static_assert(alignof(decltype(env_storage_)) >= alignof(EnvType),
- "env_storage_ does not meet the Env's alignment needs");
- new (&env_storage_) EnvType();
- }
- ~SingletonEnv() = default;
-
- SingletonEnv(const SingletonEnv&) = delete;
- SingletonEnv& operator=(const SingletonEnv&) = delete;
-
- leveldb::Env* env() { return reinterpret_cast<leveldb::Env*>(&env_storage_); }
-
- private:
- typename std::aligned_storage<sizeof(EnvType), alignof(EnvType)>::type
- env_storage_;
-};
-
-} // namespace database