added killing threads
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 21 Oct 2021 14:51:59 +0000 (09:51 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 21 Oct 2021 14:51:59 +0000 (09:51 -0500)
bin/onyx-js
bin/onyx-loader.js
core/runtime/js.onyx
core/threads/thread.onyx

index 90377bb495a2abfe0298d0f1214a8758b0ce3353..95a9a95be6c736a4ca8d598faa1793f2b1793529 100755 (executable)
@@ -6,6 +6,7 @@ const fs = require('fs');
 let wasm_bytes;
 let wasm_instance;
 let wasm_memory;
+let workers = {};
 
 const ENV = {
     onyx: { memory: null },
@@ -23,7 +24,7 @@ const ENV = {
 
         spawn_thread(id, funcidx, dataptr) {
             try {
-                const worker = new Worker(__filename, {
+                workers[id] = new Worker(__filename, {
                     workerData: {
                         thread_id: id,
                         memory: wasm_memory,
@@ -40,6 +41,15 @@ const ENV = {
                 return 0;
             }
         },
+
+        kill_thread(id) {
+            if (workers[id] == null) return 0;
+            
+            workers[id].terminate();
+            delete workers[id];
+            workers[id] = null;
+            return 1;
+        },
     }
 }
 
index e60ae573048d720db9f335b89ab4e5f24c7a1088..bb2514d4eccc535b7851c1c85a3b7e2caa1e33ae 100644 (file)
@@ -4,6 +4,7 @@ window.ONYX_MEMORY   = null;
 window.ONYX_INSTANCE = null;
 window.ONYX_BYTES    = null;
 window.ONYX_THREAD_SCRIPT = "onyx-thread.js";
+window.ONYX_WORKERS  = {};
 
 window.ONYX_MODULES.push({
     module_name: "host",
@@ -28,8 +29,8 @@ window.ONYX_MODULES.push({
                 }
             }
 
-            const worker = new Worker(window.ONYX_THREAD_SCRIPT);
-            worker.postMessage({
+            window.ONYX_WORKERS[id] = new Worker(window.ONYX_THREAD_SCRIPT);
+            window.ONYX_WORKERS[id].postMessage({
                 thread_id  : id,
                 memory     : window.ONYX_MEMORY,
                 wasm_bytes : window.ONYX_BYTES,
@@ -45,6 +46,16 @@ window.ONYX_MODULES.push({
             return 0;
         }
     },
+
+    kill_thread(id) {
+        if (window.ONYX_WORKERS[id] == null) return 0;
+
+        window.ONYX_WORKERS[id].terminate();
+        delete window.ONYX_WORKERS[id];
+        ONYX_WORKERS[id] = null;
+
+        return 1;
+    },
 });
 
 function onyx_decode_text(ptr, len) {
index c70a4f85190d5adc4bafe3614ae874b5dbb34f7b..5d6a1a6150d838dc37cf456ec0c22a2b0eeab724 100644 (file)
@@ -21,6 +21,7 @@ __exit          :: (status: i32) -> void #foreign "host" "exit" ---
 
 #if Multi_Threading_Enabled {
     __spawn_thread :: (id: i32, func: (data: rawptr) -> void, data: rawptr) -> bool #foreign "host" "spawn_thread" ---
+    __kill_thread  :: (id: i32) -> i32 #foreign "host" "kill_thread" ---
 
     #export "_thread_start" (id: i32, func: (data: rawptr) -> void, data: rawptr) {
         __stack_top = raw_alloc(alloc.heap_allocator, 1 << 20);
@@ -38,4 +39,4 @@ __exit          :: (status: i32) -> void #foreign "host" "exit" ---
 
         thread.__exited(id);
     }
-}
\ No newline at end of file
+}
index 8be7cc24e32323b49ae048d67e1d6bfc5e9d04a2..da13427e784c55316aeaed6c7855bc232b1599e1 100644 (file)
@@ -34,6 +34,15 @@ join :: (t: ^Thread) {
     while t.alive do __atomic_wait(^t.id, t.id);
 }
 
+kill :: (t: ^Thread) -> i32 {
+    if !t.alive do return -1;
+
+    ret := runtime.__kill_thread(t.id);
+    if ret > 0 do __exited(t.id);
+
+    return 1;
+}
+
 __initialize :: () {
     thread_map->init();
 }