diff --git a/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp b/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp index 6419846a0c7d22..162a0d3ea19820 100644 --- a/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp +++ b/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp @@ -114,6 +114,15 @@ inline DiagnosticDataProviderImpl::DiagnosticDataProviderImpl() : mBootReason(De ChipLogDetail(DeviceLayer, "Boot reason: %u", static_cast(mBootReason)); } +bool DiagnosticDataProviderImpl::SupportsWatermarks() +{ +#ifdef CONFIG_CHIP_MALLOC_SYS_HEAP + return true; +#else + return false; +#endif +} + CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapFree(uint64_t & currentHeapFree) { #ifdef CONFIG_CHIP_MALLOC_SYS_HEAP @@ -153,14 +162,17 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapHighWatermark(uint64_t & cu Malloc::Stats stats; ReturnErrorOnFailure(Malloc::GetStats(stats)); - // TODO: use the maximum usage once that is implemented in Zephyr - currentHeapHighWatermark = stats.used; + currentHeapHighWatermark = stats.maxUsed; return CHIP_NO_ERROR; -#elif CHIP_DEVICE_CONFIG_HEAP_STATISTICS_MALLINFO - // ARM newlib does not provide a way to obtain the peak heap usage, so for now just return - // the amount of memory allocated from the system which should be an upper bound of the peak - // usage provided that the heap is not very fragmented. - currentHeapHighWatermark = mallinfo().arena; +#else + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; +#endif +} + +CHIP_ERROR DiagnosticDataProviderImpl::ResetWatermarks() +{ +#ifdef CONFIG_CHIP_MALLOC_SYS_HEAP + Malloc::ResetMaxStats(); return CHIP_NO_ERROR; #else return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; diff --git a/src/platform/Zephyr/DiagnosticDataProviderImpl.h b/src/platform/Zephyr/DiagnosticDataProviderImpl.h index a90cf4eb43e24d..b23fb5778466d7 100644 --- a/src/platform/Zephyr/DiagnosticDataProviderImpl.h +++ b/src/platform/Zephyr/DiagnosticDataProviderImpl.h @@ -39,9 +39,11 @@ class DiagnosticDataProviderImpl : public DiagnosticDataProvider // ===== Methods that implement the PlatformManager abstract interface. + bool SupportsWatermarks() override; 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 GetUpTime(uint64_t & upTime) override; diff --git a/src/platform/Zephyr/SysHeapMalloc.cpp b/src/platform/Zephyr/SysHeapMalloc.cpp index 68f8d2156ee6a0..e65ec8a44b7c7a 100644 --- a/src/platform/Zephyr/SysHeapMalloc.cpp +++ b/src/platform/Zephyr/SysHeapMalloc.cpp @@ -134,12 +134,18 @@ CHIP_ERROR GetStats(Stats & stats) sys_heap_runtime_stats sysHeapStats; ReturnErrorOnFailure(System::MapErrorZephyr(sys_heap_runtime_stats_get(&sHeap, &sysHeapStats))); - stats.free = sysHeapStats.free_bytes; - stats.used = sysHeapStats.allocated_bytes; + stats.free = sysHeapStats.free_bytes; + stats.used = sysHeapStats.allocated_bytes; + stats.maxUsed = sysHeapStats.max_allocated_bytes; return CHIP_NO_ERROR; } +void ResetMaxStats() +{ + (void) sys_heap_runtime_stats_reset_max(&sHeap); +} + #endif // CONFIG_SYS_HEAP_RUNTIME_STATS } // namespace Malloc diff --git a/src/platform/Zephyr/SysHeapMalloc.h b/src/platform/Zephyr/SysHeapMalloc.h index 3ee6f50ab0d3da..ca2383027e8508 100644 --- a/src/platform/Zephyr/SysHeapMalloc.h +++ b/src/platform/Zephyr/SysHeapMalloc.h @@ -27,6 +27,7 @@ struct Stats { size_t free; size_t used; + size_t maxUsed; }; void * Malloc(size_t size); @@ -34,6 +35,7 @@ void * Calloc(size_t num, size_t size); void * Realloc(void * mem, size_t size); void Free(void * mem); CHIP_ERROR GetStats(Stats & stats); +void ResetMaxStats(); } // namespace Malloc } // namespace DeviceLayer