mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-09 05:06:17 +00:00
Implement strict validation of thread IDs according to the specification (#2521)
This commit is contained in:
parent
411b903cee
commit
53d7027de0
|
@ -65,7 +65,7 @@ main(int argc, char **argv)
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
printf("Thread created with id=%d\n", thread_ids[i]);
|
printf("Thread created with id=%d\n", thread_ids[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
|
|
||||||
for (int j = 0; j < i; j++) {
|
for (int j = 0; j < i; j++) {
|
||||||
assert(thread_ids[i] != thread_ids[j] && "Duplicated TIDs");
|
assert(thread_ids[i] != thread_ids[j] && "Duplicated TIDs");
|
||||||
|
|
|
@ -49,7 +49,7 @@ main(int argc, char **argv)
|
||||||
for (int i = 0; i < NUM_THREADS; i++) {
|
for (int i = 0; i < NUM_THREADS; i++) {
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -61,7 +61,7 @@ main(int argc, char **argv)
|
||||||
for (int i = 0; i < NUM_THREADS; i++) {
|
for (int i = 0; i < NUM_THREADS; i++) {
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -38,7 +38,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
assert(start_args_init(&data.base));
|
assert(start_args_init(&data.base));
|
||||||
int thread_id = __wasi_thread_spawn(&data);
|
int thread_id = __wasi_thread_spawn(&data);
|
||||||
assert(thread_id > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_id);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ main(int argc, char **argv)
|
||||||
data[i].iteration = i;
|
data[i].iteration = i;
|
||||||
|
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -50,16 +50,11 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_id = __wasi_thread_spawn(&data);
|
thread_id = __wasi_thread_spawn(&data);
|
||||||
if (thread_id < 0) {
|
ASSERT_VALID_TID(thread_id);
|
||||||
printf("Failed to create thread: %d\n", thread_id);
|
|
||||||
ret = EXIT_FAILURE;
|
|
||||||
goto final;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__builtin_wasm_memory_atomic_wait32(&data.th_ready, 0, SECOND) == 2) {
|
if (__builtin_wasm_memory_atomic_wait32(&data.th_ready, 0, SECOND) == 2) {
|
||||||
printf("Timeout\n");
|
printf("Timeout\n");
|
||||||
ret = EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
goto final;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Thread completed, new value: %d, thread id: %d\n", data.value,
|
printf("Thread completed, new value: %d, thread id: %d\n", data.value,
|
||||||
|
@ -67,7 +62,6 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
assert(thread_id == data.thread_id);
|
assert(thread_id == data.thread_id);
|
||||||
|
|
||||||
final:
|
|
||||||
start_args_deinit(&data.base);
|
start_args_deinit(&data.base);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -7,6 +7,10 @@
|
||||||
|
|
||||||
#define STACK_SIZE 32 * 1024 // same as the main stack
|
#define STACK_SIZE 32 * 1024 // same as the main stack
|
||||||
|
|
||||||
|
/* See https://github.com/WebAssembly/wasi-threads#design-choice-thread-ids */
|
||||||
|
#define ASSERT_VALID_TID(TID) \
|
||||||
|
assert(TID >= 1 && TID <= 0x1FFFFFFF && "Invalid thread ID")
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *stack;
|
void *stack;
|
||||||
} start_args_t;
|
} start_args_t;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user