summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c
new file mode 100644
index 000000000..ba5bb05f5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/watchdog.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include "watchdog.h"
+#include "bh_platform.h"
+
+#define WATCHDOG_THREAD_PRIORITY 5
+
+/* Queue of watchdog */
+static bh_queue *watchdog_queue;
+
+#ifdef WATCHDOG_ENABLED /* TODO */
+static void
+watchdog_timer_callback(void *timer)
+{
+ watchdog_timer *wd_timer =
+ app_manager_get_wd_timer_from_timer_handle(timer);
+
+ watchdog_timer_stop(wd_timer);
+
+ os_mutex_lock(&wd_timer->lock);
+
+ if (!wd_timer->is_stopped) {
+
+ wd_timer->is_interrupting = true;
+
+ bh_post_msg(watchdog_queue, WD_TIMEOUT, wd_timer->module_data,
+ sizeof(module_data));
+ }
+
+ os_mutex_unlock(&wd_timer->lock);
+}
+#endif
+
+bool
+watchdog_timer_init(module_data *m_data)
+{
+#ifdef WATCHDOG_ENABLED /* TODO */
+ watchdog_timer *wd_timer = &m_data->wd_timer;
+
+ if (0 != os_mutex_init(&wd_timer->lock))
+ return false;
+
+ if (!(wd_timer->timer_handle =
+ app_manager_timer_create(watchdog_timer_callback, wd_timer))) {
+ os_mutex_destroy(&wd_timer->lock);
+ return false;
+ }
+
+ wd_timer->module_data = m_data;
+ wd_timer->is_interrupting = false;
+ wd_timer->is_stopped = false;
+#endif
+ return true;
+}
+
+void
+watchdog_timer_destroy(watchdog_timer *wd_timer)
+{
+#ifdef WATCHDOG_ENABLED /* TODO */
+ app_manager_timer_destroy(wd_timer->timer_handle);
+ os_mutex_destroy(&wd_timer->lock);
+#endif
+}
+
+void
+watchdog_timer_start(watchdog_timer *wd_timer)
+{
+ os_mutex_lock(&wd_timer->lock);
+
+ wd_timer->is_interrupting = false;
+ wd_timer->is_stopped = false;
+ app_manager_timer_start(wd_timer->timer_handle,
+ wd_timer->module_data->timeout);
+
+ os_mutex_unlock(&wd_timer->lock);
+}
+
+void
+watchdog_timer_stop(watchdog_timer *wd_timer)
+{
+ app_manager_timer_stop(wd_timer->timer_handle);
+}
+
+#ifdef WATCHDOG_ENABLED /* TODO */
+static void
+watchdog_queue_callback(void *queue_msg)
+{
+ if (bh_message_type(queue_msg) == WD_TIMEOUT) {
+ module_data *m_data = (module_data *)bh_message_payload(queue_msg);
+ if (g_module_interfaces[m_data->module_type]
+ && g_module_interfaces[m_data->module_type]->module_watchdog_kill) {
+ g_module_interfaces[m_data->module_type]->module_watchdog_kill(
+ m_data);
+ app_manager_post_applets_update_event();
+ }
+ }
+}
+#endif
+
+#ifdef WATCHDOG_ENABLED /* TODO */
+static void *
+watchdog_thread_routine(void *arg)
+{
+ /* Enter loop run */
+ bh_queue_enter_loop_run(watchdog_queue, watchdog_queue_callback);
+
+ (void)arg;
+ return NULL;
+}
+#endif
+
+bool
+watchdog_startup()
+{
+ if (!(watchdog_queue = bh_queue_create())) {
+ app_manager_printf(
+ "App Manager start failed: create watchdog queue failed.\n");
+ return false;
+ }
+#if 0
+//todo: enable watchdog
+ /* Start watchdog thread */
+ if (!jeff_runtime_create_supervisor_thread_with_prio(watchdog_thread_routine, NULL,
+ WATCHDOG_THREAD_PRIORITY)) {
+ bh_queue_destroy(watchdog_queue);
+ return false;
+ }
+#endif
+ return true;
+}
+
+void
+watchdog_destroy()
+{
+ bh_queue_exit_loop_run(watchdog_queue);
+ bh_queue_destroy(watchdog_queue);
+}