From fb955a39752a82c219fa401415892bd4facb5845 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Fri, 4 Apr 2025 01:12:33 +0800 Subject: Decoupled alternate functions from bridge (#2500) --- src/tools/alternate.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/tools/bridge.c | 46 +--------------------------------------------- src/tools/gtkclass.c | 1 + 3 files changed, 49 insertions(+), 45 deletions(-) create mode 100644 src/tools/alternate.c (limited to 'src/tools') diff --git a/src/tools/alternate.c b/src/tools/alternate.c new file mode 100644 index 00000000..223a9eb5 --- /dev/null +++ b/src/tools/alternate.c @@ -0,0 +1,47 @@ +#include "alternate.h" +#include "custommem.h" +#include "khash.h" + +// Alternate address handling +KHASH_MAP_INIT_INT64(alternate, void*) +static kh_alternate_t *my_alternates = NULL; + +int hasAlternate(void* addr) { + if(!my_alternates) + return 0; + khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr); + if(k==kh_end(my_alternates)) + return 0; + return 1; +} + +void* getAlternate(void* addr) { + if(!my_alternates) + return addr; + khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr); + if(k!=kh_end(my_alternates)) + return kh_value(my_alternates, k); + return addr; +} +void addAlternate(void* addr, void* alt) { + if(!my_alternates) { + my_alternates = kh_init(alternate); + } + int ret; + khint_t k = kh_put(alternate, my_alternates, (uintptr_t)addr, &ret); + if(!ret) // already there + return; + kh_value(my_alternates, k) = alt; +} + +void addCheckAlternate(void* addr, void* alt) { + if(!hasAlternate(addr)) + addAlternate(addr, alt); +} + +void cleanAlternate() { + if(my_alternates) { + kh_destroy(alternate, my_alternates); + my_alternates = NULL; + } +} diff --git a/src/tools/bridge.c b/src/tools/bridge.c index 0c7ed4d7..1ad0c3e5 100644 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -17,6 +17,7 @@ #include "x64emu.h" #include "box64context.h" #include "elfloader.h" +#include "alternate.h" #ifdef DYNAREC #include "dynablock.h" #endif @@ -248,51 +249,6 @@ const char* getBridgeName(void* addr) return NULL; } - -// Alternate address handling -KHASH_MAP_INIT_INT64(alternate, void*) -static kh_alternate_t *my_alternates = NULL; - -int hasAlternate(void* addr) { - if(!my_alternates) - return 0; - khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr); - if(k==kh_end(my_alternates)) - return 0; - return 1; -} - -void* getAlternate(void* addr) { - if(!my_alternates) - return addr; - khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr); - if(k!=kh_end(my_alternates)) - return kh_value(my_alternates, k); - return addr; -} -void addAlternate(void* addr, void* alt) { - if(!my_alternates) { - my_alternates = kh_init(alternate); - } - int ret; - khint_t k = kh_put(alternate, my_alternates, (uintptr_t)addr, &ret); - if(!ret) // already there - return; - kh_value(my_alternates, k) = alt; -} - -void addCheckAlternate(void* addr, void* alt) { - if(!hasAlternate(addr)) - addAlternate(addr, alt); -} - -void cleanAlternate() { - if(my_alternates) { - kh_destroy(alternate, my_alternates); - my_alternates = NULL; - } -} - void init_bridge_helper() { } diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c index 4a24de0b..55cfb99f 100644 --- a/src/tools/gtkclass.c +++ b/src/tools/gtkclass.c @@ -7,6 +7,7 @@ #include "wrappedlibs.h" #include "bridge.h" +#include "alternate.h" #include "debug.h" #include "callback.h" #include "librarian.h" -- cgit 1.4.1