瀏覽代碼

* WebAssembly threads: fix race condition, which causes sometimes an abandoned
basic event to be reported as signalled. This should fix the test tbrtlevt.pp
sometimes failing.

Nikolay Nikolov 1 年之前
父節點
當前提交
00e5289967
共有 1 個文件被更改,包括 32 次插入6 次删除
  1. 32 6
      rtl/wasi/systhrd.inc

+ 32 - 6
rtl/wasi/systhrd.inc

@@ -835,8 +835,17 @@ begin
                 end
               else if fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@P^.Signal,1,0)=1 then
                 begin
-                  result:=wrSignaled;
-                  exit;
+                  if fpc_wasm32_i32_atomic_load8_u(@P^.Destroying)<>0 then
+                    begin
+                      fpc_wasm32_i32_atomic_store(@P^.Signal,1);
+                      result:=wrAbandoned;
+                      exit;
+                    end
+                  else
+                    begin
+                      result:=wrSignaled;
+                      exit;
+                    end;
                 end
               else
                 ; { try waiting again (loop continues) }
@@ -899,8 +908,16 @@ begin
           end
         else if fpc_wasm32_i32_atomic_load(@P^.Signal)<>0 then
           begin
-            result:=wrSignaled;
-            exit;
+            if fpc_wasm32_i32_atomic_load8_u(@P^.Destroying)<>0 then
+              begin
+                result:=wrAbandoned;
+                exit;
+              end
+            else
+              begin
+                result:=wrSignaled;
+                exit;
+              end;
           end;
       until false;
     end
@@ -924,8 +941,17 @@ begin
           end
         else if fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@P^.Signal,1,0)=1 then
           begin
-            result:=wrSignaled;
-            exit;
+            if fpc_wasm32_i32_atomic_load8_u(@P^.Destroying)<>0 then
+              begin
+                fpc_wasm32_i32_atomic_store(@P^.Signal,1);
+                result:=wrAbandoned;
+                exit;
+              end
+            else
+              begin
+                result:=wrSignaled;
+                exit;
+              end;
           end;
       until false;
     end;