From 1f5b6a12ba2c9cced667402fd4cc07fd371e1157 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 26 Nov 2019 22:13:56 +0100 Subject: [PATCH 01/16] Add function to retrieve the time remaining until the (next) timeout occurs. --- cores/esp8266/PolledTimeout.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 7eec547e48..cf2a275f96 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -223,6 +223,14 @@ class timeoutTemplate return TimePolicyT::toUserUnit(_timeout); } + IRAM_ATTR // fast + timeType expiresIn() + { + if (_neverExpires) return timeMax(); + if (expired()) return TimePolicyT::toUserUnit(0); + return TimePolicyT::toUserUnit(_timeout - (_current - _start)); + } + static constexpr timeType timeMax() { return TimePolicyT::timeMax; @@ -231,11 +239,11 @@ class timeoutTemplate private: IRAM_ATTR // fast - bool checkExpired(const timeType internalUnit) const + bool checkExpired() const { // canWait() is not checked here // returns "can expire" and "time expired" - return (!_neverExpires) && ((internalUnit - _start) >= _timeout); + return (!_neverExpires) && ((_current - _start) >= _timeout); } protected: @@ -246,10 +254,10 @@ class timeoutTemplate if (!canWait()) return true; - timeType current = TimePolicyT::time(); - if(checkExpired(current)) + _current = TimePolicyT::time(); + if(checkExpired()) { - unsigned long n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) + unsigned long n = (_current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (_current - _start >= _timeout) _start += n * _timeout; return true; } @@ -257,14 +265,16 @@ class timeoutTemplate } IRAM_ATTR // fast - bool expiredOneShot() const + bool expiredOneShot() { + _current = TimePolicyT::time(); // returns "always expired" or "has expired" - return !canWait() || checkExpired(TimePolicyT::time()); + return !canWait() || checkExpired(); } timeType _timeout; timeType _start; + timeType _current; bool _neverExpires; }; From 21b6afa5781a6bf9dd34e2c7d019f7fe1e64a26f Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 11:52:31 +0100 Subject: [PATCH 02/16] Rename and reformat according to review. --- cores/esp8266/PolledTimeout.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index cf2a275f96..35f4ade7f6 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -224,10 +224,12 @@ class timeoutTemplate } IRAM_ATTR // fast - timeType expiresIn() + timeType remaining() const { - if (_neverExpires) return timeMax(); - if (expired()) return TimePolicyT::toUserUnit(0); + if (_neverExpires) + return timeMax(); + if (expired()) + return TimePolicyT::toUserUnit(0); return TimePolicyT::toUserUnit(_timeout - (_current - _start)); } From dc3db41e18d935a06fadcd4c73aa10c2f3ecee5c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 12:17:16 +0100 Subject: [PATCH 03/16] Revert _current as member change. --- cores/esp8266/PolledTimeout.h | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 35f4ade7f6..5bac299749 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -227,10 +227,11 @@ class timeoutTemplate timeType remaining() const { if (_neverExpires) - return timeMax(); - if (expired()) - return TimePolicyT::toUserUnit(0); - return TimePolicyT::toUserUnit(_timeout - (_current - _start)); + return timeMax(); + timeType current = TimePolicyT::time(); + if (checkExpired(current)) + return TimePolicyT::toUserUnit(0); + return TimePolicyT::toUserUnit(_timeout - (current - _start)); } static constexpr timeType timeMax() @@ -241,11 +242,11 @@ class timeoutTemplate private: IRAM_ATTR // fast - bool checkExpired() const + bool checkExpired(const timeType internalUnit) const { // canWait() is not checked here // returns "can expire" and "time expired" - return (!_neverExpires) && ((_current - _start) >= _timeout); + return (!_neverExpires) && ((internalUnit - _start) >= _timeout); } protected: @@ -256,10 +257,10 @@ class timeoutTemplate if (!canWait()) return true; - _current = TimePolicyT::time(); - if(checkExpired()) + timeType current = TimePolicyT::time(); + if(checkExpired(current)) { - unsigned long n = (_current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (_current - _start >= _timeout) + unsigned long n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) _start += n * _timeout; return true; } @@ -267,16 +268,14 @@ class timeoutTemplate } IRAM_ATTR // fast - bool expiredOneShot() + bool expiredOneShot() const { - _current = TimePolicyT::time(); // returns "always expired" or "has expired" - return !canWait() || checkExpired(); + return !canWait() || checkExpired(TimePolicyT::time()); } timeType _timeout; timeType _start; - timeType _current; bool _neverExpires; }; From 074368456514a457a8b9651c58ec33445be7fb9a Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 12:21:20 +0100 Subject: [PATCH 04/16] Fix expiredOneShot to properly stay expired forever unless reset. --- cores/esp8266/PolledTimeout.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 5bac299749..27f2a9e953 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -268,10 +268,16 @@ class timeoutTemplate } IRAM_ATTR // fast - bool expiredOneShot() const + bool expiredOneShot() { // returns "always expired" or "has expired" - return !canWait() || checkExpired(TimePolicyT::time()); + return !canWait(); + if (checkExpired(TimePolicyT::time())) + { + _timeout = alwaysExpired; + return true; + } + return false; } timeType _timeout; From 36241a9b649e6c27dd2e784985f1e80b5b26606c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 14:25:49 +0100 Subject: [PATCH 05/16] Fix "reverse notation return statement" --- cores/esp8266/PolledTimeout.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 27f2a9e953..9de069aa84 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -271,7 +271,7 @@ class timeoutTemplate bool expiredOneShot() { // returns "always expired" or "has expired" - return !canWait(); + if (!canWait()) return true; if (checkExpired(TimePolicyT::time())) { _timeout = alwaysExpired; From 7e429cceebfd07cd34a0b60695f59a7892b889e3 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 22:22:20 +0100 Subject: [PATCH 06/16] Reset() was wrecked by resetting _timeout. Reverted. --- cores/esp8266/PolledTimeout.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 9de069aa84..9c034295db 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -176,7 +176,7 @@ class timeoutTemplate bool canWait () const { - return _timeout != alwaysExpired; + return _timeout != alwaysExpired && !_oneShotExpired; } // Resets, will trigger after this new timeout. @@ -193,6 +193,7 @@ class timeoutTemplate void reset() { _start = TimePolicyT::time(); + _oneShotExpired = false; } // Resets to just expired so that on next poll the check will immediately trigger for the user, @@ -245,8 +246,8 @@ class timeoutTemplate bool checkExpired(const timeType internalUnit) const { // canWait() is not checked here - // returns "can expire" and "time expired" - return (!_neverExpires) && ((internalUnit - _start) >= _timeout); + // returns "can expire" and "oneshot not expired" and "time expired" + return (_oneShotExpired) || ((!_neverExpires) && ((internalUnit - _start) >= _timeout)); } protected: @@ -274,7 +275,7 @@ class timeoutTemplate if (!canWait()) return true; if (checkExpired(TimePolicyT::time())) { - _timeout = alwaysExpired; + _oneShotExpired = true; return true; } return false; @@ -283,6 +284,7 @@ class timeoutTemplate timeType _timeout; timeType _start; bool _neverExpires; + bool _oneShotExpired; }; // legacy type names, deprecated (unit is milliseconds) From 543766f95135f4c0c0cb00e616646c5ba438d9e5 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 2 Dec 2019 23:44:32 +0100 Subject: [PATCH 07/16] Expired check ALWAYS executes yield policy BEFORE checking expiration - that's wasted time. Expired keeps executing yield policy on already expired oneShot - that's counter intuitive and wasted time. --- cores/esp8266/PolledTimeout.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 9c034295db..0a534b4ee8 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -157,10 +157,9 @@ class timeoutTemplate IRAM_ATTR // fast bool expired() { - YieldPolicyT::execute(); //in case of DoNothing: gets optimized away - if(PeriodicT) //in case of false: gets optimized away - return expiredRetrigger(); - return expiredOneShot(); + bool hasExpired = PeriodicT ? expiredRetrigger() : expiredOneShot(); + if (!hasExpired) YieldPolicyT::execute(); //in case of DoNothing: gets optimized away + return hasExpired; } IRAM_ATTR // fast From 2a6bbf5179b56f24b0eefb93560a272e7b159d13 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 3 Dec 2019 07:36:41 +0100 Subject: [PATCH 08/16] Reformat --- cores/esp8266/PolledTimeout.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 0a534b4ee8..74ec6798f5 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -158,7 +158,8 @@ class timeoutTemplate bool expired() { bool hasExpired = PeriodicT ? expiredRetrigger() : expiredOneShot(); - if (!hasExpired) YieldPolicyT::execute(); //in case of DoNothing: gets optimized away + if (!hasExpired) //in case of DoNothing: gets optimized away + YieldPolicyT::execute(); return hasExpired; } From ce6982b6cf55338179356f31cfcd95c119204b52 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 4 Dec 2019 13:02:20 +0100 Subject: [PATCH 09/16] Fix comment, remove redundant parentheses --- cores/esp8266/PolledTimeout.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 74ec6798f5..d3d09e0cd4 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -246,8 +246,8 @@ class timeoutTemplate bool checkExpired(const timeType internalUnit) const { // canWait() is not checked here - // returns "can expire" and "oneshot not expired" and "time expired" - return (_oneShotExpired) || ((!_neverExpires) && ((internalUnit - _start) >= _timeout)); + // returns "oneshot has expired", otherwise returns "can expire" and "time has expired" + return _oneShotExpired || (!_neverExpires && ((internalUnit - _start) >= _timeout)); } protected: From 05272e504d5a5fcb5c7c93214e80bc4779999eeb Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 15 Mar 2021 12:36:54 +0100 Subject: [PATCH 10/16] expired() is not const qualified in PolledTmeout. --- libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h b/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h index 4a83f979ae..d1ad2ce11f 100644 --- a/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h +++ b/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h @@ -61,7 +61,7 @@ class ExpiringTimeTracker : private esp8266::polledTimeout::oneShotMs { * Get the time since the ExpiringTimeTracker instance creation or the last reset(), whichever is more recent. */ uint32_t elapsedTime() const; - bool expired() const; + bool expired(); void reset(); void reset(const uint32_t newDuration); void reset(const calculatorType newDurationCalculator); From ed920dfd0d1802c8daa379a2209406bc8ebf1464 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 16 Mar 2021 08:06:21 +0100 Subject: [PATCH 11/16] expiredOneShot() qualifed as const, despite asymmetry with expired() and expiredRetrigger(). _oneShotExpired qualified as mutable member. This is done as intermediate fix for use in derived class ESP8266WiFiMesh ExpiringTimeTracker. --- cores/esp8266/PolledTimeout.h | 4 ++-- libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index d3d09e0cd4..b38b5aa6d3 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -269,7 +269,7 @@ class timeoutTemplate } IRAM_ATTR // fast - bool expiredOneShot() + bool expiredOneShot() const { // returns "always expired" or "has expired" if (!canWait()) return true; @@ -284,7 +284,7 @@ class timeoutTemplate timeType _timeout; timeType _start; bool _neverExpires; - bool _oneShotExpired; + mutable bool _oneShotExpired; }; // legacy type names, deprecated (unit is milliseconds) diff --git a/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h b/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h index d1ad2ce11f..4a83f979ae 100644 --- a/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h +++ b/libraries/ESP8266WiFiMesh/src/ExpiringTimeTracker.h @@ -61,7 +61,7 @@ class ExpiringTimeTracker : private esp8266::polledTimeout::oneShotMs { * Get the time since the ExpiringTimeTracker instance creation or the last reset(), whichever is more recent. */ uint32_t elapsedTime() const; - bool expired(); + bool expired() const; void reset(); void reset(const uint32_t newDuration); void reset(const calculatorType newDurationCalculator); From e942bccc9fc8341fec7996d83d338d28c1e80268 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 5 Apr 2021 11:26:05 +0200 Subject: [PATCH 12/16] Remove alwaysExpired, it is identical to 0 and obfuscates the code. --- cores/esp8266/PolledTimeout.h | 5 ++--- cores/esp8266/Stream.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index b38b5aa6d3..46ff0d9994 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -145,7 +145,6 @@ class timeoutTemplate using timeType = typename TimePolicyT::timeType; static_assert(std::is_unsigned::value == true, "timeType must be unsigned"); - static constexpr timeType alwaysExpired = 0; static constexpr timeType neverExpires = std::numeric_limits::max(); static constexpr timeType rangeCompensate = TimePolicyT::rangeCompensate; //debug @@ -176,7 +175,7 @@ class timeoutTemplate bool canWait () const { - return _timeout != alwaysExpired && !_oneShotExpired; + return _timeout != 0 && !_oneShotExpired; } // Resets, will trigger after this new timeout. @@ -215,7 +214,7 @@ class timeoutTemplate void resetToNeverExpires () { - _timeout = alwaysExpired + 1; // because canWait() has precedence + _timeout = 1; // because canWait() has precedence _neverExpires = true; } diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 340d4f9c78..596d9be5e8 100644 --- a/cores/esp8266/Stream.h +++ b/cores/esp8266/Stream.h @@ -168,7 +168,7 @@ class Stream: public Print { // transfers already buffered / immediately available data (no timeout) // returns number of transfered bytes - size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); } + size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, 0); } size_t sendAvailable (Print& to) { return sendAvailable(&to); } // transfers data until timeout From 8a9d25bd78fd6de7b06cb8e673cb66adb19ee889 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 5 Apr 2021 11:45:59 +0200 Subject: [PATCH 13/16] Somewhat easier on the human reader. --- cores/esp8266/PolledTimeout.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 46ff0d9994..0d4c82e718 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -175,7 +175,7 @@ class timeoutTemplate bool canWait () const { - return _timeout != 0 && !_oneShotExpired; + return !(_timeout == 0 || _oneShotExpired); } // Resets, will trigger after this new timeout. From 1d68d42b71e5aefed30c03ddc28d3fb3217f769c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 5 Apr 2021 12:32:26 +0200 Subject: [PATCH 14/16] Avoid possible unnecessary time conversion. --- cores/esp8266/PolledTimeout.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 0d4c82e718..9f02b64403 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -260,7 +260,7 @@ class timeoutTemplate timeType current = TimePolicyT::time(); if(checkExpired(current)) { - unsigned long n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) + timeType n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) _start += n * _timeout; return true; } From 9430a39bcd5db67c672c2a681bdb835cc178ef61 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 5 Apr 2021 17:30:53 +0200 Subject: [PATCH 15/16] Fix one-shot mode in resetToNeverExpires(). Add convenient stop() synonym for same function. --- cores/esp8266/PolledTimeout.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 9f02b64403..4c1c626999 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -175,7 +175,7 @@ class timeoutTemplate bool canWait () const { - return !(_timeout == 0 || _oneShotExpired); + return _timeout != 0 && (PeriodicT || !_oneShotExpired); } // Resets, will trigger after this new timeout. @@ -192,7 +192,7 @@ class timeoutTemplate void reset() { _start = TimePolicyT::time(); - _oneShotExpired = false; + if (!PeriodicT) _oneShotExpired = false; } // Resets to just expired so that on next poll the check will immediately trigger for the user, @@ -216,6 +216,12 @@ class timeoutTemplate { _timeout = 1; // because canWait() has precedence _neverExpires = true; + if (!PeriodicT) _oneShotExpired = false; + } + + void stop() + { + resetToNeverExpires(); } timeType getTimeout() const @@ -246,7 +252,7 @@ class timeoutTemplate { // canWait() is not checked here // returns "oneshot has expired", otherwise returns "can expire" and "time has expired" - return _oneShotExpired || (!_neverExpires && ((internalUnit - _start) >= _timeout)); + return !_neverExpires && ((!PeriodicT && _oneShotExpired) || ((internalUnit - _start) >= _timeout)); } protected: @@ -274,7 +280,7 @@ class timeoutTemplate if (!canWait()) return true; if (checkExpired(TimePolicyT::time())) { - _oneShotExpired = true; + if (!PeriodicT) _oneShotExpired = true; return true; } return false; From a0edd7dfde0aa22d2463657339b58dc2cfa77180 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 5 Apr 2021 21:30:50 +0200 Subject: [PATCH 16/16] Due to review and discussion, _oneShotExpired removed again. --- cores/esp8266/PolledTimeout.h | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 4c1c626999..5937756671 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -175,7 +175,7 @@ class timeoutTemplate bool canWait () const { - return _timeout != 0 && (PeriodicT || !_oneShotExpired); + return _timeout != 0; } // Resets, will trigger after this new timeout. @@ -184,7 +184,7 @@ class timeoutTemplate { reset(); _timeout = TimePolicyT::toTimeTypeUnit(newUserTimeout); - _neverExpires = (newUserTimeout < 0) || (newUserTimeout > timeMax()); + _neverExpires = newUserTimeout > timeMax(); } // Resets, will trigger after the timeout previously set. @@ -192,7 +192,6 @@ class timeoutTemplate void reset() { _start = TimePolicyT::time(); - if (!PeriodicT) _oneShotExpired = false; } // Resets to just expired so that on next poll the check will immediately trigger for the user, @@ -216,7 +215,6 @@ class timeoutTemplate { _timeout = 1; // because canWait() has precedence _neverExpires = true; - if (!PeriodicT) _oneShotExpired = false; } void stop() @@ -251,8 +249,8 @@ class timeoutTemplate bool checkExpired(const timeType internalUnit) const { // canWait() is not checked here - // returns "oneshot has expired", otherwise returns "can expire" and "time has expired" - return !_neverExpires && ((!PeriodicT && _oneShotExpired) || ((internalUnit - _start) >= _timeout)); + // returns "can expire" and "time has expired" + return (!_neverExpires) && ((internalUnit - _start) >= _timeout); } protected: @@ -277,19 +275,12 @@ class timeoutTemplate bool expiredOneShot() const { // returns "always expired" or "has expired" - if (!canWait()) return true; - if (checkExpired(TimePolicyT::time())) - { - if (!PeriodicT) _oneShotExpired = true; - return true; - } - return false; + return !canWait() || checkExpired(TimePolicyT::time()); } timeType _timeout; timeType _start; bool _neverExpires; - mutable bool _oneShotExpired; }; // legacy type names, deprecated (unit is milliseconds)