Fix the asynclogger not treating tail properly.

This commit is contained in:
Erki 2021-04-03 17:30:03 +03:00
parent ce4f8eb8f5
commit 5c8e6f09b9
4 changed files with 74 additions and 21 deletions

View File

@ -28,12 +28,9 @@ template<typename Origin, typename Handler, void (Handler::*func)(), typename Ta
IsrCallbackFn<Origin> createCallback(Handler& h_in) IsrCallbackFn<Origin> createCallback(Handler& h_in)
{ {
static Handler* h = &h_in; static Handler* h = &h_in;
printf("Set handler: %p\n", h);
return +[](Origin*) return +[](Origin*)
{ {
printf("Into callback we go.\n");
(h->*func)(); (h->*func)();
printf("And we're out.\n");
}; };
} }

View File

@ -9,7 +9,7 @@
template<size_t N> template<size_t N>
using Ringbuffer = Utility::Ringbuffer<int, N>; using Ringbuffer = Utility::Ringbuffer<int, N>;
TEST_CASE("Ringbuffer iterator", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer iterator", "[utility],[ringbuffer]")
{ {
using iterator = Ringbuffer<10>::iterator; using iterator = Ringbuffer<10>::iterator;
const auto begin = iterator::pointer(10); const auto begin = iterator::pointer(10);
@ -43,7 +43,7 @@ TEST_CASE("Ringbuffer iterator", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Ringbuffer iterator at the end", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer iterator at the end", "[utility],[ringbuffer]")
{ {
using iterator = Ringbuffer<10>::iterator; using iterator = Ringbuffer<10>::iterator;
const auto begin = iterator::pointer(10); const auto begin = iterator::pointer(10);
@ -71,7 +71,7 @@ TEST_CASE("Ringbuffer iterator at the end", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Ringbuffer iterator at the beginning", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer iterator at the beginning", "[utility],[ringbuffer]")
{ {
using iterator = Ringbuffer<10>::iterator; using iterator = Ringbuffer<10>::iterator;
const auto begin = iterator::pointer(10); const auto begin = iterator::pointer(10);
@ -87,16 +87,17 @@ TEST_CASE("Ringbuffer iterator at the beginning", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Constructed buffer is empty.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer constructed buffer is empty.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
REQUIRE(buffer.begin() == buffer.end()); REQUIRE(buffer.begin() == buffer.end());
REQUIRE(buffer.size() == 0); REQUIRE(buffer.size() == 0);
REQUIRE(buffer.empty()); REQUIRE(buffer.empty());
REQUIRE(&buffer.front() == &buffer.back());
} }
TEST_CASE("Buffer reports size properly.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer reports size properly.", "[utility],[ringbuffer]")
{ {
Ringbuffer<3> buffer; Ringbuffer<3> buffer;
@ -140,7 +141,7 @@ TEST_CASE("Buffer reports size properly.", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Adding single element.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer adding single element.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
const auto old_end = buffer.end(); const auto old_end = buffer.end();
@ -191,7 +192,7 @@ TEST_CASE("Adding single element.", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Adding multiple elements.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer adding multiple elements.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
const auto old_begin = buffer.begin(); const auto old_begin = buffer.begin();
@ -223,7 +224,7 @@ TEST_CASE("Adding multiple elements.", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Removing elements from the ringbuffer.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer removing elements from the ringbuffer.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
const auto old_begin = buffer.begin(); const auto old_begin = buffer.begin();
@ -271,7 +272,7 @@ TEST_CASE("Removing elements from the ringbuffer.", "[peripherals],[ringbuffer]"
} }
} }
TEST_CASE("Clearing a ringbuffer works.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer clearing a ringbuffer works.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
@ -290,10 +291,11 @@ TEST_CASE("Clearing a ringbuffer works.", "[peripherals],[ringbuffer]")
SECTION("Sets begin() and end() pointers appropriately.") SECTION("Sets begin() and end() pointers appropriately.")
{ {
REQUIRE(buffer.begin() == buffer.end()); REQUIRE(buffer.begin() == buffer.end());
REQUIRE(&buffer.front() == &buffer.back());
} }
} }
TEST_CASE("Manually incrementing tail works.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer manually incrementing tail works.", "[utility],[ringbuffer]")
{ {
Ringbuffer<10> buffer; Ringbuffer<10> buffer;
@ -312,7 +314,55 @@ TEST_CASE("Manually incrementing tail works.", "[peripherals],[ringbuffer]")
} }
} }
TEST_CASE("Manually incrementing tail when full deletes data.", "[peripherals],[ringbuffer]") TEST_CASE("Ringbuffer manually incrementing tail from empty state works.", "[utility],[ringbuffer]")
{
Ringbuffer<10> buffer;
const auto old_end = buffer.end();
const auto old_begin = buffer.begin();
auto* old_tail_item_ptr = &(*old_end);
buffer.increment_tail();
SECTION("Head remains in place.")
{
const auto new_end = buffer.end();
const auto new_begin = buffer.begin();
REQUIRE(old_begin == new_begin);
REQUIRE(new_end != new_begin);
REQUIRE(new_end - new_begin == 1);
}
SECTION("Tail has been incremented.")
{
const auto new_end = buffer.end();
REQUIRE(new_end != old_end);
REQUIRE(new_end - old_end == 1);
REQUIRE(buffer.size() == 1);
}
SECTION("Item pointer for end is increased appropriately.")
{
auto* new_tail_item_ptr = &(*buffer.end());
REQUIRE(new_tail_item_ptr != old_tail_item_ptr);
REQUIRE(new_tail_item_ptr - old_tail_item_ptr == 1);
}
SECTION("Second incrementation works as expected.")
{
buffer.increment_tail();
const auto new_end = buffer.end();
const auto new_begin = buffer.begin();
auto* new_tail_item_ptr = &(*buffer.end());
REQUIRE(new_begin == old_begin);
REQUIRE(new_end - old_end == 2);
REQUIRE(new_tail_item_ptr - old_tail_item_ptr == 2);
REQUIRE(buffer.size() == 2);
}
}
TEST_CASE("Ringbuffer manually incrementing tail when full deletes data.", "[utility],[ringbuffer]")
{ {
Ringbuffer<2> buffer; Ringbuffer<2> buffer;

View File

@ -48,10 +48,8 @@ public:
std::va_list args; std::va_list args;
va_start(args, format); va_start(args, format);
auto tail = _buffer_queue.end(); _Data& tail = (*_buffer_queue.end());
std::array<char, 255>& buffer = tail->buffer; tail.length = vsnprintf(tail.buffer.data(), tail.buffer.size(), format, args);
tail->length = vsnprintf(buffer.data(), buffer.size(), format, args);
{ {
AtomicScopeGuard<hal> s; AtomicScopeGuard<hal> s;
@ -60,6 +58,8 @@ public:
if (!_in_flight) if (!_in_flight)
_sendNextLog(); _sendNextLog();
} }
va_end(args);
} }
void txCompleteCallback() void txCompleteCallback()

View File

@ -172,7 +172,7 @@ public:
void increment_tail() void increment_tail()
{ {
if (_tail == _head) if (_is_full)
++_head; ++_head;
++_tail; ++_tail;
@ -199,12 +199,18 @@ public:
reference back() reference back()
{ {
return *(_tail - 1); if (empty())
return *_tail;
else
return *(_tail - 1);
} }
const_reference back() const const_reference back() const
{ {
return *(_tail - 1); if (empty())
return *_tail;
else
return *(_tail - 1);
} }
size_type size() const size_type size() const