about summary refs log tree commit diff stats
path: root/src/custommem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/custommem.c')
-rw-r--r--src/custommem.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 3aae1b90..b6cfa043 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1174,15 +1174,14 @@ int IsInHotPage(uintptr_t addr) {
     if(addr<=(1LL<<48))
         return 0;
     int idx = (addr>>MEMPROT_SHIFT)>>16;
-    if(!memprot[idx].hot)
+    uint8_t *block = memprot[idx].hot;
+    if(!block)
         return 0;
     int base = (addr>>MEMPROT_SHIFT)&0xffff;
-    if(!memprot[idx].hot[base])
+    if(!block[base])
         return 0;
     // decrement hot
-    pthread_mutex_lock(&mutex_prot);
-    memprot[idx].hot[base]-=1;
-    pthread_mutex_unlock(&mutex_prot);
+    native_lock_decifnot0b(&block[base]);
     return 1;
 }
 
@@ -1196,39 +1195,36 @@ int AreaInHotPage(uintptr_t start, uintptr_t end_) {
         //dynarec_log(LOG_DEBUG, "00\n");
         return 0;
     }
+    int ret = 0;
     for (uintptr_t i=idx; i<=end; ++i) {
         uint8_t *block = memprot[i>>16].hot;
-        uint32_t hot = block?block[i&0xffff]:0;
-        if(hot) {
-            // decrement hot
-            pthread_mutex_lock(&mutex_prot);
-            block[i&0xffff]-=1;
-            pthread_mutex_unlock(&mutex_prot);
-            //dynarec_log(LOG_DEBUG, "1\n");
-            return 1;
+        if(block) {
+            uint32_t hot = block[i&0xffff];
+            if(hot) {
+                // decrement hot
+                native_lock_decifnot0b(&block[i&0xffff]);
+                //dynarec_log(LOG_DEBUG, "1\n");
+                ret = 1;
+            }
+        } else {
+            i+=0xffff;
         }
     }
     //dynarec_log(LOG_DEBUG, "0\n");
-    return 0;
+    return ret;
 
 }
 
 void AddHotPage(uintptr_t addr) {
     int idx = (addr>>MEMPROT_SHIFT)>>16;
     int base = (addr>>MEMPROT_SHIFT)&0xffff;
-    pthread_mutex_lock(&mutex_prot);
     if(!memprot[idx].hot) {
             uint8_t* newblock = box_calloc(1<<16, sizeof(uint8_t));
-#if 0 //def ARM64   //disabled for now, not usefull with the mutex
-            if (native_lock_storeifref(&memprot[i], newblock, memprot_default) != newblock) {
+            if (native_lock_storeifnull(&memprot[idx].hot, newblock) != newblock) {
                 box_free(newblock);
             }
-#else
-            memprot[idx].hot = newblock;
-#endif
     }
-    memprot[idx].hot[base] = HOTPAGE_STEP;
-    pthread_mutex_unlock(&mutex_prot);
+    native_lock_storeb(&memprot[idx].hot[base], HOTPAGE_STEP);
 }
 #endif