bugfix with new threads stack being created incorrectly struct-asm-rewrite
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Jan 2023 02:24:49 +0000 (20:24 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Jan 2023 02:24:49 +0000 (20:24 -0600)
bin/onyx-js
bin/onyx-loader.js
bin/onyx-thread.js
core/runtime/common.onyx
core/runtime/onyx_run.onyx
core/threads/thread.onyx
runtime/src/ort_threads.h

index 5d903b6dfccdfe1919a9cef50ddfba0296834bde..162399e4c543cb01424f8e2e3a3fbe5aab9d38b7 100755 (executable)
@@ -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,
                     },
index bb2514d4eccc535b7851c1c85a3b7e2caa1e33ae..011fc248d9f22b55be80ea9479a2c6b391c726d7 100644 (file)
@@ -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;
index f58a8fdc525a25e4915b11710be636522d297ef7..d23f77078ee4b3d09f2de0f67ce22a023656f89e 100644 (file)
@@ -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
+,
index a3db48da4cce09b3cd9c92d86afb70122e3e96c2..bee7072ed67b84ea903ec6c6227145512ab48b5e 100644 (file)
@@ -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);
index 5fdcc4f463b75b19a17a5d5aa8c16cdd29d18fc9..3dd37d3bb120b93eca8bf2b15a6e255531c91aee 100644 (file)
@@ -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
index d474f491b9c3de5a919555256d5cbe78182a98d4..3e7823a253e158b5823a36ef2609a4c2ef5e0689 100644 (file)
@@ -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) {
index 0893131f541f4185aad9eaff9d235b13132fb9c7..45481323fff278d4dc2ee73ea9271d45569a2500 100644 (file)
@@ -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);