apps/examples/watcher: Fixed an assert failure

This commit is contained in:
Sara Souza 2021-03-08 10:32:13 -03:00 committed by Xiang Xiao
parent ff4c3c3fb8
commit 1673df81d1
7 changed files with 105 additions and 39 deletions

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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

View File

@ -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");
}
}

View File

@ -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,

View File

@ -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 <string.h>
#include <errno.h>
#include <fcntl.h>
#include <debug.h>
#include <sys/ioctl.h>
#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;
}