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:
Enrico Loparco 2023-05-05 03:20:05 +02:00 committed by GitHub
parent 47fcb8506f
commit 71d43f3ca1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 57 additions and 2 deletions

View File

@ -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;
}

View File

@ -0,0 +1,3 @@
{
"exit_code": 1
}

View File

@ -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

View File

@ -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