mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-07 07:25:12 +00:00
f1a0e75ab7
Co-authored-by: Xu Jun <jun1.xu@intel.com>
127 lines
3.1 KiB
C
127 lines
3.1 KiB
C
/*
|
|
* 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;
|
|
}
|