Somewhat improved error checking in MemArena.

This commit is contained in:
Henrik Rydgård
2021-07-07 19:01:42 +02:00
parent 25cfb92a9c
commit 6c51dabe9a
6 changed files with 25 additions and 12 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ struct MemArenaData;
class MemArena {
public:
size_t roundup(size_t x);
void GrabLowMemSpace(size_t size);
bool GrabMemSpace(size_t size);
void ReleaseSpace();
void *CreateView(s64 offset, size_t size, void *base = 0);
void ReleaseView(void *view, size_t size);
+3 -2
View File
@@ -98,7 +98,7 @@ size_t MemArena::roundup(size_t x) {
return x;
}
void MemArena::GrabLowMemSpace(size_t size) {
bool MemArena::GrabMemSpace(size_t size) {
// Use ashmem so we don't have to allocate a file on disk!
const char* name = "PPSSPP_RAM";
@@ -111,8 +111,9 @@ void MemArena::GrabLowMemSpace(size_t size) {
// Note that it appears that ashmem is pinned by default, so no need to pin.
if (fd < 0) {
ERROR_LOG(MEMMAP, "Failed to grab ashmem space of size: %08x errno: %d", (int)size, (int)(errno));
return;
return false;
}
return true;
}
void MemArena::ReleaseSpace() {
+3 -1
View File
@@ -39,13 +39,15 @@ size_t MemArena::roundup(size_t x) {
return x;
}
void MemArena::GrabLowMemSpace(size_t size) {
bool MemArena::GrabMemSpace(size_t size) {
vm_size = size;
kern_return_t retval = vm_allocate(mach_task_self(), &vm_mem, size, VM_FLAGS_ANYWHERE);
if (retval != KERN_SUCCESS) {
ERROR_LOG(MEMMAP, "Failed to grab a block of virtual memory");
return false;
} else {
INFO_LOG(MEMMAP, "Successfully allocated %d bytes at %p", (int)size, (void *)vm_mem);
return true;
}
}
+12 -6
View File
@@ -50,7 +50,7 @@ bool MemArena::NeedsProbing() {
return false;
}
void MemArena::GrabLowMemSpace(size_t size) {
bool MemArena::GrabMemSpace(size_t size) {
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
// Some platforms (like Raspberry Pi) end up flushing to disk.
@@ -61,15 +61,20 @@ void MemArena::GrabLowMemSpace(size_t size) {
if (fd >= 0) {
// Great, this definitely shouldn't flush to disk.
ram_temp_file = tmpfs_ram_temp_file;
} else {
INFO_LOG(MEMMAP, "Got tmpfs ram file: %s", tmpfs_ram_temp_file.c_str());
}
} else {
INFO_LOG(MEMMAP, "'%s' does not exist. Trying other ram file options.", tmpfs_location.c_str());
}
if (fd < 0) {
INFO_LOG(MEMMAP, "Trying '%s' as ram temp file", ram_temp_file.c_str());
fd = open(ram_temp_file.c_str(), O_RDWR | O_CREAT, mode);
}
if (fd < 0) {
ERROR_LOG(MEMMAP, "Failed to grab memory space as a file: %s of size: %08x errno: %d", ram_temp_file.c_str(), (int)size, (int)(errno));
return;
ERROR_LOG(MEMMAP, "Failed to grab memory space as a file: %s of size: %08x. Error: %s", ram_temp_file.c_str(), (int)size, strerror(errno));
return false;
}
// delete immediately, we keep the fd so it still lives
if (unlink(ram_temp_file.c_str()) != 0) {
@@ -77,8 +82,9 @@ void MemArena::GrabLowMemSpace(size_t size) {
}
if (ftruncate(fd, size) != 0) {
ERROR_LOG(MEMMAP, "Failed to ftruncate %d (%s) to size %08x", (int)fd, ram_temp_file.c_str(), (int)size);
// Should this be a failure?
}
return;
return true;
}
void MemArena::ReleaseSpace() {
@@ -95,7 +101,7 @@ void *MemArena::CreateView(s64 offset, size_t size, void *base)
((base == 0) ? 0 : MAP_FIXED), fd, offset);
if (retval == MAP_FAILED) {
NOTICE_LOG(MEMMAP, "mmap on %s (fd: %d) failed", ram_temp_file.c_str(), (int)fd);
NOTICE_LOG(MEMMAP, "mmap on %s (fd: %d) failed: %s", ram_temp_file.c_str(), (int)fd, strerror(errno));
return 0;
}
return retval;
@@ -122,7 +128,7 @@ u8* MemArena::Find4GBBase() {
return reinterpret_cast<u8 *>(aligned_base);
} else {
u8 *hardcoded_ptr = reinterpret_cast<u8*>(0x2300000000ULL);
INFO_LOG(MEMMAP, "Failed to anonymously map 8GB. Fall back to the hardcoded pointer %p.", hardcoded_ptr);
INFO_LOG(MEMMAP, "Failed to anonymously map 8GB (%s). Fall back to the hardcoded pointer %p.", strerror(errno), hardcoded_ptr);
// Just grab some random 4GB...
// This has been known to fail lately though, see issue #12249.
return hardcoded_ptr;
+2 -1
View File
@@ -28,13 +28,14 @@ size_t MemArena::roundup(size_t x) {
return (x + gran - 1) & ~(gran - 1);
}
void MemArena::GrabLowMemSpace(size_t size) {
bool MemArena::GrabMemSpace(size_t size) {
#if !PPSSPP_PLATFORM(UWP)
hMemoryMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (DWORD)(size), NULL);
GetSystemInfo(&sysInfo);
#else
hMemoryMapping = 0;
#endif
return true;
}
void MemArena::ReleaseSpace() {
+4 -1
View File
@@ -213,7 +213,10 @@ bool MemoryMap_Setup(u32 flags) {
}
// Grab some pagefile backed memory out of the void ...
g_arena.GrabLowMemSpace(total_mem);
if (!g_arena.GrabMemSpace(total_mem)) {
// It'll already have logged.
return false;
}
#endif
#if !PPSSPP_PLATFORM(ANDROID)