summaryrefslogtreecommitdiff
path: root/src/memory/include
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-26 11:23:53 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-26 11:23:53 +1000
commitf6d06421090f88094aba76b72b04d614f54efafa (patch)
tree6eabf0f6a9f69773289eb4ae616c9f1d771db9c3 /src/memory/include
parent2849399d5470bcd9646bf6a4f0f861e3029a5135 (diff)
downloadtangara-fw-f6d06421090f88094aba76b72b04d614f54efafa.tar.gz
Prepare for PMR with a memory_resource that understands heap_caps_malloc
Diffstat (limited to 'src/memory/include')
-rw-r--r--src/memory/include/arena.hpp91
-rw-r--r--src/memory/include/memory_resource.hpp42
2 files changed, 42 insertions, 91 deletions
diff --git a/src/memory/include/arena.hpp b/src/memory/include/arena.hpp
deleted file mode 100644
index 36471651..00000000
--- a/src/memory/include/arena.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2023 jacqueline <me@jacqueline.id.au>
- *
- * SPDX-License-Identifier: GPL-3.0-only
- */
-
-#pragma once
-
-#include <cstdint>
-#include <optional>
-#include <utility>
-
-#include "freertos/FreeRTOS.h"
-#include "freertos/queue.h"
-#include "span.hpp"
-#include "sys/_stdint.h"
-
-namespace memory {
-
-class Arena;
-
-/*
- * A pointer to data that has been given out by an Arena, plus extra accounting
- * information so that it can be returned properly.
- */
-struct ArenaPtr {
- Arena* owner;
- std::byte* start;
- std::size_t size;
- // A convenience for keeping track of the subset of the block that has had
- // data placed within it.
- std::size_t used_size;
-};
-
-/*
- * A basic memory arena. This class mediates access to fixed-size blocks of
- * memory within a larger contiguous block. This is faster than re-allocating
- * smaller blocks every time they're needed, and lets us easily limit the
- * maximum size of the memory used.
- *
- * A single arena instance is safe to be used concurrently by multiple tasks,
- * however there is no built in synchronisation of the underlying memory.
- */
-class Arena {
- public:
- Arena(std::size_t block_size, std::size_t num_blocks, uint32_t alloc_flags);
- ~Arena();
-
- /*
- * Attempts to receive an allocation from this arena. Returns absent if
- * there are no blocks left.
- */
- auto Acquire() -> std::optional<ArenaPtr>;
-
- /* Returns a previously allocated block to this arena. */
- auto Return(ArenaPtr) -> void;
-
- /* Returns the number of blocks that are currently free. */
- auto BlocksFree() -> std::size_t;
-
- Arena(const Arena&) = delete;
- Arena& operator=(const Arena&) = delete;
-
- private:
- std::size_t block_size_;
- // The large memory allocation that is divided into blocks.
- std::byte* pool_;
- // A FreeRTOS queue containing the blocks that are currently unused.
- QueueHandle_t free_blocks_;
-};
-
-/*
- * Wrapper around an ArenaPtr that handles acquiring and returning the block
- * through RAII.
- */
-class ArenaRef {
- public:
- static auto Acquire(Arena* a) -> std::optional<ArenaRef>;
- explicit ArenaRef(ArenaPtr ptr);
- ~ArenaRef();
-
- auto Release() -> ArenaPtr;
-
- ArenaRef(ArenaRef&&);
- ArenaRef(const ArenaRef&) = delete;
- Arena& operator=(const Arena&) = delete;
-
- ArenaPtr ptr;
-};
-
-} // namespace memory
diff --git a/src/memory/include/memory_resource.hpp b/src/memory/include/memory_resource.hpp
new file mode 100644
index 00000000..e1d12b2a
--- /dev/null
+++ b/src/memory/include/memory_resource.hpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2023 jacqueline <me@jacqueline.id.au>
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+#pragma once
+
+#include <memory_resource>
+#include <string>
+
+#include <esp_heap_caps.h>
+#include <stdint.h>
+
+namespace memory {
+
+enum class Capabilities : uint32_t {
+ kDefault = MALLOC_CAP_DEFAULT,
+ kInternal = MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT,
+ kDma = MALLOC_CAP_DMA,
+ kSpiRam = MALLOC_CAP_SPIRAM,
+};
+
+class Resource : public std::pmr::memory_resource {
+ public:
+ explicit Resource(Capabilities caps) : caps_(caps) {}
+
+ private:
+ Capabilities caps_;
+
+ void* do_allocate(std::size_t bytes, std::size_t alignment) override;
+
+ void do_deallocate(void* p,
+ std::size_t bytes,
+ std::size_t alignment) override;
+
+ bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override;
+};
+
+extern Resource kSpiRamResource;
+
+} // namespace memory