diff --git a/libraries/Ticker/src/Ticker.cpp b/libraries/Ticker/src/Ticker.cpp index baac355ca5..8c45ffed8b 100644 --- a/libraries/Ticker/src/Ticker.cpp +++ b/libraries/Ticker/src/Ticker.cpp @@ -115,6 +115,11 @@ void Ticker::_static_callback() } } + // it is technically allowed to call either schedule or detach + // *during* callback execution. allow both to happen + decltype(_callback) tmp; + std::swap(tmp, _callback); + std::visit([](auto&& callback) { using T = std::decay_t; if constexpr (std::is_same_v) { @@ -122,7 +127,16 @@ void Ticker::_static_callback() } else if constexpr (std::is_same_v) { callback(); } - }, _callback); + }, tmp); + + // ...and move ourselves back only when object is in a valid state + // * ticker was not detached, zeroing timer pointer + // * nothing else replaced callback variant + if ((_timer == nullptr) || !std::holds_alternative(_callback)) { + return; + } + + std::swap(tmp, _callback); if (_repeat) { if (_tick) {