module_utils.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 module_data_list_init()
  17. {
  18. module_data_list = NULL;
  19. return !os_mutex_init(&module_data_list_lock) ? true : false;
  20. }
  21. void module_data_list_destroy()
  22. {
  23. os_mutex_lock(&module_data_list_lock);
  24. if (module_data_list) {
  25. while (module_data_list) {
  26. module_data *p = module_data_list->next;
  27. APP_MGR_FREE(module_data_list);
  28. module_data_list = p;
  29. }
  30. }
  31. os_mutex_unlock(&module_data_list_lock);
  32. os_mutex_destroy(&module_data_list_lock);
  33. }
  34. static void module_data_list_add(module_data *m_data)
  35. {
  36. static uint32 module_id_max = 1;
  37. os_mutex_lock(&module_data_list_lock);
  38. // reserve some special ID
  39. // TODO: check the new id is not already occupied!
  40. if (module_id_max == 0xFFFFFFF0)
  41. module_id_max = 1;
  42. m_data->id = module_id_max++;
  43. if (!module_data_list) {
  44. module_data_list = m_data;
  45. } else {
  46. /* Set as head */
  47. m_data->next = module_data_list;
  48. module_data_list = m_data;
  49. }
  50. os_mutex_unlock(&module_data_list_lock);
  51. }
  52. void module_data_list_remove(module_data *m_data)
  53. {
  54. os_mutex_lock(&module_data_list_lock);
  55. if (module_data_list) {
  56. if (module_data_list == m_data)
  57. module_data_list = module_data_list->next;
  58. else {
  59. /* Search and remove it */
  60. module_data *p = module_data_list;
  61. while (p && p->next != m_data)
  62. p = p->next;
  63. if (p && p->next == m_data)
  64. p->next = p->next->next;
  65. }
  66. }
  67. os_mutex_unlock(&module_data_list_lock);
  68. }
  69. module_data*
  70. module_data_list_lookup(const char *module_name)
  71. {
  72. os_mutex_lock(&module_data_list_lock);
  73. if (module_data_list) {
  74. module_data *p = module_data_list;
  75. while (p) {
  76. /* Search by module name */
  77. if (!strcmp(module_name, p->module_name)) {
  78. os_mutex_unlock(&module_data_list_lock);
  79. return p;
  80. }
  81. p = p->next;
  82. }
  83. }
  84. os_mutex_unlock(&module_data_list_lock);
  85. return NULL;
  86. }
  87. module_data*
  88. module_data_list_lookup_id(unsigned int module_id)
  89. {
  90. os_mutex_lock(&module_data_list_lock);
  91. if (module_data_list) {
  92. module_data *p = module_data_list;
  93. while (p) {
  94. /* Search by module name */
  95. if (module_id == p->id) {
  96. os_mutex_unlock(&module_data_list_lock);
  97. return p;
  98. }
  99. p = p->next;
  100. }
  101. }
  102. os_mutex_unlock(&module_data_list_lock);
  103. return NULL;
  104. }
  105. module_data *
  106. app_manager_get_module_data(uint32 module_type, void *module_inst)
  107. {
  108. if (module_type < Module_Max
  109. && g_module_interfaces[module_type]
  110. && g_module_interfaces[module_type]->module_get_module_data)
  111. return g_module_interfaces[module_type]->module_get_module_data(module_inst);
  112. return NULL;
  113. }
  114. void*
  115. app_manager_get_module_queue(uint32 module_type, void *module_inst)
  116. {
  117. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  118. return m_data ? m_data->queue : NULL;
  119. }
  120. const char*
  121. app_manager_get_module_name(uint32 module_type, void *module_inst)
  122. {
  123. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  124. return m_data ? m_data->module_name : NULL;
  125. }
  126. unsigned int app_manager_get_module_id(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->id : ID_NONE;
  130. }
  131. void*
  132. app_manager_get_module_heap(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->heap : NULL;
  136. }
  137. module_data*
  138. app_manager_lookup_module_data(const char *name)
  139. {
  140. return module_data_list_lookup(name);
  141. }
  142. void app_manager_add_module_data(module_data *m_data)
  143. {
  144. module_data_list_add(m_data);
  145. }
  146. void app_manager_del_module_data(module_data *m_data)
  147. {
  148. module_data_list_remove(m_data);
  149. release_module(m_data);
  150. }
  151. bool app_manager_is_interrupting_module(uint32 module_type, void *module_inst)
  152. {
  153. module_data *m_data = app_manager_get_module_data(module_type, module_inst);
  154. return m_data ? m_data->wd_timer.is_interrupting : false;
  155. }
  156. extern void destroy_module_timer_ctx(unsigned int module_id);
  157. void release_module(module_data *m_data)
  158. {
  159. watchdog_timer_destroy(&m_data->wd_timer);
  160. #ifdef HEAP_ENABLED /* TODO */
  161. if(m_data->heap)
  162. gc_destroy_for_instance(m_data->heap);
  163. #endif
  164. if (m_data->queue)
  165. bh_queue_destroy(m_data->queue);
  166. m_data->timer_ctx = NULL;
  167. destroy_module_timer_ctx(m_data->id);
  168. APP_MGR_FREE(m_data);
  169. }
  170. uint32 check_modules_timer_expiry()
  171. {
  172. os_mutex_lock(&module_data_list_lock);
  173. module_data *p = module_data_list;
  174. uint32 ms_to_expiry = (uint32)-1;
  175. while (p) {
  176. uint32 next = get_expiry_ms(p->timer_ctx);
  177. if (next != (uint32)-1) {
  178. if (ms_to_expiry == (uint32)-1 || ms_to_expiry > next)
  179. ms_to_expiry = next;
  180. }
  181. p = p->next;
  182. }
  183. os_mutex_unlock(&module_data_list_lock);
  184. return ms_to_expiry;
  185. }