wasm_exec_env.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "wasm_exec_env.h"
  6. #include "wasm_runtime_common.h"
  7. #if WASM_ENABLE_THREAD_MGR != 0
  8. #include "../libraries/thread-mgr/thread_manager.h"
  9. #endif
  10. WASMExecEnv *
  11. wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst,
  12. uint32 stack_size)
  13. {
  14. uint64 total_size = offsetof(WASMExecEnv, wasm_stack.s.bottom)
  15. + (uint64)stack_size;
  16. WASMExecEnv *exec_env;
  17. if (total_size >= UINT32_MAX
  18. || !(exec_env = wasm_runtime_malloc((uint32)total_size)))
  19. return NULL;
  20. memset(exec_env, 0, (uint32)total_size);
  21. #if WASM_ENABLE_AOT != 0
  22. if (!(exec_env->argv_buf = wasm_runtime_malloc(sizeof(uint32) * 64))) {
  23. goto fail1;
  24. }
  25. #endif
  26. #if WASM_ENABLE_THREAD_MGR != 0
  27. if (os_mutex_init(&exec_env->wait_lock) != 0)
  28. goto fail2;
  29. if (os_cond_init(&exec_env->wait_cond) != 0)
  30. goto fail3;
  31. #endif
  32. exec_env->module_inst = module_inst;
  33. exec_env->wasm_stack_size = stack_size;
  34. exec_env->wasm_stack.s.top_boundary =
  35. exec_env->wasm_stack.s.bottom + stack_size;
  36. exec_env->wasm_stack.s.top = exec_env->wasm_stack.s.bottom;
  37. #if WASM_ENABLE_MEMORY_TRACING != 0
  38. wasm_runtime_dump_exec_env_mem_consumption(exec_env);
  39. #endif
  40. return exec_env;
  41. #if WASM_ENABLE_THREAD_MGR != 0
  42. fail3:
  43. os_mutex_destroy(&exec_env->wait_lock);
  44. fail2:
  45. #endif
  46. #if WASM_ENABLE_AOT != 0
  47. wasm_runtime_free(exec_env->argv_buf);
  48. fail1:
  49. #endif
  50. wasm_runtime_free(exec_env);
  51. return NULL;
  52. }
  53. void
  54. wasm_exec_env_destroy_internal(WASMExecEnv *exec_env)
  55. {
  56. #ifdef OS_ENABLE_HW_BOUND_CHECK
  57. WASMJmpBuf *jmpbuf = exec_env->jmpbuf_stack_top;
  58. WASMJmpBuf *jmpbuf_prev;
  59. while (jmpbuf) {
  60. jmpbuf_prev = jmpbuf->prev;
  61. wasm_runtime_free(jmpbuf);
  62. jmpbuf = jmpbuf_prev;
  63. }
  64. #endif
  65. #if WASM_ENABLE_THREAD_MGR != 0
  66. os_mutex_destroy(&exec_env->wait_lock);
  67. os_cond_destroy(&exec_env->wait_cond);
  68. #endif
  69. #if WASM_ENABLE_AOT != 0
  70. wasm_runtime_free(exec_env->argv_buf);
  71. #endif
  72. wasm_runtime_free(exec_env);
  73. }
  74. WASMExecEnv *
  75. wasm_exec_env_create(struct WASMModuleInstanceCommon *module_inst,
  76. uint32 stack_size)
  77. {
  78. WASMExecEnv *exec_env =
  79. wasm_exec_env_create_internal(module_inst, stack_size);
  80. if (!exec_env)
  81. return NULL;
  82. /* Set the aux_stack_boundary to 0 */
  83. exec_env->aux_stack_boundary = 0;
  84. #if WASM_ENABLE_THREAD_MGR != 0
  85. WASMCluster *cluster;
  86. /* Create a new cluster for this exec_env */
  87. cluster = wasm_cluster_create(exec_env);
  88. if (!cluster) {
  89. wasm_exec_env_destroy_internal(exec_env);
  90. return NULL;
  91. }
  92. #endif
  93. return exec_env;
  94. }
  95. void
  96. wasm_exec_env_destroy(WASMExecEnv *exec_env)
  97. {
  98. #if WASM_ENABLE_THREAD_MGR != 0
  99. /* Terminate all sub-threads */
  100. WASMCluster *cluster = wasm_exec_env_get_cluster(exec_env);
  101. if (cluster) {
  102. wasm_cluster_terminate_all_except_self(cluster, exec_env);
  103. wasm_cluster_del_exec_env(cluster, exec_env);
  104. }
  105. #endif
  106. wasm_exec_env_destroy_internal(exec_env);
  107. }
  108. WASMModuleInstanceCommon *
  109. wasm_exec_env_get_module_inst(WASMExecEnv *exec_env)
  110. {
  111. return exec_env->module_inst;
  112. }
  113. void
  114. wasm_exec_env_set_thread_info(WASMExecEnv *exec_env)
  115. {
  116. exec_env->handle = os_self_thread();
  117. exec_env->native_stack_boundary = os_thread_get_stack_boundary()
  118. + RESERVED_BYTES_TO_NATIVE_STACK_BOUNDARY;
  119. }
  120. #if WASM_ENABLE_THREAD_MGR != 0
  121. void *
  122. wasm_exec_env_get_thread_arg(WASMExecEnv *exec_env)
  123. {
  124. return exec_env->thread_arg;
  125. }
  126. void
  127. wasm_exec_env_set_thread_arg(WASMExecEnv *exec_env, void *thread_arg)
  128. {
  129. exec_env->thread_arg = thread_arg;
  130. }
  131. #endif
  132. #ifdef OS_ENABLE_HW_BOUND_CHECK
  133. void
  134. wasm_exec_env_push_jmpbuf(WASMExecEnv *exec_env, WASMJmpBuf *jmpbuf)
  135. {
  136. jmpbuf->prev = exec_env->jmpbuf_stack_top;
  137. exec_env->jmpbuf_stack_top = jmpbuf;
  138. }
  139. WASMJmpBuf *
  140. wasm_exec_env_pop_jmpbuf(WASMExecEnv *exec_env)
  141. {
  142. WASMJmpBuf *stack_top = exec_env->jmpbuf_stack_top;
  143. if (stack_top) {
  144. exec_env->jmpbuf_stack_top = stack_top->prev;
  145. return stack_top;
  146. }
  147. return NULL;
  148. }
  149. #endif