no_pthread.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (C) 2022 Amazon.com Inc. or its affiliates. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef __wasi__
  6. #error This example only compiles to WASM/WASI target
  7. #endif
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <assert.h>
  11. #include <wasi/api.h>
  12. static const int64_t SECOND = 1000 * 1000 * 1000;
  13. typedef struct {
  14. int th_ready;
  15. int value;
  16. int thread_id;
  17. } shared_t;
  18. __attribute__((export_name("wasi_thread_start"))) void
  19. wasi_thread_start(int thread_id, int *start_arg)
  20. {
  21. shared_t *data = (shared_t *)start_arg;
  22. printf("New thread ID: %d, starting parameter: %d\n", thread_id,
  23. data->value);
  24. data->thread_id = thread_id;
  25. data->value += 8;
  26. printf("Updated value: %d\n", data->value);
  27. data->th_ready = 1;
  28. __builtin_wasm_memory_atomic_notify(&data->th_ready, 1);
  29. }
  30. int
  31. main(int argc, char **argv)
  32. {
  33. shared_t data = { 0, 52, -1 };
  34. int thread_id;
  35. thread_id = __wasi_thread_spawn(&data);
  36. if (thread_id < 0) {
  37. printf("Failed to create thread: %d\n", thread_id);
  38. return EXIT_FAILURE;
  39. }
  40. if (__builtin_wasm_memory_atomic_wait32(&data.th_ready, 0, SECOND) == 2) {
  41. printf("Timeout\n");
  42. return EXIT_FAILURE;
  43. }
  44. printf("Thread completed, new value: %d, thread id: %d\n", data.value,
  45. data.thread_id);
  46. assert(thread_id == data.thread_id);
  47. return EXIT_SUCCESS;
  48. }