wasm_shared_memory.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #if WASM_ENABLE_SHARED_MEMORY != 0
  6. #include "bh_log.h"
  7. #include "wasm_shared_memory.h"
  8. static bh_list shared_memory_list_head;
  9. static bh_list *const shared_memory_list = &shared_memory_list_head;
  10. static korp_mutex shared_memory_list_lock;
  11. bool
  12. wasm_shared_memory_init()
  13. {
  14. if (os_mutex_init(&shared_memory_list_lock) != 0)
  15. return false;
  16. return true;
  17. }
  18. void
  19. wasm_shared_memory_destroy()
  20. {
  21. os_mutex_destroy(&shared_memory_list_lock);
  22. }
  23. static WASMSharedMemNode*
  24. search_module(WASMModuleCommon *module)
  25. {
  26. WASMSharedMemNode *node;
  27. os_mutex_lock(&shared_memory_list_lock);
  28. node = bh_list_first_elem(shared_memory_list);
  29. while (node) {
  30. if (module == node->module) {
  31. os_mutex_unlock(&shared_memory_list_lock);
  32. return node;
  33. }
  34. node = bh_list_elem_next(node);
  35. }
  36. os_mutex_unlock(&shared_memory_list_lock);
  37. return NULL;
  38. }
  39. WASMSharedMemNode*
  40. wasm_module_get_shared_memory(WASMModuleCommon *module)
  41. {
  42. return search_module(module);
  43. }
  44. int32
  45. shared_memory_inc_reference(WASMModuleCommon *module)
  46. {
  47. WASMSharedMemNode *node = search_module(module);
  48. if (node) {
  49. os_mutex_lock(&node->lock);
  50. node->ref_count++;
  51. os_mutex_unlock(&node->lock);
  52. return node->ref_count;
  53. }
  54. return -1;
  55. }
  56. int32
  57. shared_memory_dec_reference(WASMModuleCommon *module)
  58. {
  59. WASMSharedMemNode *node = search_module(module);
  60. uint32 ref_count = 0;
  61. if (node) {
  62. os_mutex_lock(&node->lock);
  63. ref_count = --node->ref_count;
  64. os_mutex_unlock(&node->lock);
  65. if (ref_count == 0) {
  66. os_mutex_lock(&shared_memory_list_lock);
  67. bh_list_remove(shared_memory_list, node);
  68. os_mutex_unlock(&shared_memory_list_lock);
  69. os_mutex_destroy(&node->lock);
  70. wasm_runtime_free(node);
  71. }
  72. return ref_count;
  73. }
  74. return -1;
  75. }
  76. WASMMemoryInstance*
  77. shared_memory_get_memory_inst(WASMSharedMemNode *node)
  78. {
  79. return node->u.wasm_memory;
  80. }
  81. WASMSharedMemNode*
  82. shared_memory_set_memory_inst(WASMModuleCommon *module,
  83. WASMMemoryInstance *memory)
  84. {
  85. WASMSharedMemNode *node;
  86. bh_list_status ret;
  87. if (!(node = wasm_runtime_malloc(sizeof(WASMSharedMemNode))))
  88. return NULL;
  89. node->module = module;
  90. node->u.wasm_memory = memory;
  91. node->ref_count = 1;
  92. if (os_mutex_init(&node->lock) != 0) {
  93. wasm_runtime_free(node);
  94. return NULL;
  95. }
  96. os_mutex_lock(&shared_memory_list_lock);
  97. ret = bh_list_insert(shared_memory_list, node);
  98. bh_assert(ret == BH_LIST_SUCCESS);
  99. os_mutex_unlock(&shared_memory_list_lock);
  100. (void)ret;
  101. return node;
  102. }
  103. #endif /* end of WASM_ENABLE_SHARED_MEMORY */