From: Brendan Hansen Date: Thu, 21 Oct 2021 14:51:59 +0000 (-0500) Subject: added killing threads X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=ef328fa785cda84d44fe7c1cab2ce7ca9f9d6845;p=onyx.git added killing threads --- diff --git a/bin/onyx-js b/bin/onyx-js index 90377bb4..95a9a95b 100755 --- a/bin/onyx-js +++ b/bin/onyx-js @@ -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; + }, } } diff --git a/bin/onyx-loader.js b/bin/onyx-loader.js index e60ae573..bb2514d4 100644 --- a/bin/onyx-loader.js +++ b/bin/onyx-loader.js @@ -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) { diff --git a/core/runtime/js.onyx b/core/runtime/js.onyx index c70a4f85..5d6a1a61 100644 --- a/core/runtime/js.onyx +++ b/core/runtime/js.onyx @@ -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 +} diff --git a/core/threads/thread.onyx b/core/threads/thread.onyx index 8be7cc24..da13427e 100644 --- a/core/threads/thread.onyx +++ b/core/threads/thread.onyx @@ -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(); }