module_utils.c 5.5 KB

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