summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYusuke Sato <yusuke-sato@apn.alpine.co.jp>2018-05-29 19:24:49 +0900
committerChristoph Lipka <clipka@users.noreply.github.com>2018-05-29 12:24:49 +0200
commit4a32519592972263475a36b4c01c26eea55ffcf4 (patch)
tree5683374881d0c779b9b54b839807c4346dc2b270 /src
parent33a4300e3e4a25e6f41bcc18b2a03453a4bf3664 (diff)
downloadDLT-daemon-4a32519592972263475a36b4c01c26eea55ffcf4.tar.gz
libdlt: Avoid busy loop in error case of mq_receive() (#59)
To avoid busy loop due to error of mq_receive() which is called in sub thread, 100ms sleep is added for the error case. Error log message for mq_receive() is also corrected to have errno. Signed-off-by: Yusuke Sato <yusuke-sato@apn.alpine.co.jp>
Diffstat (limited to 'src')
-rw-r--r--src/lib/dlt_user.c14
-rw-r--r--src/lib/dlt_user_cfg.h3
2 files changed, 16 insertions, 1 deletions
diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c
index 70fb564..0530ba7 100644
--- a/src/lib/dlt_user.c
+++ b/src/lib/dlt_user.c
@@ -2771,10 +2771,22 @@ void dlt_user_trace_network_segmented_thread(void *unused)
ssize_t read = mq_receive(dlt_user.dlt_segmented_queue_read_handle, (char *)&data,
sizeof(s_segmented_data * ), NULL);
+ if (read < 0)
+ {
+ if (errno != EINTR)
+ {
+ dlt_vlog(LOG_WARNING, "NWTSegmented: Error while reading queue: %s\n", strerror(errno));
+ usleep(DLT_USER_MQ_ERROR_RETRY_INTERVAL);
+ }
+ continue;
+ }
if(read != sizeof(s_segmented_data *))
{
- dlt_log(LOG_WARNING,"NWTSegmented: Could not send end segment.\n");
+ // This case will not happen.
+ // When this thread is interrupted by signal, mq_receive() will not return
+ // partial read length and will return -1. And also no data is removed from mq.
+ dlt_vlog(LOG_WARNING, "NWTSegmented: Could not read data fully from queue: %d\n", read);
continue;
}
diff --git a/src/lib/dlt_user_cfg.h b/src/lib/dlt_user_cfg.h
index b8d8c84..60f887b 100644
--- a/src/lib/dlt_user_cfg.h
+++ b/src/lib/dlt_user_cfg.h
@@ -140,6 +140,9 @@
/* Sleeps between resending user buffer at exit in usec (1000 usec = 1ms)*/
#define DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP 100000
+/* Retry interval for mq error in usec */
+#define DLT_USER_MQ_ERROR_RETRY_INTERVAL 100000
+
/************************/
/* Don't change please! */