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: {
memory: wasm_memory,
wasm_bytes: wasm_bytes,
tls_base: tls_base,
+ stack_base: stack_base,
funcidx: funcidx,
dataptr: dataptr,
},
exit: function() { debugger; },
- spawn_thread: function(id, funcidx, dataptr) {
+ spawn_thread: function(id, tls_base, stack_base, funcidx, dataptr) {
try {
let needed_imports = {};
funcidx : funcidx,
dataptr : dataptr,
imports : needed_imports,
+ tls_base : tls_base,
+ stack_base : stack_base
});
return 1;
.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
+,
}
#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);
}
#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
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) {
typedef struct OnyxThread {
i32 id;
i32 tls_base;
+ i32 stack_base;
i32 funcidx;
i32 dataptr;
wasm_instance_t* instance;
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);
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);