diff options
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.c | 140 |
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); +} |