From 1406064665e9470b125593202fa825d7d9543e01 Mon Sep 17 00:00:00 2001 From: Jean-Francois Penven <67962328+jepenven-silabs@users.noreply.github.com> Date: Thu, 2 Jun 2022 15:00:18 -0400 Subject: [PATCH] Implement Reset Heap HighWaterMark (#19104) --- examples/platform/efr32/heap_4_silabs.c | 10 ++++++++++ examples/platform/efr32/heap_4_silabs.h | 2 ++ src/platform/EFR32/DiagnosticDataProviderImpl.cpp | 11 +++++++++++ src/platform/EFR32/DiagnosticDataProviderImpl.h | 1 + 4 files changed, 24 insertions(+) diff --git a/examples/platform/efr32/heap_4_silabs.c b/examples/platform/efr32/heap_4_silabs.c index 98680cbeb296f6..03dddf4322519d 100644 --- a/examples/platform/efr32/heap_4_silabs.c +++ b/examples/platform/efr32/heap_4_silabs.c @@ -442,6 +442,16 @@ size_t xPortGetMinimumEverFreeHeapSize(void) { return xMinimumEverFreeBytesRemaining; } + +void xPortResetHeapMinimumEverFreeHeapSize(void) +{ + taskENTER_CRITICAL(); + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} + /*-----------------------------------------------------------*/ void vPortInitialiseBlocks(void) diff --git a/examples/platform/efr32/heap_4_silabs.h b/examples/platform/efr32/heap_4_silabs.h index 7873db896297c4..ed773f59f0a33c 100644 --- a/examples/platform/efr32/heap_4_silabs.h +++ b/examples/platform/efr32/heap_4_silabs.h @@ -42,6 +42,8 @@ extern "C" { void * pvPortCalloc(size_t num, size_t size); void * pvPortRealloc(void * pv, size_t size); +void xPortResetHeapMinimumEverFreeHeapSize(void); + #ifdef __cplusplus } #endif diff --git a/src/platform/EFR32/DiagnosticDataProviderImpl.cpp b/src/platform/EFR32/DiagnosticDataProviderImpl.cpp index 6ecfa321a13174..80430e238ef1a7 100644 --- a/src/platform/EFR32/DiagnosticDataProviderImpl.cpp +++ b/src/platform/EFR32/DiagnosticDataProviderImpl.cpp @@ -31,6 +31,7 @@ #include "AppConfig.h" #include "FreeRTOS.h" +#include "heap_4_silabs.h" using namespace ::chip::app::Clusters::GeneralDiagnostics; @@ -81,6 +82,16 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapHighWatermark(uint64_t & cu return CHIP_NO_ERROR; } +CHIP_ERROR DiagnosticDataProviderImpl::ResetWatermarks() +{ + // If implemented, the server SHALL set the value of the CurrentHeapHighWatermark attribute to the + // value of the CurrentHeapUsed. + + xPortResetHeapMinimumEverFreeHeapSize(); + + return CHIP_NO_ERROR; +} + // General Diagnostics Getters CHIP_ERROR DiagnosticDataProviderImpl::GetRebootCount(uint16_t & rebootCount) diff --git a/src/platform/EFR32/DiagnosticDataProviderImpl.h b/src/platform/EFR32/DiagnosticDataProviderImpl.h index a10259e6f7b336..600b170fc295de 100644 --- a/src/platform/EFR32/DiagnosticDataProviderImpl.h +++ b/src/platform/EFR32/DiagnosticDataProviderImpl.h @@ -42,6 +42,7 @@ class DiagnosticDataProviderImpl : public DiagnosticDataProvider CHIP_ERROR GetCurrentHeapFree(uint64_t & currentHeapFree) override; CHIP_ERROR GetCurrentHeapUsed(uint64_t & currentHeapUsed) override; CHIP_ERROR GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark) override; + CHIP_ERROR ResetWatermarks() override; CHIP_ERROR GetRebootCount(uint16_t & rebootCount) override; CHIP_ERROR GetBootReason(BootReasonType & bootReason) override; CHIP_ERROR GetUpTime(uint64_t & upTime) override;