- GOOSE receiver: fixed potential deadlock when GooseReceiver_stop is called directly after GooseReceiver_start

pull/147/head
Michael Zillgith 7 years ago
parent 8fa25ce182
commit 0c44dc4e5c

@ -48,7 +48,7 @@
struct sGooseReceiver struct sGooseReceiver
{ {
bool running; bool running;
bool stopped; bool stop;
char* interfaceId; char* interfaceId;
uint8_t* buffer; uint8_t* buffer;
EthernetSocket ethSocket; EthernetSocket ethSocket;
@ -65,6 +65,7 @@ GooseReceiver_create()
if (self != NULL) { if (self != NULL) {
self->running = false; self->running = false;
self->stop = false;
self->interfaceId = NULL; self->interfaceId = NULL;
self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH);
self->ethSocket = NULL; self->ethSocket = NULL;
@ -772,9 +773,6 @@ gooseReceiverLoop(void* threadParameter)
{ {
GooseReceiver self = (GooseReceiver) threadParameter; GooseReceiver self = (GooseReceiver) threadParameter;
self->running = true;
self->stopped = false;
GooseReceiver_startThreadless(self); GooseReceiver_startThreadless(self);
if (self->running) { if (self->running) {
@ -783,12 +781,13 @@ gooseReceiverLoop(void* threadParameter)
if (GooseReceiver_tick(self) == false) if (GooseReceiver_tick(self) == false)
Thread_sleep(1); Thread_sleep(1);
if (self->stop)
break;
} }
GooseReceiver_stopThreadless(self); GooseReceiver_stopThreadless(self);
} }
self->stopped = true;
} }
#endif #endif
@ -822,12 +821,11 @@ void
GooseReceiver_stop(GooseReceiver self) GooseReceiver_stop(GooseReceiver self)
{ {
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
self->stop = true;
self->running = false; self->running = false;
Thread_destroy(self->thread); Thread_destroy(self->thread);
self->stop = false;
while (self->stopped == false)
Thread_sleep(1);
#endif #endif
} }

Loading…
Cancel
Save