From: Brendan Hansen Date: Tue, 17 Jan 2023 02:24:49 +0000 (-0600) Subject: bugfix with new threads stack being created incorrectly X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=refs%2Fheads%2Fstruct-asm-rewrite;p=onyx.git bugfix with new threads stack being created incorrectly --- diff --git a/bin/onyx-js b/bin/onyx-js index 5d903b6d..162399e4 100755 --- a/bin/onyx-js +++ b/bin/onyx-js @@ -22,7 +22,7 @@ const ENV = { process.exit(status); }, - spawn_thread(id, tls_base, funcidx, dataptr) { + spawn_thread(id, tls_base, stack_base, funcidx, dataptr) { try { workers[id] = new Worker(__filename, { workerData: { @@ -30,6 +30,7 @@ const ENV = { memory: wasm_memory, wasm_bytes: wasm_bytes, tls_base: tls_base, + stack_base: stack_base, funcidx: funcidx, dataptr: dataptr, }, diff --git a/bin/onyx-loader.js b/bin/onyx-loader.js index bb2514d4..011fc248 100644 --- a/bin/onyx-loader.js +++ b/bin/onyx-loader.js @@ -15,7 +15,7 @@ window.ONYX_MODULES.push({ exit: function() { debugger; }, - spawn_thread: function(id, funcidx, dataptr) { + spawn_thread: function(id, tls_base, stack_base, funcidx, dataptr) { try { let needed_imports = {}; @@ -37,6 +37,8 @@ window.ONYX_MODULES.push({ funcidx : funcidx, dataptr : dataptr, imports : needed_imports, + tls_base : tls_base, + stack_base : stack_base }); return 1; diff --git a/bin/onyx-thread.js b/bin/onyx-thread.js index f58a8fdc..d23f7707 100644 --- a/bin/onyx-thread.js +++ b/bin/onyx-thread.js @@ -32,7 +32,7 @@ self.onmessage = function (msg) { .then(function(res) { self.ONYX_MEMORY = data.memory; - res.instance.exports._thread_start(data.thread_id, data.funcidx, data.dataptr); + res.instance.exports._thread_start(data.thread_id, data.tls_base, data.stack_base, data.funcidx, data.dataptr); res.instance.exports._thread_exit(data.thread_id); }); -} \ No newline at end of file +, diff --git a/core/runtime/common.onyx b/core/runtime/common.onyx index a3db48da..bee7072e 100644 --- a/core/runtime/common.onyx +++ b/core/runtime/common.onyx @@ -66,11 +66,12 @@ __thread_initialize :: () { } #if Multi_Threading_Enabled { - _thread_start :: (id: i32, tls_base: rawptr, func: (data: rawptr) -> void, data: rawptr) { + _thread_start :: (id: i32, tls_base: rawptr, stack_base: rawptr, func: (data: rawptr) -> void, data: rawptr) { __tls_base = tls_base; + __stack_top = stack_base; + context.thread_id = id; - __stack_top = raw_alloc(alloc.heap_allocator, 1 << 20); __thread_initialize(); func(data); diff --git a/core/runtime/onyx_run.onyx b/core/runtime/onyx_run.onyx index 5fdcc4f4..3dd37d3b 100644 --- a/core/runtime/onyx_run.onyx +++ b/core/runtime/onyx_run.onyx @@ -84,7 +84,7 @@ __read_from_input :: (buffer: [] u8) -> i32 { } #if Multi_Threading_Enabled { - __spawn_thread :: (id: i32, tls_base: rawptr, func: (data: rawptr) -> void, data: rawptr) -> bool #foreign "onyx_runtime" "__spawn_thread" --- + __spawn_thread :: (id: i32, tls_base: rawptr, stack_base: rawptr, func: (data: rawptr) -> void, data: rawptr) -> bool #foreign "onyx_runtime" "__spawn_thread" --- __kill_thread :: (id: i32) -> i32 #foreign "onyx_runtime" "__kill_thread" --- #export "_thread_start" _thread_start diff --git a/core/threads/thread.onyx b/core/threads/thread.onyx index d474f491..3e7823a2 100644 --- a/core/threads/thread.onyx +++ b/core/threads/thread.onyx @@ -28,7 +28,9 @@ spawn :: (t: ^Thread, data: ^$T, func: (^T) -> void) { tls_base := raw_alloc(alloc.heap_allocator, __tls_size); memory.set(tls_base, 0, __tls_size); - runtime.__spawn_thread(t.id, tls_base, func, data); + stack_base := raw_alloc(alloc.heap_allocator, 1 << 20); + + runtime.__spawn_thread(t.id, tls_base, stack_base, func, data); } join :: (t: ^Thread) { diff --git a/runtime/src/ort_threads.h b/runtime/src/ort_threads.h index 0893131f..45481323 100644 --- a/runtime/src/ort_threads.h +++ b/runtime/src/ort_threads.h @@ -5,6 +5,7 @@ typedef struct OnyxThread { i32 id; i32 tls_base; + i32 stack_base; i32 funcidx; i32 dataptr; wasm_instance_t* instance; @@ -49,7 +50,7 @@ static i32 onyx_run_thread(void *data) { i32 thread_id = thread->id; { // Call the _thread_start procedure - wasm_val_t args[] = { WASM_I32_VAL(thread_id), WASM_I32_VAL(thread->tls_base), WASM_I32_VAL(thread->funcidx), WASM_I32_VAL(thread->dataptr) }; + wasm_val_t args[] = { WASM_I32_VAL(thread_id), WASM_I32_VAL(thread->tls_base), WASM_I32_VAL(thread->stack_base), WASM_I32_VAL(thread->funcidx), WASM_I32_VAL(thread->dataptr) }; wasm_val_vec_t results = { 0, 0 }; wasm_val_vec_t args_array = WASM_ARRAY_VEC(args); @@ -73,15 +74,16 @@ static i32 onyx_run_thread(void *data) { return 0; } -ONYX_DEF(__spawn_thread, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { +ONYX_DEF(__spawn_thread, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { if (threads == NULL) bh_arr_new(bh_heap_allocator(), threads, 128); bh_arr_insert_end(threads, 1); OnyxThread *thread = &bh_arr_last(threads); - thread->id = params->data[0].of.i32; - thread->tls_base = params->data[1].of.i32; - thread->funcidx = params->data[2].of.i32; - thread->dataptr = params->data[3].of.i32; + thread->id = params->data[0].of.i32; + thread->tls_base = params->data[1].of.i32; + thread->stack_base = params->data[2].of.i32; + thread->funcidx = params->data[3].of.i32; + thread->dataptr = params->data[4].of.i32; #ifdef _BH_LINUX pthread_create(&thread->thread, NULL, onyx_run_thread, thread);