- SV receiver: fixed memory access problem during cleanup when using threads

pull/477/head
Michael Zillgith 2 years ago
parent e81ff1d4d6
commit 04bceea398

@ -57,6 +57,7 @@ struct sSVReceiver {
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
Semaphore subscriberListLock; Semaphore subscriberListLock;
Thread thread;
#endif #endif
}; };
@ -99,6 +100,7 @@ SVReceiver_create(void)
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
self->subscriberListLock = Semaphore_create(1); self->subscriberListLock = Semaphore_create(1);
self->thread = NULL;
#endif #endif
} }
@ -193,15 +195,19 @@ SVReceiver_start(SVReceiver self)
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 (CONFIG_MMS_THREADLESS_STACK == 0)
self->thread = Thread_create((ThreadExecutionFunction) svReceiverLoop, (void*) self, false);
if (thread) { if (self->thread) {
Thread_start(thread); Thread_start(self->thread);
} }
else { else {
if (DEBUG_SV_SUBSCRIBER) if (DEBUG_SV_SUBSCRIBER)
printf("SV_SUBSCRIBER: Failed to start thread\n"); printf("SV_SUBSCRIBER: Failed to start thread\n");
} }
#endif /* (CONFIG_MMS_THREADLESS_STACK == 0) */
} }
else { else {
if (DEBUG_SV_SUBSCRIBER) if (DEBUG_SV_SUBSCRIBER)
@ -220,16 +226,24 @@ void
SVReceiver_stop(SVReceiver self) SVReceiver_stop(SVReceiver self)
{ {
if (self->running) { if (self->running) {
SVReceiver_stopThreadless(self); self->running = false;
while (self->stopped == false) #if (CONFIG_MMS_THREADLESS_STACK == 0)
Thread_sleep(1); if (self->thread) {
Thread_destroy(self->thread);
self->thread = NULL;
}
#endif /* (CONFIG_MMS_THREADLESS_STACK == 0) */
SVReceiver_stopThreadless(self);
} }
} }
void void
SVReceiver_destroy(SVReceiver self) SVReceiver_destroy(SVReceiver self)
{ {
SVReceiver_stop(self);
LinkedList_destroyDeep(self->subscriberList, LinkedList_destroyDeep(self->subscriberList,
(LinkedListValueDeleteFunction) SVSubscriber_destroy); (LinkedListValueDeleteFunction) SVSubscriber_destroy);
@ -237,7 +251,12 @@ SVReceiver_destroy(SVReceiver self)
GLOBAL_FREEMEM(self->interfaceId); GLOBAL_FREEMEM(self->interfaceId);
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
Semaphore_destroy(self->subscriberListLock); if (self->thread) {
Thread_destroy(self->thread);
self->thread = NULL;
}
Semaphore_destroy(self->subscriberListLock);
#endif #endif
GLOBAL_FREEMEM(self->buffer); GLOBAL_FREEMEM(self->buffer);

Loading…
Cancel
Save