let wasm_bytes;
let wasm_instance;
let wasm_memory;
+let workers = {};
const ENV = {
onyx: { memory: null },
spawn_thread(id, funcidx, dataptr) {
try {
- const worker = new Worker(__filename, {
+ workers[id] = new Worker(__filename, {
workerData: {
thread_id: id,
memory: wasm_memory,
return 0;
}
},
+
+ kill_thread(id) {
+ if (workers[id] == null) return 0;
+
+ workers[id].terminate();
+ delete workers[id];
+ workers[id] = null;
+ return 1;
+ },
}
}
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",
}
}
- 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,
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) {
#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);
thread.__exited(id);
}
-}
\ No newline at end of file
+}
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();
}