-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathmmapfd.c
77 lines (64 loc) · 1.52 KB
/
mmapfd.c
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "mmapfd.h"
#include "logger.h"
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
N_LOG_INIT(MmapFd);
#define MmapFd_Error(func) N_LOGE("%s(%s,fd=%d)" N_LOG_ERROR_ERRNO, #func, filename, m->fd, errno)
__attribute__((nonnull)) static inline void
MmapFd_Free(MmapFd* m) {
close(m->fd);
*m = (const MmapFd){.fd = -1};
}
bool
MmapFd_Open(MmapFd* m, const char* filename, size_t size) {
NDNDPDK_ASSERT(size > 0);
*m = (const MmapFd){
.size = size,
};
m->fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0644);
if (m->fd == -1) {
MmapFd_Error(open);
return false;
}
if (fallocate(m->fd, 0, 0, size) != 0) {
MmapFd_Error(fallocate);
if (ftruncate(m->fd, size) == 0) {
N_LOGW("ftruncate succeeded in place of fallocate, this may affect write performance");
} else {
MmapFd_Error(ftruncate);
goto FAIL;
}
}
m->map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
if (m->map == MAP_FAILED) {
MmapFd_Error(mmap);
goto FAIL;
}
return true;
FAIL:
MmapFd_Free(m);
return false;
}
bool
MmapFd_Close(MmapFd* m, const char* filename, size_t size) {
NDNDPDK_ASSERT(m->size > 0);
bool ok = false;
if (msync(m->map, m->size, MS_SYNC) != 0) {
MmapFd_Error(msync);
goto FAIL;
}
if (munmap(m->map, m->size) != 0) {
MmapFd_Error(munmap);
goto FAIL;
}
if (ftruncate(m->fd, size) != 0) {
MmapFd_Error(ftruncate);
goto FAIL;
}
ok = true;
FAIL:
MmapFd_Free(m);
return ok;
}