From 7c7b9653f843588ae60d92c6f7d1477d7bbc5f05 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Thu, 15 Dec 2016 16:52:55 +0100 Subject: Prevented overflow with size_t::max for durations --- src/uscxml/interpreter/BasicEventQueue.cpp | 20 ++++++++++---------- src/uscxml/interpreter/InterpreterImpl.h | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/uscxml/interpreter/BasicEventQueue.cpp b/src/uscxml/interpreter/BasicEventQueue.cpp index 104c9fa..2f8bd48 100644 --- a/src/uscxml/interpreter/BasicEventQueue.cpp +++ b/src/uscxml/interpreter/BasicEventQueue.cpp @@ -22,8 +22,6 @@ #include #include -//#include - #include "uscxml/interpreter/Logging.h" namespace uscxml { @@ -37,19 +35,21 @@ Event BasicEventQueue::dequeue(size_t blockMs) { std::lock_guard lock(_mutex); if (blockMs > 0) { + using namespace std::chrono; - // block for given milliseconds or until queue is non-empty - auto endTime = std::chrono::system_clock::now() + std::chrono::milliseconds(blockMs); -// std::time_t ttp = std::chrono::system_clock::to_time_t(endTime); -// std::cout << "End: " << ttp << std::endl; -// std::cout << "Now: " << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl; + // TODO: do read http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm + system_clock::time_point now = system_clock::now(); + system_clock::time_point endTime = now + milliseconds(blockMs); + // now + milliseconds(blockMs) may not have fitted into a duration type - limit to maximum duration + if (blockMs > system_clock::duration::max().count() - duration_cast(now.time_since_epoch()).count()) { + endTime = system_clock::time_point::max(); + } + + // block for given milliseconds or until queue is non-empty while (endTime > std::chrono::system_clock::now() && _queue.empty()) { _cond.wait_until(_mutex, endTime); -// std::cout << "Aft: " << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl; -// std::cout << blockMs << "."; } - } if (_queue.size() > 0) { diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h index f4fe93e..1243f7c 100644 --- a/src/uscxml/interpreter/InterpreterImpl.h +++ b/src/uscxml/interpreter/InterpreterImpl.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "uscxml/Common.h" #include "uscxml/util/URL.h" @@ -107,7 +108,7 @@ public: MicrostepCallbacks */ virtual Event dequeueInternal() { - _currEvent = _internalQueue.dequeue(false); + _currEvent = _internalQueue.dequeue(0); if (_currEvent) _dataModel.setEvent(_currEvent); return _currEvent; -- cgit v0.12