Implement strict validation of thread IDs according to the specification (#2521)

This commit is contained in:
Marcin Kolny 2023-08-31 13:23:54 +01:00 committed by GitHub
parent 411b903cee
commit 53d7027de0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 11 additions and 13 deletions

View File

@ -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");

View File

@ -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");

View File

@ -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");

View File

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

View File

@ -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");

View File

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

View File

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