132 if (size > std::numeric_limits<size_t>::max() /
sizeof(
Fr)) {
136 size_t required_bytes = size *
sizeof(
Fr);
149 size_t file_size = required_bytes;
150 static std::atomic<size_t> file_counter{ 0 };
151 size_t id = file_counter.fetch_add(1);
153 std::filesystem::path temp_dir;
155 temp_dir = std::filesystem::temp_directory_path();
156 }
catch (
const std::exception&) {
157 temp_dir = std::filesystem::current_path();
162 int fd = open(filename.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
168 if (ftruncate(fd,
static_cast<off_t
>(file_size)) != 0) {
170 std::filesystem::remove(filename);
175 void* addr = mmap(
nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
176 if (addr == MAP_FAILED) {
178 std::filesystem::remove(filename);
184 file_backed_data->file_size = file_size;
185 file_backed_data->filename = filename;
186 file_backed_data->fd = fd;
187 file_backed_data->raw_data_ptr =
static_cast<Fr*
>(addr);
189 memory.raw_data =
static_cast<Fr*
>(addr);