Check for OOM
This commit is contained in:
@@ -12,37 +12,41 @@ void *mmapSafe(void *addr, size_t len, int prot, int flags, int fd,
|
||||
off_t offset) {
|
||||
void *result = mmap(addr, len, prot, flags, fd, offset);
|
||||
if (result == MAP_FAILED) {
|
||||
int err = errno;
|
||||
fprintf(
|
||||
stderr,
|
||||
int err = errno; // GCOVR_EXCL_LINE
|
||||
fprintf( // GCOVR_EXCL_LINE
|
||||
stderr, // GCOVR_EXCL_LINE
|
||||
"Error calling mmap(%p, %zu, %d, %d, %d, %jd): %d %s\n", // GCOVR_EXCL_LINE
|
||||
addr, len, prot, flags, fd, (intmax_t)offset, err,
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
addr, len, prot, flags, fd, (intmax_t)offset, err, // GCOVR_EXCL_LINE
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void mprotectSafe(void *p, size_t s, int prot) {
|
||||
if (mprotect(p, s, prot) != 0) {
|
||||
int err = errno; // GCOVR_EXCL_LINE
|
||||
fprintf(stderr, "Error calling mprotect(%p, %zu, %d): %s\n", p, s,
|
||||
prot, // GCOVR_EXCL_LINE
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
int err = errno; // GCOVR_EXCL_LINE
|
||||
fprintf(stderr, // GCOVR_EXCL_LINE
|
||||
"Error calling mprotect(%p, %zu, %d): %s\n", // GCOVR_EXCL_LINE
|
||||
p, // GCOVR_EXCL_LINE
|
||||
s, // GCOVR_EXCL_LINE
|
||||
prot, // GCOVR_EXCL_LINE
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
}
|
||||
|
||||
void munmapSafe(void *ptr, size_t size) {
|
||||
if (munmap(ptr, size) != 0) {
|
||||
int err = errno; // GCOVR_EXCL_LINE
|
||||
fprintf(stderr, "Error calling munmap(%p, %zu): %s\n", ptr,
|
||||
size, // GCOVR_EXCL_LINE
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
int err = errno; // GCOVR_EXCL_LINE
|
||||
fprintf(stderr, "Error calling munmap(%p, %zu): %s\n", // GCOVR_EXCL_LINE
|
||||
ptr, // GCOVR_EXCL_LINE
|
||||
size, // GCOVR_EXCL_LINE
|
||||
strerror(err)); // GCOVR_EXCL_LINE
|
||||
fflush(stderr); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,13 +162,14 @@ struct MemManager {
|
||||
: base((Node *)mmapSafe(nullptr, kMapSize, PROT_NONE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) {
|
||||
if (kPageSize % sizeof(Node) != 0) {
|
||||
fprintf(stderr,
|
||||
fprintf(stderr, // GCOVR_EXCL_LINE
|
||||
"kPageSize not a multiple of Node size\n"); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
if (kUpsizeBytes % kPageSize != 0) {
|
||||
fprintf(stderr, "kUpsizeBytes not a multiple of kPageSize\n");
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
fprintf(stderr, // GCOVR_EXCL_LINE
|
||||
"kUpsizeBytes not a multiple of kPageSize\n"); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
}
|
||||
~MemManager() {
|
||||
@@ -186,6 +191,13 @@ struct MemManager {
|
||||
mprotectSafe(base + firstUnaddressable, kUpsizeBytes,
|
||||
PROT_READ | PROT_WRITE);
|
||||
firstUnaddressable += kUpsizeNodes;
|
||||
if (firstUnaddressable > kMapSize / sizeof(Node)) {
|
||||
fprintf( // GCOVR_EXCL_LINE
|
||||
stderr, // GCOVR_EXCL_LINE
|
||||
"Out of memory: firstUnaddressable > kMapSize / " // GCOVR_EXCL_LINE
|
||||
"sizeof(Node)\n"); // GCOVR_EXCL_LINE
|
||||
abort(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
}
|
||||
|
||||
return next++;
|
||||
|
Reference in New Issue
Block a user