about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-02-05 15:59:24 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-02-11 09:45:39 +0100
commitd1e767d30c972945f7c745689a775b5f44b64daa (patch)
tree1d219cbe5e7a4e0bc414d1f5aa8e4a137962e7cd
parent4874df25a25699beb90cd99d085e19268b3731ed (diff)
downloadbox64-d1e767d30c972945f7c745689a775b5f44b64daa.tar.gz
box64-d1e767d30c972945f7c745689a775b5f44b64daa.zip
[DYNAREC] Improved bridge handling
-rwxr-xr-xsrc/tools/bridge.c46
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));