- IEC 61850 server: fixed thread cleanup problem in single thread server mode

v1.3
Michael Zillgith 6 years ago
parent dbdcd33e61
commit 5a23c404d1

@ -59,6 +59,11 @@ struct sIedServer
uint8_t edition;
bool running;
#if (CONFIG_MMS_SINGLE_THREADED == 1)
bool stopServerThread;
Thread serverThread;
#endif
};

@ -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
}

Loading…
Cancel
Save