diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-02-05 15:59:24 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-02-11 09:45:39 +0100 |
| commit | d1e767d30c972945f7c745689a775b5f44b64daa (patch) | |
| tree | 1d219cbe5e7a4e0bc414d1f5aa8e4a137962e7cd /src/tools/bridge.c | |
| parent | 4874df25a25699beb90cd99d085e19268b3731ed (diff) | |
| download | box64-d1e767d30c972945f7c745689a775b5f44b64daa.tar.gz box64-d1e767d30c972945f7c745689a775b5f44b64daa.zip | |
[DYNAREC] Improved bridge handling
Diffstat (limited to 'src/tools/bridge.c')
| -rwxr-xr-x | src/tools/bridge.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/src/tools/bridge.c b/src/tools/bridge.c index d462155f..61960898 100755 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -103,40 +103,36 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* { brick_t *b = NULL; int sz = -1; + int ret; + + pthread_mutex_lock(&my_context->mutex_bridge); + b = bridge->last; + if(b->sz == NBRICK) { + b->next = NewBrick(b->b); + b = b->next; + bridge->last = b; + } + sz = b->sz; + b->sz++; + // add bridge to map, for fast recovery + khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret); + kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC; + pthread_mutex_unlock(&my_context->mutex_bridge); + #ifdef DYNAREC int prot = 0; - do { - #endif - pthread_mutex_lock(&my_context->mutex_bridge); - b = bridge->last; - if(b->sz == NBRICK) { - b->next = NewBrick(b->b); - b = b->next; - bridge->last = b; - } - sz = b->sz; - #ifdef DYNAREC - pthread_mutex_unlock(&my_context->mutex_bridge); - if(box64_dynarec) { - prot=(getProtection((uintptr_t)b->b)&(PROT_DYNAREC|PROT_DYNAREC_R))?1:0; - if(prot) - unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 0); // don't mark blocks, it's only new one - } - } while(sz!=b->sz); // this while loop if someone took the slot when the bridge mutex was unlocked doing memory protection managment - pthread_mutex_lock(&my_context->mutex_bridge); + if(box64_dynarec) { + prot=(getProtection((uintptr_t)b->b)&(PROT_DYNAREC|PROT_DYNAREC_R))?1:0; + if(prot) + unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 0); // don't mark blocks, it's only new one + } #endif - b->sz++; b->b[sz].CC = 0xCC; b->b[sz].S = 'S'; b->b[sz].C='C'; b->b[sz].w = w; b->b[sz].f = (uintptr_t)fnc; b->b[sz].C3 = N?0xC2:0xC3; b->b[sz].N = N; - // add bridge to map, for fast recovery - int ret; - khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret); - kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC; - pthread_mutex_unlock(&my_context->mutex_bridge); #ifdef DYNAREC if(box64_dynarec) protectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t)); |