mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
Return error when exception was raised after main thread finishes (#2169)
Currently, if a thread is spawned and raises an exception after the main thread has finished, iwasm returns with success instead of returning 1 (i.e. error). Since wasm_runtime_get_wasi_exit_code waits for all threads to finish and only returns the wasi exit code, this PR performs the exception check again and returns error if an exception was raised.
This commit is contained in:
parent
47fcb8506f
commit
71d43f3ca1
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#ifndef __wasi__
|
||||
#error This example only compiles to WASM/WASI target
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "wasi_thread_start.h"
|
||||
|
||||
enum CONSTANTS {
|
||||
SECOND = 1000 * 1000 * 1000, /* 1 second */
|
||||
TIMEOUT = 1LL * SECOND
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
start_args_t base;
|
||||
} shared_t;
|
||||
|
||||
void
|
||||
__wasi_thread_start_C(int thread_id, int *start_arg)
|
||||
{
|
||||
/* Wait so that the exception is raised after the main thread has finished
|
||||
* already */
|
||||
__builtin_wasm_memory_atomic_wait32(NULL, 0, TIMEOUT);
|
||||
__builtin_trap();
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
shared_t data = { 0 };
|
||||
|
||||
assert(start_args_init(&data.base));
|
||||
int thread_id = __wasi_thread_spawn(&data);
|
||||
assert(thread_id > 0 && "Thread creation failed");
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"exit_code": 1
|
||||
}
|
|
@ -745,8 +745,12 @@ main(int argc, char *argv[])
|
|||
|
||||
#if WASM_ENABLE_LIBC_WASI != 0
|
||||
if (ret == 0) {
|
||||
/* propagate wasi exit code. */
|
||||
/* wait for threads to finish and propagate wasi exit code. */
|
||||
ret = wasm_runtime_get_wasi_exit_code(wasm_module_inst);
|
||||
if (wasm_runtime_get_exception(wasm_module_inst)) {
|
||||
/* got an exception in spawned thread */
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -549,8 +549,12 @@ main(int argc, char *argv[])
|
|||
|
||||
#if WASM_ENABLE_LIBC_WASI != 0
|
||||
if (ret == 0) {
|
||||
/* propagate wasi exit code. */
|
||||
/* wait for threads to finish and propagate wasi exit code. */
|
||||
ret = wasm_runtime_get_wasi_exit_code(wasm_module_inst);
|
||||
if (wasm_runtime_get_exception(wasm_module_inst)) {
|
||||
/* got an exception in spawned thread */
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user