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