wasm_shared_memory.c 2.8 KB

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