Fix wait_info data race for deletion and fix atomic_wait logic (#2016)
Fix a data race for test main_proc_exit_wait.c from #1963. And fix atomic_wait logic that was wrong before: - a thread 1 started executing wasm instruction wasm_atomic_wait but hasn't reached waiting on condition variable - a main thread calls proc_exit and notifies all the threads that reached waiting on condition variable Which leads to thread 1 hang on waiting on condition variable after that Now it's atomically checked whether proc_exit was already called.
This commit is contained in:
@ -9,6 +9,7 @@
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "wasi_thread_start.h"
|
||||
|
||||
@ -23,7 +24,6 @@ static bool termination_by_trap;
|
||||
static bool termination_in_main_thread;
|
||||
static blocking_task_type_t blocking_task_type;
|
||||
|
||||
#define TIMEOUT_SECONDS 10ll
|
||||
#define NUM_THREADS 3
|
||||
static pthread_barrier_t barrier;
|
||||
|
||||
@ -36,15 +36,14 @@ void
|
||||
run_long_task()
|
||||
{
|
||||
if (blocking_task_type == BLOCKING_TASK_BUSY_WAIT) {
|
||||
for (int i = 0; i < TIMEOUT_SECONDS; i++)
|
||||
sleep(1);
|
||||
for (;;) {
|
||||
}
|
||||
}
|
||||
else if (blocking_task_type == BLOCKING_TASK_ATOMIC_WAIT) {
|
||||
__builtin_wasm_memory_atomic_wait32(
|
||||
0, 0, TIMEOUT_SECONDS * 1000 * 1000 * 1000);
|
||||
__builtin_wasm_memory_atomic_wait32(0, 0, -1);
|
||||
}
|
||||
else {
|
||||
sleep(TIMEOUT_SECONDS);
|
||||
sleep(UINT_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user