From 7ee278ceadebe3fe483dffb8e22d476173a3316e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 22 Oct 2020 18:52:26 +0200 Subject: [PATCH] - IEC 61850 client: using poll/select to reduce CPU consumption --- src/mms/inc_private/cotp.h | 1 + src/mms/iso_client/iso_client_connection.c | 5 ++++- src/mms/iso_cotp/cotp.c | 11 +++++++++++ src/mms/iso_mms/client/mms_client_connection.c | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/mms/inc_private/cotp.h b/src/mms/inc_private/cotp.h index 75eba309..65b0903c 100644 --- a/src/mms/inc_private/cotp.h +++ b/src/mms/inc_private/cotp.h @@ -43,6 +43,7 @@ typedef struct { int localRef; int protocolClass; + HandleSet handleSet; Socket socket; #if (CONFIG_MMS_SUPPORT_TLS == 1) TLSSocket tlsSocket; diff --git a/src/mms/iso_client/iso_client_connection.c b/src/mms/iso_client/iso_client_connection.c index f5462265..35349de3 100644 --- a/src/mms/iso_client/iso_client_connection.c +++ b/src/mms/iso_client/iso_client_connection.c @@ -769,8 +769,11 @@ IsoClientConnection_destroy(IsoClientConnection self) GLOBAL_FREEMEM(self->receiveBuf); if (self->receiveBuffer != NULL) GLOBAL_FREEMEM(self->receiveBuffer); - if (self->cotpConnection != NULL) + if (self->cotpConnection != NULL) { + if ( self->cotpConnection->handleSet != NULL ) + Handleset_destroy(self->cotpConnection->handleSet); GLOBAL_FREEMEM(self->cotpConnection); + } if (self->cotpReadBuffer != NULL) GLOBAL_FREEMEM(self->cotpReadBuffer); diff --git a/src/mms/iso_cotp/cotp.c b/src/mms/iso_cotp/cotp.c index 8c37d262..76e96f87 100644 --- a/src/mms/iso_cotp/cotp.c +++ b/src/mms/iso_cotp/cotp.c @@ -451,6 +451,8 @@ CotpConnection_init(CotpConnection* self, Socket socket, { self->state = 0; self->socket = socket; + self->handleSet = Handleset_new( ); + Handleset_addSocket( self->handleSet, self->socket ); #if (CONFIG_MMS_SUPPORT_TLS == 1) self->tlsSocket = NULL; #endif @@ -664,6 +666,15 @@ CotpConnection_resetPayload(CotpConnection* self) static int readFromSocket(CotpConnection* self, uint8_t* buf, int size) { + switch (Handleset_waitReady(self->handleSet, 10)) + { + case -1: + return -1; + case 0: + return 0; + default: + break; + } #if (CONFIG_MMS_SUPPORT_TLS == 1) if (self->tlsSocket) return TLSSocket_read(self->tlsSocket, buf, size); diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index e5d0d5e0..42d739c6 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -1403,7 +1403,7 @@ connectionHandlingThread(void* parameter) while (self->connectionThreadRunning) { if (MmsConnection_tick(self)) - Thread_sleep(1); + Thread_sleep(10); } return NULL;