From 4a32519592972263475a36b4c01c26eea55ffcf4 Mon Sep 17 00:00:00 2001 From: Yusuke Sato Date: Tue, 29 May 2018 19:24:49 +0900 Subject: 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 --- src/lib/dlt_user.c | 14 +++++++++++++- src/lib/dlt_user_cfg.h | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src') 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! */ -- cgit v1.2.1