using 'Atomics.wait' because that does what I want it to
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 2 Sep 2021 15:11:56 +0000 (10:11 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 2 Sep 2021 15:11:56 +0000 (10:11 -0500)
static/src/index.js
static/src/worker.js

index f5a85e7886885d30e14e6e92b0ed63cce754d869..edb6c0ab275d1b51f1834b562cd05cbdb4ab26ca 100644 (file)
@@ -43,20 +43,6 @@ async function run_wasm(wasm_bytes) {
                 update_running_msg();
                 break;
             }
-
-            case 'input': {
-                let input_array = new Uint8Array(input_shared_buffer);
-                Atomics.store(input_array, 0, 0);
-                let msg = prompt("Line: ");
-                input_array.fill(0);
-
-                for (let i=0; i<msg.length && i<input_array.length - 1; i++) {
-                    input_array[i + 1] = msg.charCodeAt(i);
-                }
-
-                Atomics.store(input_array, 0, 1);
-                break;
-            }
         }
     };
 
@@ -219,15 +205,16 @@ function submit_input() {
 
     write_output(input + "\n", false);
 
-    let input_array = new Uint8Array(input_shared_buffer);
-    Atomics.store(input_array, 0, 0);
+    let input_array = new Uint8Array(input_shared_buffer, 4);
     input_array.fill(0);
 
     for (let i=0; i<input.length && i<input_array.length - 1; i++) {
-        input_array[i + 1] = input.charCodeAt(i);
+        input_array[i] = input.charCodeAt(i);
     }
 
-    Atomics.store(input_array, 0, 1);
+    let atomic_array = new Int32Array(input_shared_buffer);
+    Atomics.store(atomic_array, 0, 1);
+    Atomics.notify(atomic_array, 0);
     inputbar.value = "";
 }
 
index e9b3da661c166ec892564e641f26e7466d992a1e..686d20c36de266c8ffbd20c90a3a8c28c672c20a 100644 (file)
@@ -13,9 +13,10 @@ let import_obj = {
             return Date.now();
         },
 
-        read_line_available: async function() {
-            let input_array = new Uint8Array(input_shared_buffer);
-            while (Atomics.load(input_array, 0) == 0);
+        read_line_available: function() {
+            let input_array = new Int32Array(input_shared_buffer);
+            Atomics.store(input_array, 0, 0);
+            Atomics.wait(input_array, 0, 0);
         },
 
         read_line(msgptr, msglen) { // Returns actual length
@@ -23,11 +24,12 @@ let import_obj = {
             let input_array = new Uint8Array(input_shared_buffer);
 
             let i;
-            for (i=0; input_array[i + 1] != 0 && i<msglen; i++) {
-                data[i] = input_array[i + 1];
+            for (i=0; input_array[i + 4] != 0 && i<msglen; i++) {
+                data[i] = input_array[i + 4];
             }
 
-            Atomics.store(input_array, 0, 0);
+            let atomic_stuff = new Int32Array(input_shared_buffer);
+            Atomics.store(atomic_stuff, 0, 0);
 
             return i;
         },