diff options
author | Remko Tronçon <git@el-tramo.be> | 2014-01-17 20:02:19 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2014-01-18 10:44:42 (GMT) |
commit | 85c46a0fcce3495fe94397d53791628a8ccc74c4 (patch) | |
tree | 233decfdbe1c221f3db2149f0f59d828173c102e /Sluift/Watchdog.cpp | |
parent | 09108f5ac3c1a6567730b5bbd0c847f8422ff4a2 (diff) | |
download | swift-85c46a0fcce3495fe94397d53791628a8ccc74c4.zip swift-85c46a0fcce3495fe94397d53791628a8ccc74c4.tar.bz2 |
Sluift: Allow blocking calls to be interrupted.
Change-Id: I3755e796fbddc038022bbf543c7b1c0529a9b0f9
Diffstat (limited to 'Sluift/Watchdog.cpp')
-rw-r--r-- | Sluift/Watchdog.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Sluift/Watchdog.cpp b/Sluift/Watchdog.cpp new file mode 100644 index 0000000..8b1c9ab --- /dev/null +++ b/Sluift/Watchdog.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014 Remko Tronçon + * Licensed under the GNU General Public License. + * See the COPYING file for more information. + */ + +#include <Sluift/Watchdog.h> + +#include <Sluift/globals.h> + +static const int INTERVAL_MS = 500; + + +using namespace Swift; + +Watchdog::Watchdog(int timeout, TimerFactory* timerFactory) : + remainingTime(timeout), + timerFactory(timerFactory), + timedOut(false) { + Sluift::globals.interruptRequested = 0; + + int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; + + timer = timerFactory->createTimer(nextTimeout); + timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); + remainingTime -= nextTimeout; + timer->start(); +} + +Watchdog::~Watchdog() { + if (timer) { + timer->stop(); + } +} + +void Watchdog::handleTimerTick() { + if (Sluift::globals.interruptRequested || remainingTime == 0) { + timedOut = true; + } + else { + int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; + if (nextTimeout != INTERVAL_MS) { + timer->onTick.disconnect(boost::bind(&Watchdog::handleTimerTick, this)); + timer = timerFactory->createTimer(nextTimeout); + timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); + } + remainingTime -= nextTimeout; + timer->start(); + } +} |