diff options
Diffstat (limited to 'runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c')
-rw-r--r-- | runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c b/runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c index 98940d81d..71e3df127 100644 --- a/runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c +++ b/runtime/org.eclipse.etrice.runtime.c/src/common/messaging/etMessageService.c @@ -17,6 +17,8 @@ #include "etSystemProtocol.h" #include "debugging/etLogger.h" #include "debugging/etMSCLogger.h" +#include "runtime/etRuntime.h" +#include "helpers/etTimeHelpers.h" static void etMessageService_timerCallback(void* data); static void etMessageService_deliverAllMessages(etMessageService* self); @@ -35,9 +37,28 @@ void etMessageService_init( etTime interval, etDispatcherReceiveMessage msgDispatcher, etMessageService_execmode execmode){ + etMessageService_initx(self, NULL, buffer, maxBlocks, blockSize, stacksize, priority, interval, msgDispatcher, execmode); +} + +/* + * initialize message service with all needed data and initialize message queue and message pool + * + */ +void etMessageService_initx( + etMessageService* self, + const char* name, + etUInt8* buffer, + etUInt16 maxBlocks, + etUInt16 blockSize, + etStacksize stacksize, + etPriority priority, + etTime interval, + etDispatcherReceiveMessage msgDispatcher, + etMessageService_execmode execmode){ ET_MSC_LOGGER_SYNC_ENTRY("etMessageService", "init") /* copy init data to self */ + self->name = name; self->messageBuffer.buffer = buffer; self->messageBuffer.maxBlocks = maxBlocks; self->messageBuffer.blockSize = blockSize; @@ -65,6 +86,14 @@ void etMessageService_init( etTimer_construct(&self->timer, &interval, etMessageService_timerCallback, self); } + /* init statistics */ + self->statistics.highWaterMark = 0; + self->statistics.queueStatistics = &self->messageQueue.statistics; + self->resetStatistics = ET_FALSE; + + /* register with runtime */ + etRuntime_registerMessageService(self); + ET_MSC_LOGGER_SYNC_EXIT } @@ -96,6 +125,10 @@ void etMessageService_stop(etMessageService* self){ void etMessageService_destroy(etMessageService* self){ ET_MSC_LOGGER_SYNC_ENTRY("etMessageService", "destroy") + + /* unregister from runtime */ + etRuntime_unregisterMessageService(self); + etMutex_destruct( &(self->poolMutex) ); etMutex_destruct( &(self->queueMutex) ); etSema_destruct( &(self->executionSemaphore) ); @@ -206,16 +239,43 @@ static void etMessageService_callHighPrioFunc(etMessageService* self){ ET_MSC_LOGGER_SYNC_EXIT } +static etBool etMessageService_dispatchMessage(etMessageService* self, const etMessage* msg) { + ET_MSC_LOGGER_SYNC_ENTRY("etMessageService", "dispatchMessages") + etBool success; + etTime startTime, endTime; + etTimeDiff delta; + + getTimeFromTarget(&startTime); + success = self->msgDispatcher(msg); + getTimeFromTarget(&endTime); + delta = etTimeHelpers_delta(&endTime, &startTime); + + if (delta > self->statistics.highWaterMark) { + self->statistics.highWaterMark = delta; + } + + ET_MSC_LOGGER_SYNC_EXIT + return success; +} + static void etMessageService_deliverAllMessages(etMessageService* self){ ET_MSC_LOGGER_SYNC_ENTRY("etMessageService", "deliverAllMessages") { etBool cont = ET_TRUE; while (cont){ etMessageService_callHighPrioFunc(self); + + if (self->resetStatistics) { + self->resetStatistics = ET_FALSE; + + self->statistics.highWaterMark = 0; + etMessageQueue_resetHighWaterMark(&self->messageQueue); + etMessageQueue_resetLowWaterMark(&self->messageQueue); + } + while (etMessageQueue_isNotEmpty(&self->messageQueue) && cont){ etMessage* msg = etMessageService_popMessage(self); - if (!self->msgDispatcher(msg)) - cont = ET_FALSE; + cont &= etMessageService_dispatchMessage(self, msg); etMessageService_returnMessageBuffer(self, msg); etMessageService_callHighPrioFunc(self); } |