Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
backing_memory.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
8
11#include "unistd.h"
12#include <atomic>
13#include <cstring>
14#include <fcntl.h>
15#include <filesystem>
16#include <memory>
17#ifndef __wasm__
18#include <sys/mman.h>
19#endif
20
21// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
22extern bool slow_low_memory;
23
24template <typename T> class AlignedMemory;
25
26#ifndef __wasm__
27template <typename T> class FileBackedMemory;
28#endif
29
30template <typename Fr> class BackingMemory {
31 public:
32 BackingMemory() = default;
33
34 BackingMemory(const BackingMemory&) = delete; // delete copy constructor
35 BackingMemory& operator=(const BackingMemory&) = delete; // delete copy assignment
36
37 BackingMemory(BackingMemory&& other) = delete; // delete move constructor
38 BackingMemory& operator=(const BackingMemory&&) = delete; // delete move assignment
39
40 virtual Fr* raw_data() = 0;
41
43 {
44#ifndef __wasm__
45 if (slow_low_memory) {
47 }
48#endif
50 }
51
52 virtual ~BackingMemory() = default;
53};
54
55template <typename T> class AlignedMemory : public BackingMemory<T> {
56 public:
57 T* raw_data() { return data.get(); }
58
59 private:
60 AlignedMemory(size_t size)
61 : BackingMemory<T>()
62 // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
63 , data(std::static_pointer_cast<T[]>(std::move(bb::get_mem_slab(sizeof(T) * size))))
64 {}
65
66 // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
67 std::shared_ptr<T[]> data;
68
70};
71
72#ifndef __wasm__
73template <typename T> class FileBackedMemory : public BackingMemory<T> {
74 public:
75 FileBackedMemory(const FileBackedMemory&) = delete; // delete copy constructor
76 FileBackedMemory& operator=(const FileBackedMemory&) = delete; // delete copy assignment
77
78 FileBackedMemory(FileBackedMemory&& other) = delete; // delete move constructor
79 FileBackedMemory& operator=(const FileBackedMemory&&) = delete; // delete move assignment
80
81 T* raw_data() { return memory; }
82
84 {
85 if (file_size == 0) {
86 return;
87 }
88 if (memory != nullptr && file_size > 0) {
89 munmap(memory, file_size);
90 }
91 if (fd >= 0) {
92 close(fd);
93 }
94 if (!filename.empty()) {
95 std::filesystem::remove(filename);
96 }
97 }
98
99 private:
100 // Create a new file-backed memory region
101 FileBackedMemory(size_t size)
102 : BackingMemory<T>()
103 , file_size(size * sizeof(T))
104 {
105 if (file_size == 0) {
106 return;
107 }
108
109 static std::atomic<size_t> file_counter{ 0 };
110 size_t id = file_counter.fetch_add(1);
111 std::filesystem::path temp_dir;
112 try {
113 temp_dir = std::filesystem::temp_directory_path();
114 } catch (const std::exception&) {
115 // Fallback to current directory if temp_directory_path() fails
116 temp_dir = std::filesystem::current_path();
117 }
118
119 filename = temp_dir / ("poly-mmap-" + std::to_string(getpid()) + "-" + std::to_string(id));
120
121 fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
122 // Create file
123 if (fd < 0) {
124 throw_or_abort("Failed to create backing file: " + filename);
125 }
126
127 // Set file size
128 if (ftruncate(fd, static_cast<off_t>(file_size)) != 0) {
129 throw_or_abort("Failed to set file size");
130 }
131
132 // Memory map the file
133 void* addr = mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
134 if (addr == MAP_FAILED) {
135 throw_or_abort("Failed to mmap file: " + std::string(std::strerror(errno)));
136 }
137
138 memory = static_cast<T*>(addr);
139 }
140
141 size_t file_size;
142 std::string filename;
143 int fd;
145
147};
148#endif // __EMSCRIPTEN___
bool slow_low_memory
std::shared_ptr< T[]> data
AlignedMemory(size_t size)
BackingMemory()=default
virtual Fr * raw_data()=0
static std::shared_ptr< BackingMemory< Fr > > allocate(size_t size)
BackingMemory(const BackingMemory &)=delete
BackingMemory & operator=(const BackingMemory &)=delete
BackingMemory & operator=(const BackingMemory &&)=delete
virtual ~BackingMemory()=default
BackingMemory(BackingMemory &&other)=delete
FileBackedMemory(size_t size)
FileBackedMemory & operator=(const FileBackedMemory &&)=delete
FileBackedMemory(const FileBackedMemory &)=delete
FileBackedMemory & operator=(const FileBackedMemory &)=delete
FileBackedMemory(FileBackedMemory &&other)=delete
Entry point for Barretenberg command-line interface.
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
void throw_or_abort(std::string const &err)