From 5a23c404d19f2245bff082bb17f3afa624d7da2f Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 19 Sep 2019 15:46:06 +0200 Subject: [PATCH] - IEC 61850 server: fixed thread cleanup problem in single thread server mode --- src/iec61850/inc_private/ied_server_private.h | 5 ++++ src/iec61850/server/impl/ied_server.c | 25 ++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h index f2e7fad1..f56cca0f 100644 --- a/src/iec61850/inc_private/ied_server_private.h +++ b/src/iec61850/inc_private/ied_server_private.h @@ -59,6 +59,11 @@ struct sIedServer uint8_t edition; bool running; + +#if (CONFIG_MMS_SINGLE_THREADED == 1) + bool stopServerThread; + Thread serverThread; +#endif }; diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 4a32ebec..60025547 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -503,6 +503,13 @@ IedServer_destroy(IedServer self) #endif } +#if (CONFIG_MMS_SINGLE_THREADED == 1) + if (self->serverThread) { + self->stopServerThread = true; + Thread_destroy(self->serverThread); + } +#endif + MmsServer_destroy(self->mmsServer); if (self->localIpAddress != NULL) @@ -555,15 +562,13 @@ singleThreadedServerThread(void* parameter) MmsMapping* mmsMapping = self->mmsMapping; - bool running = true; - mmsMapping->reportThreadFinished = false; mmsMapping->reportThreadRunning = true; if (DEBUG_IED_SERVER) printf("IED_SERVER: server thread started!\n"); - while (running) { + while (self->stopServerThread == false) { if (IedServer_waitReady(self, 25) > 0) MmsServer_handleIncomingMessages(self->mmsServer); @@ -571,8 +576,6 @@ singleThreadedServerThread(void* parameter) IedServer_performPeriodicTasks(self); Thread_sleep(1); - - running = mmsMapping->reportThreadRunning; } if (DEBUG_IED_SERVER) @@ -592,9 +595,11 @@ IedServer_start(IedServer self, int tcpPort) #if (CONFIG_MMS_SINGLE_THREADED == 1) MmsServer_startListeningThreadless(self->mmsServer, tcpPort); - Thread serverThread = Thread_create((ThreadExecutionFunction) singleThreadedServerThread, (void*) self, true); + self->stopServerThread = false; + + self->serverThread = Thread_create((ThreadExecutionFunction) singleThreadedServerThread, (void*) self, false); - Thread_start(serverThread); + Thread_start(self->serverThread); #else MmsServer_startListening(self->mmsServer, tcpPort); @@ -625,11 +630,13 @@ IedServer_stop(IedServer self) if (self->running) { self->running = false; - MmsMapping_stopEventWorkerThread(self->mmsMapping); - #if (CONFIG_MMS_SINGLE_THREADED == 1) MmsServer_stopListeningThreadless(self->mmsServer); + self->stopServerThread = true; + Thread_destroy(self->serverThread); + self->serverThread = NULL; #else + MmsMapping_stopEventWorkerThread(self->mmsMapping); MmsServer_stopListening(self->mmsServer); #endif }