thread_manager.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef _THREAD_MANAGER_H
  6. #define _THREAD_MANAGER_H
  7. #include "bh_common.h"
  8. #include "bh_log.h"
  9. #include "wasm_export.h"
  10. #include "../interpreter/wasm.h"
  11. #include "../common/wasm_runtime_common.h"
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. #if WASM_ENABLE_DEBUG_INTERP != 0
  16. #define WAMR_SIG_TRAP (5)
  17. #define WAMR_SIG_STOP (19)
  18. #define WAMR_SIG_TERM (15)
  19. #define WAMR_SIG_SINGSTEP (0x1ff)
  20. #define STATUS_RUNNING (0)
  21. #define STATUS_STOP (1)
  22. #define STATUS_EXIT (2)
  23. #define STATUS_STEP (3)
  24. #define IS_WAMR_TERM_SIG(signo) ((signo) == WAMR_SIG_TERM)
  25. #define IS_WAMR_STOP_SIG(signo) \
  26. ((signo) == WAMR_SIG_STOP || (signo) == WAMR_SIG_TRAP)
  27. typedef struct WASMCurrentEnvStatus {
  28. uint64 signal_flag : 32;
  29. uint64 step_count : 16;
  30. uint64 running_status : 16;
  31. korp_mutex wait_lock;
  32. korp_cond wait_cond;
  33. } WASMCurrentEnvStatus;
  34. WASMCurrentEnvStatus *
  35. wasm_cluster_create_exenv_status();
  36. void
  37. wasm_cluster_destroy_exenv_status(WASMCurrentEnvStatus *status);
  38. void
  39. wasm_cluster_send_signal_all(WASMCluster *cluster, uint32 signo);
  40. void
  41. wasm_cluster_thread_stopped(WASMExecEnv *exec_env);
  42. void
  43. wasm_cluster_thread_waiting_run(WASMExecEnv *exec_env);
  44. void
  45. wasm_cluster_wait_thread_status(WASMExecEnv *exec_env, uint32 *status);
  46. void
  47. wasm_cluster_thread_exited(WASMExecEnv *exec_env);
  48. void
  49. wasm_cluster_thread_continue(WASMExecEnv *exec_env);
  50. void
  51. wasm_cluster_thread_send_signal(WASMExecEnv *exec_env, uint32 signo);
  52. void
  53. wasm_cluster_thread_step(WASMExecEnv *exec_env);
  54. #endif
  55. typedef struct WASMCluster {
  56. struct WASMCluster *next;
  57. korp_mutex lock;
  58. bh_list exec_env_list;
  59. /* The aux stack of a module with shared memory will be
  60. divided into several segments. This array store the
  61. stack top of different segments */
  62. uint32 *stack_tops;
  63. /* Size of every stack segment */
  64. uint32 stack_size;
  65. /* Record which segments are occupied */
  66. bool *stack_segment_occupied;
  67. } WASMCluster;
  68. void
  69. wasm_cluster_set_max_thread_num(uint32 num);
  70. bool
  71. thread_manager_init();
  72. void
  73. thread_manager_destroy();
  74. /* Create cluster */
  75. WASMCluster *
  76. wasm_cluster_create(WASMExecEnv *exec_env);
  77. /* Destroy cluster */
  78. void
  79. wasm_cluster_destroy(WASMCluster *cluster);
  80. /* Get the cluster of the current exec_env */
  81. WASMCluster *
  82. wasm_exec_env_get_cluster(WASMExecEnv *exec_env);
  83. int32
  84. wasm_cluster_create_thread(WASMExecEnv *exec_env,
  85. wasm_module_inst_t module_inst,
  86. void *(*thread_routine)(void *), void *arg);
  87. int32
  88. wasm_cluster_join_thread(WASMExecEnv *exec_env, void **ret_val);
  89. int32
  90. wasm_cluster_detach_thread(WASMExecEnv *exec_env);
  91. int32
  92. wasm_cluster_cancel_thread(WASMExecEnv *exec_env);
  93. void
  94. wasm_cluster_exit_thread(WASMExecEnv *exec_env, void *retval);
  95. bool
  96. wasm_cluster_register_destroy_callback(void (*callback)(WASMCluster *));
  97. void
  98. wasm_cluster_cancel_all_callbacks();
  99. void
  100. wasm_cluster_suspend_all(WASMCluster *cluster);
  101. void
  102. wasm_cluster_suspend_all_except_self(WASMCluster *cluster,
  103. WASMExecEnv *exec_env);
  104. void
  105. wasm_cluster_suspend_thread(WASMExecEnv *exec_env);
  106. void
  107. wasm_cluster_resume_thread(WASMExecEnv *exec_env);
  108. void
  109. wasm_cluster_resume_all(WASMCluster *cluster);
  110. void
  111. wasm_cluster_terminate_all(WASMCluster *cluster);
  112. void
  113. wasm_cluster_terminate_all_except_self(WASMCluster *cluster,
  114. WASMExecEnv *exec_env);
  115. bool
  116. wasm_cluster_add_exec_env(WASMCluster *cluster, WASMExecEnv *exec_env);
  117. bool
  118. wasm_cluster_del_exec_env(WASMCluster *cluster, WASMExecEnv *exec_env);
  119. WASMExecEnv *
  120. wasm_clusters_search_exec_env(WASMModuleInstanceCommon *module_inst);
  121. void
  122. wasm_cluster_spread_exception(WASMExecEnv *exec_env);
  123. WASMExecEnv *
  124. wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env);
  125. void
  126. wasm_cluster_destroy_spawned_exec_env(WASMExecEnv *exec_env);
  127. void
  128. wasm_cluster_spread_custom_data(WASMModuleInstanceCommon *module_inst,
  129. void *custom_data);
  130. #ifdef __cplusplus
  131. }
  132. #endif
  133. #endif /* end of _THREAD_MANAGER_H */