From c93eb67fee6695e9eab7e4ab4fd6b9e88a3c5bbb Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 2 May 2023 14:11:51 +0000 Subject: [PATCH 1/3] Only allocate logging buffer when required buffer size is larger than 32 bytes --- src/lib/support/logging/CHIPLogging.cpp | 36 ++++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/lib/support/logging/CHIPLogging.cpp b/src/lib/support/logging/CHIPLogging.cpp index fae093cd9cca5c..632f51c6b48efc 100644 --- a/src/lib/support/logging/CHIPLogging.cpp +++ b/src/lib/support/logging/CHIPLogging.cpp @@ -62,18 +62,40 @@ void HandleTokenizedLog(uint32_t levels, pw_tokenizer_Token token, pw_tokenizer_ pw_tokenizer_EncodeArgs(types, args, encoded_message + sizeof(token), sizeof(encoded_message) - sizeof(token)); va_end(args); - uint8_t log_category = levels >> 8 & 0xFF; - uint8_t log_module = levels & 0xFF; - char * buffer = (char *) chip::Platform::MemoryAlloc(2 * encoded_size + 1); + uint8_t log_category = levels >> 8 & 0xFF; + uint8_t log_module = levels & 0xFF; + char * logging_buffer = nullptr; - if (buffer) + // To reduce the number of alloc/free that is happening we will use a stack + // buffer when buffer required to log is small. + char stack_buffer[32]; + char * allocated_buffer = nullptr; + size_t required_buffer_size = 2 * encoded_size + 1; + + if (required_buffer_size > sizeof(stack_buffer)) + { + allocated_buffer = (char *) chip::Platform::MemoryAlloc(); + if (allocated_buffer) + { + logging_buffer = allocated_buffer; + } + } + else + { + logging_buffer = stack_buffer; + } + + if (logging_buffer) { for (int i = 0; i < encoded_size; i++) { - sprintf(buffer + 2 * i, "%02x", encoded_message[i]); + sprintf(logging_buffer + 2 * i, "%02x", encoded_message[i]); } - buffer[2 * encoded_size] = '\0'; - Log(log_module, log_category, "%s", buffer); + logging_buffer[2 * encoded_size] = '\0'; + Log(log_module, log_category, "%s", logging_buffer); + } + if (allocated_buffer) + { chip::Platform::MemoryFree(buffer); } } From 3c5d87211136212774e42760e8223b8933146cdc Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 2 May 2023 15:10:16 +0000 Subject: [PATCH 2/3] Fix CI issue --- src/lib/support/logging/CHIPLogging.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/support/logging/CHIPLogging.cpp b/src/lib/support/logging/CHIPLogging.cpp index 632f51c6b48efc..4c1aee128d0761 100644 --- a/src/lib/support/logging/CHIPLogging.cpp +++ b/src/lib/support/logging/CHIPLogging.cpp @@ -74,7 +74,7 @@ void HandleTokenizedLog(uint32_t levels, pw_tokenizer_Token token, pw_tokenizer_ if (required_buffer_size > sizeof(stack_buffer)) { - allocated_buffer = (char *) chip::Platform::MemoryAlloc(); + allocated_buffer = (char *) chip::Platform::MemoryAlloc(required_buffer_size); if (allocated_buffer) { logging_buffer = allocated_buffer; @@ -96,7 +96,7 @@ void HandleTokenizedLog(uint32_t levels, pw_tokenizer_Token token, pw_tokenizer_ } if (allocated_buffer) { - chip::Platform::MemoryFree(buffer); + chip::Platform::MemoryFree(allocated_buffer); } } From 0701ebf5031930ad929652d6fb40b1113e67553c Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 2 May 2023 16:49:28 +0000 Subject: [PATCH 3/3] Fix compiler warning --- src/lib/support/logging/CHIPLogging.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/support/logging/CHIPLogging.cpp b/src/lib/support/logging/CHIPLogging.cpp index 4c1aee128d0761..a1eac1324e6b3b 100644 --- a/src/lib/support/logging/CHIPLogging.cpp +++ b/src/lib/support/logging/CHIPLogging.cpp @@ -87,7 +87,7 @@ void HandleTokenizedLog(uint32_t levels, pw_tokenizer_Token token, pw_tokenizer_ if (logging_buffer) { - for (int i = 0; i < encoded_size; i++) + for (size_t i = 0; i < encoded_size; i++) { sprintf(logging_buffer + 2 * i, "%02x", encoded_message[i]); }