From ea41c3e731ed1ca51b079667cf379bcc9ce5faf5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 29 Aug 2026 06:40:20 +0000 Subject: [PATCH] revert EH handlers? --- .../backend/exception_handler_macos.cpp | 52 ++++++++++--------- .../backend/exception_handler_posix.cpp | 1 + 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp index e49602f9ef..fc627f60b2 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp @@ -82,6 +82,8 @@ private: std::thread thread; mach_port_t server_port; + + void MessagePump(); }; MachHandler::MachHandler() { @@ -95,30 +97,7 @@ MachHandler::MachHandler() { KCHECK(mach_port_request_notification(mach_task_self(), server_port, MACH_NOTIFY_PORT_DESTROYED, 0, server_port, MACH_MSG_TYPE_MAKE_SEND_ONCE, &prev)); #undef KCHECK - thread = std::thread([this] { - mach_msg_return_t mr; - MachMessage request; - MachMessage reply; - - while (true) { - mr = mach_msg(&request.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof(request), server_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (mr != MACH_MSG_SUCCESS) { - fmt::print(stderr, "dynarmic: macOS MachHandler: Failed to receive mach message. error: {:#08x} ({})\n", mr, mach_error_string(mr)); - return; - } - - if (!mach_exc_server(&request.head, &reply.head)) { - fmt::print(stderr, "dynarmic: macOS MachHandler: Unexpected mach message\n"); - return; - } - - mr = mach_msg(&reply.head, MACH_SEND_MSG, reply.head.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (mr != MACH_MSG_SUCCESS) { - fmt::print(stderr, "dynarmic: macOS MachHandler: Failed to send mach message. error: {:#08x} ({})\n", mr, mach_error_string(mr)); - return; - } - } - }); + thread = std::thread(&MachHandler::MessagePump, this); thread.detach(); } @@ -126,6 +105,31 @@ MachHandler::~MachHandler() { mach_port_deallocate(mach_task_self(), server_port); } +void MachHandler::MessagePump() { + mach_msg_return_t mr; + MachMessage request; + MachMessage reply; + + while (true) { + mr = mach_msg(&request.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof(request), server_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (mr != MACH_MSG_SUCCESS) { + fmt::print(stderr, "dynarmic: macOS MachHandler: Failed to receive mach message. error: {:#08x} ({})\n", mr, mach_error_string(mr)); + return; + } + + if (!mach_exc_server(&request.head, &reply.head)) { + fmt::print(stderr, "dynarmic: macOS MachHandler: Unexpected mach message\n"); + return; + } + + mr = mach_msg(&reply.head, MACH_SEND_MSG, reply.head.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (mr != MACH_MSG_SUCCESS) { + fmt::print(stderr, "dynarmic: macOS MachHandler: Failed to send mach message. error: {:#08x} ({})\n", mr, mach_error_string(mr)); + return; + } + } +} + #if defined(ARCHITECTURE_x86_64) kern_return_t MachHandler::HandleRequest(x86_thread_state64_t* ts) { std::lock_guard guard(code_block_infos_mutex); diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index b37e8081e4..a64423581b 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -54,6 +54,7 @@ class SigHandler { return e.first <= offset && e.first + e.second.size > offset; }); } + ankerl::unordered_dense::map code_block_infos; std::shared_mutex code_block_infos_mutex; struct sigaction old_sa_segv;