From 7950c5cca05836a8030a807d26a5e591041a6bec Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 27 Aug 2025 22:26:08 +0200 Subject: [PATCH] [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 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/316 Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/host_memory.cpp | 42 +++++------------------ src/core/arm/dynarmic/arm_dynarmic_32.cpp | 1 - 2 files changed, 8 insertions(+), 35 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( 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(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) {} diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1731ef1aec..7bb5156147 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -175,7 +175,6 @@ public: Kernel::KProcess* m_process{}; const bool m_debugger_enabled{}; const bool m_check_memory_access{}; - static constexpr u64 MinimumRunCycles = 10000U; }; std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* page_table) const {