- 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,13 +75,18 @@ 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);
signal(SIGINT, sigint_handler); if (SVReceiver_isRunning(receiver)) {
signal(SIGINT, sigint_handler);
while (running) while (running)
Thread_sleep(1); Thread_sleep(1);
/* 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,38 +157,34 @@ 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_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 { else {
if (DEBUG_SV_SUBSCRIBER) if (DEBUG_SV_SUBSCRIBER)
@ -206,10 +202,12 @@ 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
@ -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,7 +248,8 @@ SVReceiver_startThreadless(SVReceiver self)
void void
SVReceiver_stopThreadless(SVReceiver self) SVReceiver_stopThreadless(SVReceiver self)
{ {
Ethernet_destroySocket(self->ethSocket); if (self->ethSocket)
Ethernet_destroySocket(self->ethSocket);
self->running = false; self->running = false;
} }

Loading…
Cancel
Save