aboutsummaryrefslogtreecommitdiff
path: root/src/common/host_memory.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-08-27 22:26:08 +0200
committercrueter <crueter@eden-emu.dev>2025-08-27 22:26:08 +0200
commit7950c5cca05836a8030a807d26a5e591041a6bec (patch)
tree18c80f8fa790ab63da89ad11d5c2e4bcaa3a40de /src/common/host_memory.cpp
parent09e77fa146f6630c8a01f59166a572dd58a30d2e (diff)
[common/host_memory] use assert instead of throw on Impl() ctor; abort on error (#316)
Rationale: Throwing when running out of memory just creates sad paths for no reason (and at that point, just abort immediately). We are using MAP_NORESERVE, if there isn't enough memory a crash will follow anyways. Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/316 Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/common/host_memory.cpp')
-rw-r--r--src/common/host_memory.cpp42
1 files changed, 8 insertions, 34 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index 949cd188f3..f847ea2a62 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -477,19 +477,9 @@ class HostMemory::Impl {
public:
explicit Impl(size_t backing_size_, size_t virtual_size_)
: backing_size{backing_size_}, virtual_size{virtual_size_} {
- bool good = false;
- SCOPE_EXIT {
- if (!good) {
- Release();
- }
- };
-
long page_size = sysconf(_SC_PAGESIZE);
- if (page_size != 0x1000) {
- LOG_CRITICAL(HW_Memory, "page size {:#x} is incompatible with 4K paging", page_size);
- throw std::bad_alloc{};
- }
-
+ ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging",
+ page_size);
// Backing memory initialization
#if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__)
fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
@@ -501,38 +491,23 @@ public:
#else
fd = memfd_create("HostMemory", 0);
#endif
- if (fd < 0) {
- LOG_CRITICAL(HW_Memory, "memfd_create failed: {}", strerror(errno));
- throw std::bad_alloc{};
- }
+ ASSERT_MSG(fd >= 0, "memfd_create failed: {}", strerror(errno));
// Defined to extend the file with zeros
int ret = ftruncate(fd, backing_size);
- if (ret != 0) {
- LOG_CRITICAL(HW_Memory, "ftruncate failed with {}, are you out-of-memory?",
- strerror(errno));
- throw std::bad_alloc{};
- }
+ ASSERT_MSG(ret == 0, "ftruncate failed with {}, are you out-of-memory?", strerror(errno));
backing_base = static_cast<u8*>(
mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
- if (backing_base == MAP_FAILED) {
- LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
- throw std::bad_alloc{};
- }
+ ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno));
// Virtual memory initialization
virtual_base = virtual_map_base = static_cast<u8*>(ChooseVirtualBase(virtual_size));
- if (virtual_base == MAP_FAILED) {
- LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
- throw std::bad_alloc{};
- }
+ ASSERT_MSG(virtual_base != MAP_FAILED, "mmap failed: {}", strerror(errno));
#if defined(__linux__)
madvise(virtual_base, virtual_size, MADV_HUGEPAGE);
#endif
-
free_manager.SetAddressSpace(virtual_base, virtual_size);
- good = true;
}
~Impl() {
@@ -673,10 +648,9 @@ private:
class HostMemory::Impl {
public:
- explicit Impl(size_t /*backing_size */, size_t /* virtual_size */) {
+ explicit Impl([[maybe_unused]] size_t backing_size, [[maybe_unused]] size_t virtual_size) {
// This is just a place holder.
- // Please implement fastmem in a proper way on your platform.
- throw std::bad_alloc{};
+ ASSERT_MSG(false, "Please implement fastmem in a proper way on your platform.");
}
void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm) {}