module_utils.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "app_manager.h"
  6. #include "app_manager_host.h"
  7. #include "bh_platform.h"
  8. #include "bi-inc/attr_container.h"
  9. #include "event.h"
  10. #include "watchdog.h"
  11. #include "coap_ext.h"
  12. /* Lock of the module data list */
  13. korp_mutex module_data_list_lock;
  14. /* Module data list */
  15. module_data *module_data_list;
  16. bool
  17. module_data_list_init()
  18. {
  19. module_data_list = NULL;
  20. return !os_mutex_init(&module_data_list_lock) ? true : false;
  21. }
  22. void
  23. module_data_list_destroy()
  24. {
  25. os_mutex_lock(&module_data_list_lock);
  26. if (module_data_list) {
  27. while (module_data_list) {
  28. module_data *p = module_data_list->next;
  29. APP_MGR_FREE(module_data_list);
  30. module_data_list = p;
  31. }
  32. }
  33. os_mutex_unlock(&module_data_list_lock);
  34. os_mutex_destroy(&module_data_list_lock);
  35. }
  36. static void
  37. module_data_list_add(module_data *m_data)
  38. {
  39. static uint32 module_id_max = 1;
  40. os_mutex_lock(&module_data_list_lock);
  41. // reserve some special ID
  42. // TODO: check the new id is not already occupied!
  43. if (module_id_max == 0xFFFFFFF0)
  44. module_id_max = 1;
  45. m_data->id = module_id_max++;
  46. if (!module_data_list) {
  47. module_data_list = m_data;
  48. }
  49. else {
  50. /* Set as head */
  51. m_data->next = module_data_list;
  52. module_data_list = m_data;
  53. }
  54. os_mutex_unlock(&module_data_list_lock);
  55. }
  56. void
  57. module_data_list_remove(module_data *m_data)
  58. {
  59. os_mutex_lock(&module_data_list_lock);
  60. if (module_data_list) {
  61. if (module_data_list == m_data)
  62. module_data_list = module_data_list->next;
  63. else {
  64. /* Search and remove it */
  65. module_data *p = module_data_list;
  66. while (p && p->next != m_data)
  67. p = p->next;
  68. if (p && p->next == m_data)
  69. p->next = p->next->next;
  70. }
  71. }
  72. os_mutex_unlock(&module_data_list_lock);
  73. }
  74. module_data *
  75. module_data_list_lookup(const char *module_name)
  76. {
  77. os_mutex_lock(&module_data_list_lock);
  78. if (module_data_list) {
  79. module_data *p = module_data_list;
  80. while (p) {
  81. /* Search by module name */
  82. if (!strcmp(module_name, p->module_name)) {
  83. os_mutex_unlock(&module_data_list_lock);
  84. return p;
  85. }
  86. p = p->next;
  87. }
  88. }
  89. os_mutex_unlock(&module_data_list_lock);
  90. return NULL;
  91. }
  92. module_data *
  93. module_data_list_lookup_id(unsigned int module_id)
  94. {
  95. os_mutex_lock(&module_data_list_lock);
  96. if (module_data_list) {
  97. module_data *p = module_data_list;
  98. while (p) {
  99. /* Search by module name */
  100. if (module_id == p->id) {
  101. os_mutex_unlock(&module_data_list_lock);
  102. return p;
  103. }
  104. p = p->next;
  105. }
  106. }
  107. os_mutex_unlock(&module_data_list_lock);
  108. return NULL;
  109. }
  110. module_data *
  111. app_manager_get_module_data(uint32 module_type, void *module_inst)
  112. {
  113. if (module_type < Module_Max && g_module_interfaces[module_type]
  114. && g_module_interfaces[module_type]->module_get_module_data)
  115. return g_module_interfaces[module_type]->module_get_module_data(
  116. module_inst);
  117. return NULL;
  118. }
  119. void *
  120. app_manager_get_module_queue(uint32 module_type, void *module_inst)
  121. {
  122. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  123. return m_data ? m_data->queue : NULL;
  124. }
  125. const char *
  126. app_manager_get_module_name(uint32 module_type, void *module_inst)
  127. {
  128. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  129. return m_data ? m_data->module_name : NULL;
  130. }
  131. unsigned int
  132. app_manager_get_module_id(uint32 module_type, void *module_inst)
  133. {
  134. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  135. return m_data ? m_data->id : ID_NONE;
  136. }
  137. void *
  138. app_manager_get_module_heap(uint32 module_type, void *module_inst)
  139. {
  140. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  141. return m_data ? m_data->heap : NULL;
  142. }
  143. module_data *
  144. app_manager_lookup_module_data(const char *name)
  145. {
  146. return module_data_list_lookup(name);
  147. }
  148. void
  149. app_manager_add_module_data(module_data *m_data)
  150. {
  151. module_data_list_add(m_data);
  152. }
  153. void
  154. app_manager_del_module_data(module_data *m_data)
  155. {
  156. module_data_list_remove(m_data);
  157. release_module(m_data);
  158. }
  159. bool
  160. app_manager_is_interrupting_module(uint32 module_type, void *module_inst)
  161. {
  162. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  163. return m_data ? m_data->wd_timer.is_interrupting : false;
  164. }
  165. extern void
  166. destroy_module_timer_ctx(unsigned int module_id);
  167. void
  168. release_module(module_data *m_data)
  169. {
  170. watchdog_timer_destroy(&m_data->wd_timer);
  171. #ifdef HEAP_ENABLED /* TODO */
  172. if (m_data->heap)
  173. gc_destroy_for_instance(m_data->heap);
  174. #endif
  175. if (m_data->queue)
  176. bh_queue_destroy(m_data->queue);
  177. m_data->timer_ctx = NULL;
  178. destroy_module_timer_ctx(m_data->id);
  179. APP_MGR_FREE(m_data);
  180. }
  181. uint32
  182. check_modules_timer_expiry()
  183. {
  184. os_mutex_lock(&module_data_list_lock);
  185. module_data *p = module_data_list;
  186. uint32 ms_to_expiry = (uint32)-1;
  187. while (p) {
  188. uint32 next = get_expiry_ms(p->timer_ctx);
  189. if (next != (uint32)-1) {
  190. if (ms_to_expiry == (uint32)-1 || ms_to_expiry > next)
  191. ms_to_expiry = next;
  192. }
  193. p = p->next;
  194. }
  195. os_mutex_unlock(&module_data_list_lock);
  196. return ms_to_expiry;
  197. }