Browse Source

+ added AtomicWait() to the WebAssembly unit

Nikolay Nikolov 3 years ago
parent
commit
19cce3e42e
1 changed files with 33 additions and 0 deletions
  1. 33 0
      rtl/wasm32/webassembly.pp

+ 33 - 0
rtl/wasm32/webassembly.pp

@@ -19,6 +19,14 @@ unit WebAssembly;
 
 interface
 
+const
+  { Special values for the TimeoutNanoseconds parameter of AtomicWait }
+  awtInfiniteTimeout = -1;
+  { AtomicWait result values }
+  awrOk = 0;       { woken by another agent in the cluster }
+  awrNotEqual = 1; { the loaded value did not match the expected value }
+  awrTimedOut = 2; { not woken before timeout expired }
+
 procedure AtomicFence; inline;
 
 function AtomicLoad(constref Mem: Int8): Int8; inline;
@@ -102,6 +110,11 @@ function AtomicCompareExchange(var Mem: UInt32; Compare, Data: UInt32): UInt32;
 function AtomicCompareExchange(var Mem: Int64; Compare, Data: Int64): Int64; inline;
 function AtomicCompareExchange(var Mem: UInt64; Compare, Data: UInt64): UInt64; inline;
 
+function AtomicWait(constref Mem: Int32; Compare: Int32; TimeoutNanoseconds: Int64): Int32;
+function AtomicWait(constref Mem: UInt32; Compare: UInt32; TimeoutNanoseconds: Int64): Int32;
+function AtomicWait(constref Mem: Int64; Compare: Int64; TimeoutNanoseconds: Int64): Int32;
+function AtomicWait(constref Mem: UInt64; Compare: UInt64; TimeoutNanoseconds: Int64): Int32;
+
 implementation
 
 {$I cpuh.inc}
@@ -471,4 +484,24 @@ begin
   AtomicCompareExchange:=fpc_wasm32_i64_atomic_rmw_cmpxchg_u(@Mem,Compare,Data);
 end;
 
+function AtomicWait(constref Mem: Int32; Compare: Int32; TimeoutNanoseconds: Int64): Int32;
+begin
+  AtomicWait:=fpc_wasm32_memory_atomic_wait32(@Mem,LongWord(Compare),TimeoutNanoseconds);
+end;
+
+function AtomicWait(constref Mem: UInt32; Compare: UInt32; TimeoutNanoseconds: Int64): Int32;
+begin
+  AtomicWait:=fpc_wasm32_memory_atomic_wait32(@Mem,Compare,TimeoutNanoseconds);
+end;
+
+function AtomicWait(constref Mem: Int64; Compare: Int64; TimeoutNanoseconds: Int64): Int32;
+begin
+  AtomicWait:=fpc_wasm32_memory_atomic_wait64(@Mem,QWord(Compare),TimeoutNanoseconds);
+end;
+
+function AtomicWait(constref Mem: UInt64; Compare: UInt64; TimeoutNanoseconds: Int64): Int32;
+begin
+  AtomicWait:=fpc_wasm32_memory_atomic_wait64(@Mem,Compare,TimeoutNanoseconds);
+end;
+
 end.