-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmmap_rewiring_provider_creator.hpp
53 lines (44 loc) · 1.48 KB
/
mmap_rewiring_provider_creator.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#pragma once
#include <iostream>
#include <linux/memfd.h>
#include <sys/mman.h>
#include <unistd.h>
#include <map>
#include <algorithm>
#include <cassert>
#include <climits>
#include <fcntl.h>
#include "rewiring_provider.hpp"
#include "mmap_rewiring_provider.hpp"
#include "rewiring_provider_creator.h"
//factory for creating mmap-based rewiring providers
class mmap_rewiring_provider_creator :public rewiring_provider_creator{
//file descriptor of the main memory file
int fd;
//at which file offset do we start?
size_t curr_offset=0;
public:
mmap_rewiring_provider_creator() {
//create file backed by RAM pages
fd = memfd_create("ramfile", 0);
//error handling
if (fd == -1) {
throw std::system_error(errno, std::generic_category(), "creation of ramfile failed");
}
if (ftruncate(fd, LONG_MAX) == -1) {
throw std::system_error(errno, std::generic_category(), "ftruncate failed");
}
}
std::shared_ptr<rewiring_provider> createProvider(size_t len){
//handle a request for a new "rewiring area" of len pages
//create rewiring provider at current offset
rewiring_provider* ptr= new mmap_rewiring_provider(fd,curr_offset,len);
std::shared_ptr<rewiring_provider> created(ptr);
//increase offset -> next rewiring provider does not overlap
curr_offset+=len;
return created;
}
~mmap_rewiring_provider_creator() {
close(fd);
}
};