thread_manager.h 4.4 KB

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