diff options
author | Benoit Foucher <benoit@zeroc.com> | 2011-04-06 09:54:35 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2011-04-06 09:54:35 +0200 |
commit | 132e5337980ce8c3b1828c41c119d32d4688ebb6 (patch) | |
tree | 9f28848696a6ee7ef1dbb44601428c3d9565672c /cpp/src | |
parent | Fixed bug 3683 - Added check for overflows when delay is too large (diff) | |
download | ice-132e5337980ce8c3b1828c41c119d32d4688ebb6.tar.bz2 ice-132e5337980ce8c3b1828c41c119d32d4688ebb6.tar.xz ice-132e5337980ce8c3b1828c41c119d32d4688ebb6.zip |
Fixed bug 4902 - Large delays can cause Timer::run() to exit
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IceUtil/Timer.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp index 31a6884b75a..8d03e91d8ea 100644 --- a/cpp/src/IceUtil/Timer.cpp +++ b/cpp/src/IceUtil/Timer.cpp @@ -190,7 +190,26 @@ Timer::run() } _wakeUpTime = first.scheduledTime; - _monitor.timedWait(first.scheduledTime - now); + try + { + _monitor.timedWait(first.scheduledTime - now); + } + catch(const IceUtil::InvalidTimeoutException&) + { + IceUtil::Time timeout = (first.scheduledTime - now) / 2; + while(timeout > IceUtil::Time()) + { + try + { + _monitor.timedWait(timeout); + break; + } + catch(const IceUtil::InvalidTimeoutException&) + { + timeout = timeout / 2; + } + } + } } if(_destroyed) |