summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2011-04-06 09:54:35 +0200
committerBenoit Foucher <benoit@zeroc.com>2011-04-06 09:54:35 +0200
commit132e5337980ce8c3b1828c41c119d32d4688ebb6 (patch)
tree9f28848696a6ee7ef1dbb44601428c3d9565672c /cpp/src
parentFixed bug 3683 - Added check for overflows when delay is too large (diff)
downloadice-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.cpp21
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)