From 1673df81d165152804b4c39da7562fafa2dd2d41 Mon Sep 17 00:00:00 2001 From: Sara Souza Date: Mon, 8 Mar 2021 10:32:13 -0300 Subject: [PATCH] apps/examples/watcher: Fixed an assert failure --- examples/watched/watched.c | 6 ++-- examples/watched/watched.h | 10 +++--- examples/watched/watched_main.c | 8 ++--- examples/watcher/Kconfig | 7 ++++- examples/watcher/task_mn.c | 11 +++---- examples/watcher/watcher_main.c | 56 +++++++++++++++++++++++++++------ examples/watcher/wdt.c | 46 +++++++++++++++++++++------ 7 files changed, 105 insertions(+), 39 deletions(-) diff --git a/examples/watched/watched.c b/examples/watched/watched.c index 87a66e93b..2f6a49df7 100644 --- a/examples/watched/watched.c +++ b/examples/watched/watched.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watched/watched.c + * apps/examples/watched/watched.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -156,7 +156,7 @@ int watched_unsubscribe(struct watched_info_s *info) return ret; } -int feed_dog(struct watched_info_s *info) +int watched_feed_dog(struct watched_info_s *info) { int ret; @@ -168,7 +168,7 @@ int feed_dog(struct watched_info_s *info) if (ret == ERROR) { int errcode = errno; - fprintf(stderr, "feed_dog: error %d\n", errcode); + fprintf(stderr, "watched_feed_dog: error %d\n", errcode); ret = errcode; } diff --git a/examples/watched/watched.h b/examples/watched/watched.h index 6cc1973f2..8f2150c29 100644 --- a/examples/watched/watched.h +++ b/examples/watched/watched.h @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watched/watched.h + * apps/examples/watched/watched.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -71,9 +71,9 @@ struct watched_info_s ****************************************************************************/ bool watched_is_watcher_on(void); -int watched_read_watcher_info(struct watched_info_s *info); -int watched_subscribe(struct watched_info_s *info); -int watched_unsubscribe(struct watched_info_s *info); -int feed_dog(struct watched_info_s *info); +int watched_read_watcher_info(struct watched_info_s *info); +int watched_subscribe(struct watched_info_s *info); +int watched_unsubscribe(struct watched_info_s *info); +int watched_feed_dog(struct watched_info_s *info); #endif /* __EXAMPLES_WATCHER_WATCHED_H */ diff --git a/examples/watched/watched_main.c b/examples/watched/watched_main.c index 76fee412b..cc44d0372 100644 --- a/examples/watched/watched_main.c +++ b/examples/watched/watched_main.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watched/watched_main.c + * apps/examples/watched/watched_main.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -60,7 +60,7 @@ static int task1(int argc, FAR char *argv[]) for (; ; ) { - feed_dog(&watched_info); + watched_feed_dog(&watched_info); sleep(3); } @@ -111,8 +111,8 @@ int main(int argc, char *argv[]) if (!watched_is_watcher_on()) { - printf("Please, enable the watcher service \ - before subscribing tasks!\n"); + printf("Please, enable the watcher service " + "before subscribing tasks!\n"); ret = ENOENT; goto errout; } diff --git a/examples/watcher/Kconfig b/examples/watcher/Kconfig index 3262913a5..fa8ceeb96 100644 --- a/examples/watcher/Kconfig +++ b/examples/watcher/Kconfig @@ -44,8 +44,13 @@ config EXAMPLES_WATCHER_TIMEOUT config EXAMPLES_WATCHER_SIGNAL int "Signal Number for communication" - default 17 + default 18 ---help--- This is the Signal Number used for communication between the watcher task and the watched tasks. +config EXAMPLES_WATCHER_SIGNAL_LOG + int "Signal Number for logging" + default 19 + ---help--- + This is the Signal Number used by the wdt handler to notify the signal handler to log the tasks. endif diff --git a/examples/watcher/task_mn.c b/examples/watcher/task_mn.c index 8ba75276a..d2a68924f 100644 --- a/examples/watcher/task_mn.c +++ b/examples/watcher/task_mn.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watcher/task_mn.c + * apps/examples/watcher/task_mn.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -72,7 +72,7 @@ void task_mn_print_tasks_status(void) notefd = open("/dev/note", O_RDONLY); if (notefd < 0) { - fprintf(stderr, "trace: cannot open /dev/note\n"); + printf("Error: cannot open /dev/note\n"); return; } @@ -82,14 +82,13 @@ void task_mn_print_tasks_status(void) { task.pid = node->task_id; ioctl(notefd, NOTERAM_GETTASKNAME, (unsigned long)&task); - printf("%s ", task.taskname); if (node->reset) { - printf("fed the dog.\n"); + printf("%s fed the dog.\n", task.taskname); } else { - printf("starved the dog.\n"); + printf("%s starved the dog.\n", task.taskname); } } @@ -99,7 +98,7 @@ void task_mn_print_tasks_status(void) } else { - fprintf(stderr, "watcher: List is empty to print\n"); + printf("Error: Task list is empty to print\n"); } } diff --git a/examples/watcher/watcher_main.c b/examples/watcher/watcher_main.c index c62e85967..0534846de 100644 --- a/examples/watcher/watcher_main.c +++ b/examples/watcher/watcher_main.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watcher/watcher_main.c + * apps/examples/watcher/watcher_main.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -117,6 +117,17 @@ static void feed_sighandler(int signo, FAR siginfo_t * siginfo, } } +static void wdt_log(int signo, FAR siginfo_t * siginfo, + FAR void *context) +{ + if (watched_tasks.head != NULL) + { + printf("*** Printing Tasks Status ***\n"); + task_mn_print_tasks_status(); + task_mn_reset_all(); + } +} + /**************************************************************************** * Name: watcher_daemon ****************************************************************************/ @@ -125,21 +136,30 @@ static int watcher_daemon(int argc, FAR char *argv[]) { int ret; struct sigaction act; + struct sigaction act_log; pid_t watcher_pid; FILE *fp; printf("Watcher Daemon has started!\n"); - /* Configuring a signal action */ + /* Initialize and configure the wdt */ + + wdt_init(); + + /* Configure signals action */ + + /* Configure signal to receive the subscribe/unsubscribe + * and feed requests + */ act.sa_sigaction = feed_sighandler; /* The handler to be triggered when * receiving a signal */ act.sa_flags = SA_SIGINFO; /* Invoke the signal-catching function */ sigfillset(&act.sa_mask); - sigdelset(&act.sa_mask, CONFIG_EXAMPLES_WATCHER_SIGNAL); /* Block all - * other - * signals less - * this one */ + + /* Block all other signals less this one */ + + sigdelset(&act.sa_mask, CONFIG_EXAMPLES_WATCHER_SIGNAL); ret = sigaction(CONFIG_EXAMPLES_WATCHER_SIGNAL, &act, NULL); if (ret != OK) @@ -150,6 +170,26 @@ static int watcher_daemon(int argc, FAR char *argv[]) goto errout; } + /* Configure signal to log the taks at wdt timeout */ + + act_log.sa_sigaction = wdt_log; /* The handler to be triggered when + * receiving a signal */ + act_log.sa_flags = SA_SIGINFO; /* Invoke the signal-catching function */ + sigfillset(&act_log.sa_mask); + + /* Block all other signals less this one */ + + sigdelset(&act_log.sa_mask, CONFIG_EXAMPLES_WATCHER_SIGNAL_LOG); + + ret = sigaction(CONFIG_EXAMPLES_WATCHER_SIGNAL_LOG, &act_log, NULL); + if (ret != OK) + { + int errcode = errno; + fprintf(stderr, "ERROR: sigaction failed: %d\n", errcode); + ret = errcode; + goto errout; + } + /* Collecting the necessary information of the current task */ watcher_pid = getpid(); @@ -210,10 +250,6 @@ int main(int argc, FAR char *argv[]) prepare_fs(); - /* Initialize and configure the wdt */ - - wdt_init(); - /* Start Daemon */ ret = task_create("watcher_daemon", CONFIG_EXAMPLES_WATCHER_PRIORITY, diff --git a/examples/watcher/wdt.c b/examples/watcher/wdt.c index d34cebd36..ea4ff6d8f 100644 --- a/examples/watcher/wdt.c +++ b/examples/watcher/wdt.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/watcher/wdt.c + * apps/examples/watcher/wdt.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "wdt.h" #include "task_mn.h" @@ -38,20 +39,36 @@ * Pre-processor Definitions ****************************************************************************/ +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct wdt_loginfo_s +{ + pid_t task_id; /* Id of the task that performs logging */ + int signal; /* Signal that triggers the logging */ +}; + /**************************************************************************** * Private Definitions ****************************************************************************/ -static int wdt_print_handler(int irq, FAR void *context, FAR void *arg); +static int wdt_handler(int irq, FAR void *context, FAR void *arg); /**************************************************************************** * Private Data ****************************************************************************/ static struct wdog_params_s wdog = -{.timeout = CONFIG_EXAMPLES_WATCHER_TIMEOUT, +{ + .timeout = CONFIG_EXAMPLES_WATCHER_TIMEOUT, .handlers.oldhandler = NULL, - .handlers.newhandler = wdt_print_handler + .handlers.newhandler = wdt_handler +}; + +static struct wdt_loginfo_s log_info = +{ + .signal = CONFIG_EXAMPLES_WATCHER_SIGNAL_LOG }; /**************************************************************************** @@ -67,16 +84,21 @@ static struct wdog_params_s wdog = * ****************************************************************************/ -static int wdt_print_handler(int irq, FAR void *context, FAR void *arg) +static int wdt_handler(int irq, FAR void *context, FAR void *arg) { - if (watched_tasks.head != NULL) + int ret = OK; + + /* Notify the watcher task to log */ + + ret = kill(log_info.task_id, log_info.signal); + if (ret == ERROR) { - printf("*** Printing Tasks Status ***\n"); - task_mn_print_tasks_status(); - task_mn_reset_all(); + int errcode = errno; + _err("Error: %d\n", errcode); + ret = errcode; } - return OK; + return ret; } /**************************************************************************** @@ -136,6 +158,10 @@ int wdt_init(void) close(fd); + /* Set the pid, so the handler will be able to notify watcher */ + + log_info.task_id = getpid(); + errout: return ret; }