summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorSreeharsha Ramanavarapu <sreeharsha.r@gmail.com>2021-01-08 09:59:17 +0530
committerGitHub <noreply@github.com>2021-01-08 13:29:17 +0900
commit17d1aeda18046f2b7225075d121ed54605a5adb9 (patch)
treed98e7d7995f5cc25e1dd1801a5bf2afca6449b5a /src/lib
parent22715aeceaa81ace2c832312529bde3a42d0814f (diff)
downloadDLT-daemon-17d1aeda18046f2b7225075d121ed54605a5adb9.tar.gz
dlt_client_main_loop running in an infinite loop restricts graceful exit of DLT Client code (#284)
Issue: ------ dlt_client_main_loop currently uses an infinite loop ("while (1)"). This creates problems when a DLT client is running in a thread as part of a larger application. Graceful exit (for example: during object destruction) is not possible because a thread is running dlt_client_main_loop in the background. It is also not possible to exit the client, if we want it to fetch only a pre-decided number of messages. Solution: --------- Allow user to define a callback function to check whether the next message should be fetched. dlt-test-client.c has a new option to fetch a pre-decided number of messages, after which the client will exit. Signed-off-by: Sreeharsha Ramanavarapu <sreeharsha.r@gmail.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dlt_client.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c
index 0702f5f..b81d61b 100644
--- a/src/lib/dlt_client.c
+++ b/src/lib/dlt_client.c
@@ -97,12 +97,18 @@
#include "dlt_client_cfg.h"
static int (*message_callback_function)(DltMessage *message, void *data) = NULL;
+static bool (*fetch_next_message_callback_function)(void *data) = NULL;
void dlt_client_register_message_callback(int (*registerd_callback)(DltMessage *message, void *data))
{
message_callback_function = registerd_callback;
}
+void dlt_client_register_fetch_next_message_callback(bool (*registerd_callback)(void *data))
+{
+ fetch_next_message_callback_function = registerd_callback;
+}
+
DltReturnValue dlt_client_init_port(DltClient *client, int port, int verbose)
{
if (verbose && (port != DLT_DAEMON_TCP_PORT))
@@ -397,7 +403,8 @@ DltReturnValue dlt_client_main_loop(DltClient *client, void *data, int verbose)
if (dlt_message_init(&msg, verbose) == DLT_RETURN_ERROR)
return DLT_RETURN_ERROR;
- while (1) {
+ bool fetch_next_message = true;
+ while (fetch_next_message) {
/* wait for data from socket or serial connection */
ret = dlt_receiver_receive(&(client->receiver));
@@ -440,6 +447,8 @@ DltReturnValue dlt_client_main_loop(DltClient *client, void *data, int verbose)
dlt_message_free(&msg, verbose);
return DLT_RETURN_ERROR;
}
+ if (fetch_next_message_callback_function)
+ fetch_next_message = (*fetch_next_message_callback_function)(data);
}
if (dlt_message_free(&msg, verbose) == DLT_RETURN_ERROR)