summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBui Nguyen Quoc Thanh <thanh.buinguyenquoc@vn.bosch.com>2021-02-26 14:07:07 +0700
committerSaya Sugiura <39760799+ssugiura@users.noreply.github.com>2021-06-30 10:54:59 +0900
commitec6dbfceb71bf11c944fa061064a7625e0240ef3 (patch)
treeafe370b1b92502d3cee1bb8dee05f22b8812a089
parent5e188475628635f3254484ed506d8abba096d469 (diff)
downloadDLT-daemon-ec6dbfceb71bf11c944fa061064a7625e0240ef3.tar.gz
daemon: Improve signal handler for timers
In the initial implementation of timer_thread, the signals SIGUSR1 is blocked and only checked via sigpending. There will be an issue if the interval of timers are quite long. It could cause the main thread waits for a long time in case of termination gratefully. Fix: let the timer_thread be interrupted by signal SIGUSR1 and handle it properly then. Signed-off-by: Bui Nguyen Quoc Thanh <thanh.buinguyenquoc@vn.bosch.com>
-rw-r--r--src/daemon/dlt-daemon.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c
index 912cd2c..ff959c4 100644
--- a/src/daemon/dlt-daemon.c
+++ b/src/daemon/dlt-daemon.c
@@ -1150,6 +1150,9 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in
signal(SIGHUP, dlt_daemon_signal_handler); /* hangup signal */
signal(SIGQUIT, dlt_daemon_signal_handler);
signal(SIGINT, dlt_daemon_signal_handler);
+#ifdef __QNX__
+ signal(SIGUSR1, dlt_daemon_signal_handler); /* for timer threads */
+#endif
return DLT_RETURN_OK;
}
@@ -1439,7 +1442,6 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon,
{
int fd = -1;
int mask = 0;
- DltBindAddress_t *head = daemon_local->flags.ipNodes;
PRINT_FUNCTION_VERBOSE(verbose);
@@ -1448,6 +1450,8 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon,
return -1;
}
+ DltBindAddress_t *head = daemon_local->flags.ipNodes;
+
#ifdef DLT_DAEMON_USE_UNIX_SOCKET_IPC
/* create and open socket to receive incoming connections from user application
* socket access permission set to srw-rw-rw- (666) */
@@ -1705,6 +1709,8 @@ void dlt_daemon_local_cleanup(DltDaemon *daemon, DltDaemonLocal *daemon_local, i
void dlt_daemon_exit_trigger()
{
+ /* stop event loop */
+ g_exit = -1;
#ifdef DLT_DAEMON_USE_FIFO_IPC
char tmp[DLT_PATH_MAX] = { 0 };
@@ -1723,8 +1729,6 @@ void dlt_daemon_exit_trigger()
dlt_daemon_cleanup_timers();
#endif
- /* stop event loop */
- g_exit = -1;
}
void dlt_daemon_signal_handler(int sig)
@@ -1732,22 +1736,22 @@ void dlt_daemon_signal_handler(int sig)
g_signo = sig;
switch (sig) {
- case SIGHUP:
- case SIGTERM:
- case SIGINT:
- case SIGQUIT:
- {
- /* finalize the server */
- dlt_vlog(LOG_NOTICE, "Exiting DLT daemon due to signal: %s\n",
- strsignal(sig));
- dlt_daemon_exit_trigger();
- break;
- }
- default:
- {
- /* This case should never happen! */
- break;
- }
+ case SIGHUP:
+ case SIGTERM:
+ case SIGINT:
+ case SIGQUIT:
+ {
+ /* finalize the server */
+ dlt_vlog(LOG_NOTICE, "Exiting DLT daemon due to signal: %s\n",
+ strsignal(sig));
+ dlt_daemon_exit_trigger();
+ break;
+ }
+ default:
+ {
+ /* This case should never happen! */
+ break;
+ }
} /* switch */
} /* dlt_daemon_signal_handler() */
@@ -3324,21 +3328,20 @@ int dlt_daemon_send_ringbuffer_to_client(DltDaemon *daemon, DltDaemonLocal *daem
#ifdef __QNX__
static void *timer_thread(void *data)
{
- sigset_t set;
- sigset_t pset;
int pexit = 0;
-
- /*
- * In timer thread, it is only expecting to receive SIGUSR1
- */
- sigemptyset(&set);
- sigaddset(&set, SIGUSR1);
- sigprocmask(SIG_BLOCK, &set, NULL);
+ unsigned int sleep_ret = 0;
DltDaemonPeriodicData* timer_data = (DltDaemonPeriodicData*) data;
/* Timer will start in starts_in sec*/
- sleep(timer_data->starts_in);
+ if ((sleep_ret = sleep(timer_data->starts_in))) {
+ dlt_vlog(LOG_NOTICE, "Sleep remains [%u] for starting!"
+ "Stop thread of timer [%d]\n",
+ sleep_ret, timer_data->timer_id);
+ close_pipes(dlt_timer_pipes[timer_data->timer_id]);
+ return NULL;
+ }
+
while (1) {
if (0 > write(dlt_timer_pipes[timer_data->timer_id][1], "1", 1)) {
dlt_vlog(LOG_ERR, "Failed to send notification for timer [%s]!\n",
@@ -3346,22 +3349,21 @@ static void *timer_thread(void *data)
pexit = 1;
}
- if (sigpending(&pset)) {
- dlt_log(LOG_ERR, "sigpending error!\n");
- pexit = 1;
- }
-
- if (sigismember(&pset, SIGUSR1)) {
- dlt_log(LOG_NOTICE, "Received SIGUSR1! Stop thread\n");
- pexit = 1;
- }
-
- if (pexit) {
+ if (pexit || g_exit) {
+ dlt_vlog(LOG_NOTICE, "Received signal!"
+ "Stop thread of timer [%d]\n",
+ timer_data->timer_id);
close_pipes(dlt_timer_pipes[timer_data->timer_id]);
return NULL;
}
- sleep(timer_data->period_sec);
+ if ((sleep_ret = sleep(timer_data->period_sec))) {
+ dlt_vlog(LOG_NOTICE, "Sleep remains [%u] for interval!"
+ "Stop thread of timer [%d]\n",
+ sleep_ret, timer_data->timer_id);
+ close_pipes(dlt_timer_pipes[timer_data->timer_id]);
+ return NULL;
+ }
}
}
#endif