diff --git a/firmware/console/binary/tooth_logger.cpp b/firmware/console/binary/tooth_logger.cpp index 64614135b4..387d0ccc46 100644 --- a/firmware/console/binary/tooth_logger.cpp +++ b/firmware/console/binary/tooth_logger.cpp @@ -127,6 +127,7 @@ void DisableToothLogger() { setToothLogReady(false); // Release the big buffer for another user + // C++ magic: here we are calling BigBufferHandle::operator=() with empty instance bufferHandle = {}; buffers = nullptr; } diff --git a/firmware/controllers/core/big_buffer.cpp b/firmware/controllers/core/big_buffer.cpp index 5bf0a4a0f7..363e375a15 100644 --- a/firmware/controllers/core/big_buffer.cpp +++ b/firmware/controllers/core/big_buffer.cpp @@ -8,6 +8,12 @@ static BigBufferUser s_currentUser; // we've only observed issue on F7 in -Os compiler configuration but technically all processors care static uint32_t s_bigBuffer[BIG_BUFFER_SIZE / sizeof(uint32_t)]; +#if EFI_UNIT_TEST +BigBufferUser &getBigBufferCurrentUser() { + return s_currentUser; +} +#endif // EFI_UNIT_TEST + static void releaseBuffer(void* bufferPtr, BigBufferUser user) { if (bufferPtr != &s_bigBuffer || user != s_currentUser) { // todo: panic! diff --git a/unit_tests/tests/test_big_buffer.cpp b/unit_tests/tests/test_big_buffer.cpp new file mode 100644 index 0000000000..57df6de47d --- /dev/null +++ b/unit_tests/tests/test_big_buffer.cpp @@ -0,0 +1,10 @@ +#include "pch.h" + +BigBufferUser &getBigBufferCurrentUser(); + +TEST(BigBuffer, CppMagic) { + BigBufferHandle h = getBigBuffer(BigBufferUser::ToothLogger); + ASSERT_EQ(getBigBufferCurrentUser(), BigBufferUser::ToothLogger); + h = {}; + ASSERT_EQ(getBigBufferCurrentUser(), BigBufferUser::ToothLogger); +} diff --git a/unit_tests/tests/tests.mk b/unit_tests/tests/tests.mk index 78b2282136..f730b1c56d 100644 --- a/unit_tests/tests/tests.mk +++ b/unit_tests/tests/tests.mk @@ -58,6 +58,7 @@ TESTS_SRC_CPP = \ tests/test_change_engine_type.cpp \ tests/util/test_scaled_channel.cpp \ tests/util/test_timer.cpp \ + tests/test_big_buffer.cpp \ tests/system/test_periodic_thread_controller.cpp \ tests/test_util.cpp \ tests/test_start_stop.cpp \