- SV subscriber: improved error handling when Ethernet access doesn't work; fixed potential memory leak

pull/179/head
Michael Zillgith 6 years ago
parent ebb0f761d2
commit d06ab546a9

@ -75,6 +75,7 @@ main(int argc, char** argv)
/* Start listening to SV messages - starts a new receiver background thread */ /* Start listening to SV messages - starts a new receiver background thread */
SVReceiver_start(receiver); SVReceiver_start(receiver);
if (SVReceiver_isRunning(receiver)) {
signal(SIGINT, sigint_handler); signal(SIGINT, sigint_handler);
while (running) while (running)
@ -82,6 +83,10 @@ main(int argc, char** argv)
/* Stop listening to SV messages */ /* Stop listening to SV messages */
SVReceiver_stop(receiver); 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 */ /* Cleanup and free resources */
SVReceiver_destroy(receiver); SVReceiver_destroy(receiver);

@ -157,39 +157,35 @@ svReceiverLoop(void* threadParameter)
{ {
SVReceiver self = (SVReceiver) threadParameter; SVReceiver self = (SVReceiver) threadParameter;
self->running = true;
self->stopped = false; self->stopped = false;
if (SVReceiver_startThreadless(self)) {
while (self->running) { while (self->running) {
if (SVReceiver_tick(self) == false) if (SVReceiver_tick(self) == false)
Thread_sleep(1); Thread_sleep(1);
} }
SVReceiver_stopThreadless(self);
}
else {
if (DEBUG_SV_SUBSCRIBER)
printf("SV_SUBSCRIBER: Failed to start SV receiver\n");
}
self->stopped = true; self->stopped = true;
} }
void void
SVReceiver_start(SVReceiver self) SVReceiver_start(SVReceiver self)
{ {
Thread thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, true); if (SVReceiver_startThreadless(self)) {
if (thread != NULL) {
if (DEBUG_SV_SUBSCRIBER) if (DEBUG_SV_SUBSCRIBER)
printf("SV_SUBSCRIBER: SV receiver started for interface %s\n", self->interfaceId); printf("SV_SUBSCRIBER: SV receiver started for interface %s\n", self->interfaceId);
Thread thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, true);
if (thread) {
Thread_start(thread); Thread_start(thread);
} }
else {
if (DEBUG_SV_SUBSCRIBER)
printf("SV_SUBSCRIBER: Failed to start thread\n");
}
}
else { else {
if (DEBUG_SV_SUBSCRIBER) if (DEBUG_SV_SUBSCRIBER)
printf("SV_SUBSCRIBER: Starting SV receiver failed for interface %s\n", self->interfaceId); printf("SV_SUBSCRIBER: Starting SV receiver failed for interface %s\n", self->interfaceId);
@ -206,11 +202,13 @@ SVReceiver_isRunning(SVReceiver self)
void void
SVReceiver_stop(SVReceiver self) SVReceiver_stop(SVReceiver self)
{ {
self->running = false; if (self->running) {
SVReceiver_stopThreadless(self);
while (self->stopped == false) while (self->stopped == false)
Thread_sleep(1); Thread_sleep(1);
} }
}
void void
SVReceiver_destroy(SVReceiver self) SVReceiver_destroy(SVReceiver self)
@ -218,6 +216,9 @@ SVReceiver_destroy(SVReceiver self)
LinkedList_destroyDeep(self->subscriberList, LinkedList_destroyDeep(self->subscriberList,
(LinkedListValueDeleteFunction) SVSubscriber_destroy); (LinkedListValueDeleteFunction) SVSubscriber_destroy);
if (self->interfaceId != NULL)
GLOBAL_FREEMEM(self->interfaceId);
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
Semaphore_destroy(self->subscriberListLock); Semaphore_destroy(self->subscriberListLock);
#endif #endif
@ -247,6 +248,7 @@ SVReceiver_startThreadless(SVReceiver self)
void void
SVReceiver_stopThreadless(SVReceiver self) SVReceiver_stopThreadless(SVReceiver self)
{ {
if (self->ethSocket)
Ethernet_destroySocket(self->ethSocket); Ethernet_destroySocket(self->ethSocket);
self->running = false; self->running = false;

Loading…
Cancel
Save