| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /*
- * 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);
- }
|