- 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 */
SVReceiver_start(receiver);
if (SVReceiver_isRunning(receiver)) {
signal(SIGINT, sigint_handler);
while (running)
@ -82,6 +83,10 @@ main(int argc, char** argv)
/* 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);

@ -157,39 +157,35 @@ svReceiverLoop(void* threadParameter)
{
SVReceiver self = (SVReceiver) threadParameter;
self->running = true;
self->stopped = false;
if (SVReceiver_startThreadless(self)) {
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");
}
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 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)
printf("SV_SUBSCRIBER: Starting SV receiver failed for interface %s\n", self->interfaceId);
@ -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);
}
}
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,6 +248,7 @@ SVReceiver_startThreadless(SVReceiver self)
void
SVReceiver_stopThreadless(SVReceiver self)
{
if (self->ethSocket)
Ethernet_destroySocket(self->ethSocket);
self->running = false;

Loading…
Cancel
Save