summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorZeroC Staff <git@zeroc.com>2007-12-18 12:43:45 -0500
committerZeroC Staff <git@zeroc.com>2007-12-18 12:43:45 -0500
commit41b6ef772bdf2fa6724cfbf2d71acdb866140eac (patch)
tree33284f1fee522dac6f463034ae52d56ac97114db /cpp/src
parentchanging version of Berkeley DB (diff)
downloadice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.tar.bz2
ice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.tar.xz
ice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.zip
Fixed bug #2277
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceUtil/Cond.cpp9
-rw-r--r--cpp/src/IceUtil/ThreadException.cpp34
2 files changed, 41 insertions, 2 deletions
diff --git a/cpp/src/IceUtil/Cond.cpp b/cpp/src/IceUtil/Cond.cpp
index f1c24099eb8..d1c00138839 100644
--- a/cpp/src/IceUtil/Cond.cpp
+++ b/cpp/src/IceUtil/Cond.cpp
@@ -42,7 +42,13 @@ IceUtil::Semaphore::wait() const
bool
IceUtil::Semaphore::timedWait(const Time& timeout) const
{
- int rc = WaitForSingleObject(_sem, static_cast<long>(timeout.toMilliSeconds()));
+ Int64 msTimeout = timeout.toMilliSeconds();
+ if(msTimeout < 0 || msTimeout > 0x7FFFFFFF)
+ {
+ throw InvalidTimeoutException(__FILE__, __LINE__, timeout);
+ }
+
+ int rc = WaitForSingleObject(_sem, static_cast<DWORD>(msTimeout));
if(rc != WAIT_TIMEOUT && rc != WAIT_OBJECT_0)
{
throw ThreadSyscallException(__FILE__, __LINE__, GetLastError());
@@ -50,7 +56,6 @@ IceUtil::Semaphore::timedWait(const Time& timeout) const
return rc != WAIT_TIMEOUT;
}
-
void
IceUtil::Semaphore::post(int count) const
{
diff --git a/cpp/src/IceUtil/ThreadException.cpp b/cpp/src/IceUtil/ThreadException.cpp
index 4f474723feb..7a17a98185e 100644
--- a/cpp/src/IceUtil/ThreadException.cpp
+++ b/cpp/src/IceUtil/ThreadException.cpp
@@ -180,3 +180,37 @@ IceUtil::BadThreadControlException::ice_throw() const
{
throw *this;
}
+
+IceUtil::InvalidTimeoutException::InvalidTimeoutException(const char* file, int line,
+ const IceUtil::Time& timeout) :
+ Exception(file, line),
+ _timeout(timeout)
+{
+}
+
+const char* IceUtil::InvalidTimeoutException::_name = "IceUtil::InvalidTimeoutException";
+
+string
+IceUtil::InvalidTimeoutException::ice_name() const
+{
+ return _name;
+}
+
+void
+IceUtil::InvalidTimeoutException::ice_print(ostream& os) const
+{
+ Exception::ice_print(os);
+ os << ":\ninvalid timeout: " << _timeout << " seconds";
+}
+
+IceUtil::Exception*
+IceUtil::InvalidTimeoutException::ice_clone() const
+{
+ return new InvalidTimeoutException(*this);
+}
+
+void
+IceUtil::InvalidTimeoutException::ice_throw() const
+{
+ throw *this;
+}