From d06ab546a95ed6feb6a9686a71e9243655050d60 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 19 Sep 2019 22:21:06 +0200 Subject: [PATCH] - SV subscriber: improved error handling when Ethernet access doesn't work; fixed potential memory leak --- .../sv_subscriber/sv_subscriber_example.c | 15 ++++--- src/sampled_values/sv_subscriber.c | 44 ++++++++++--------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/examples/sv_subscriber/sv_subscriber_example.c b/examples/sv_subscriber/sv_subscriber_example.c index 1a1f1deb..d27108b9 100644 --- a/examples/sv_subscriber/sv_subscriber_example.c +++ b/examples/sv_subscriber/sv_subscriber_example.c @@ -75,13 +75,18 @@ main(int argc, char** argv) /* Start listening to SV messages - starts a new receiver background thread */ SVReceiver_start(receiver); - signal(SIGINT, sigint_handler); + if (SVReceiver_isRunning(receiver)) { + signal(SIGINT, sigint_handler); - while (running) - Thread_sleep(1); + while (running) + Thread_sleep(1); - /* Stop listening to SV messages */ - SVReceiver_stop(receiver); + /* Stop listening to SV messages */ + SVReceiver_stop(receiver); + } + else { + printf("Failed to start SV subscriber. Reason can be that the Ethernet interface doesn't exist or root permission are required.\n"); + } /* Cleanup and free resources */ SVReceiver_destroy(receiver); diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 9c8fe083..c5a73fcd 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -157,38 +157,34 @@ svReceiverLoop(void* threadParameter) { SVReceiver self = (SVReceiver) threadParameter; - self->running = true; self->stopped = false; - if (SVReceiver_startThreadless(self)) { - - while (self->running) { + while (self->running) { - if (SVReceiver_tick(self) == false) - Thread_sleep(1); - } - - SVReceiver_stopThreadless(self); - } - else { - if (DEBUG_SV_SUBSCRIBER) - printf("SV_SUBSCRIBER: Failed to start SV receiver\n"); + if (SVReceiver_tick(self) == false) + Thread_sleep(1); } self->stopped = true; } - void SVReceiver_start(SVReceiver self) { - Thread thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, true); + if (SVReceiver_startThreadless(self)) { - if (thread != NULL) { if (DEBUG_SV_SUBSCRIBER) printf("SV_SUBSCRIBER: SV receiver started for interface %s\n", self->interfaceId); - Thread_start(thread); + Thread thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, true); + + if (thread) { + Thread_start(thread); + } + else { + if (DEBUG_SV_SUBSCRIBER) + printf("SV_SUBSCRIBER: Failed to start thread\n"); + } } else { if (DEBUG_SV_SUBSCRIBER) @@ -206,10 +202,12 @@ SVReceiver_isRunning(SVReceiver self) void SVReceiver_stop(SVReceiver self) { - self->running = false; + if (self->running) { + SVReceiver_stopThreadless(self); - while (self->stopped == false) - Thread_sleep(1); + while (self->stopped == false) + Thread_sleep(1); + } } void @@ -218,6 +216,9 @@ SVReceiver_destroy(SVReceiver self) LinkedList_destroyDeep(self->subscriberList, (LinkedListValueDeleteFunction) SVSubscriber_destroy); + if (self->interfaceId != NULL) + GLOBAL_FREEMEM(self->interfaceId); + #if (CONFIG_MMS_THREADLESS_STACK == 0) Semaphore_destroy(self->subscriberListLock); #endif @@ -247,7 +248,8 @@ SVReceiver_startThreadless(SVReceiver self) void SVReceiver_stopThreadless(SVReceiver self) { - Ethernet_destroySocket(self->ethSocket); + if (self->ethSocket) + Ethernet_destroySocket(self->ethSocket); self->running = false; }