summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcpp/config/Make.rules.msvc2
-rw-r--r--cpp/include/IceUtil/Cond.h5
-rw-r--r--cpp/include/IceUtil/ThreadException.h17
-rw-r--r--cpp/src/IceUtil/Cond.cpp9
-rw-r--r--cpp/src/IceUtil/ThreadException.cpp34
-rw-r--r--cpp/test/IceUtil/thread/MonitorMutexTest.cpp10
6 files changed, 74 insertions, 3 deletions
diff --git a/cpp/config/Make.rules.msvc b/cpp/config/Make.rules.msvc
index 06006e8994b..17f9550f474 100755
--- a/cpp/config/Make.rules.msvc
+++ b/cpp/config/Make.rules.msvc
@@ -87,5 +87,5 @@ BASELIBS = iceutil$(LIBSUFFIX).lib $(ICE_OS_LIBS)
LIBS = ice$(LIBSUFFIX).lib $(BASELIBS)
BZIP2_LIBS = libbz2$(LIBSUFFIX).lib
-DB_LIBS = libdb46$(LIBSUFFIX).lib
+DB_LIBS = libdb45$(LIBSUFFIX).lib
ICONV_LIB = libiconv.lib
diff --git a/cpp/include/IceUtil/Cond.h b/cpp/include/IceUtil/Cond.h
index dde7d3082a0..954dd1dcd35 100644
--- a/cpp/include/IceUtil/Cond.h
+++ b/cpp/include/IceUtil/Cond.h
@@ -218,6 +218,11 @@ Cond::waitImpl(const M& mutex) const
template <typename M> inline bool
Cond::timedWaitImpl(const M& mutex, const Time& timeout) const
{
+ if(timeout < Time::microSeconds(0))
+ {
+ throw InvalidTimeoutException(__FILE__, __LINE__, timeout);
+ }
+
typedef typename M::LockState LockState;
LockState state;
diff --git a/cpp/include/IceUtil/ThreadException.h b/cpp/include/IceUtil/ThreadException.h
index ff4b85e30e4..cf6c6289c9a 100644
--- a/cpp/include/IceUtil/ThreadException.h
+++ b/cpp/include/IceUtil/ThreadException.h
@@ -11,6 +11,7 @@
#define ICE_UTIL_THREAD_EXCEPTION_H
#include <IceUtil/Exception.h>
+#include <IceUtil/Time.h>
namespace IceUtil
{
@@ -87,6 +88,22 @@ private:
static const char* _name;
};
+
+class ICE_UTIL_API InvalidTimeoutException : public Exception
+{
+public:
+
+ InvalidTimeoutException(const char*, int, const Time&);
+ virtual std::string ice_name() const;
+ virtual void ice_print(std::ostream&) const;
+ virtual Exception* ice_clone() const;
+ virtual void ice_throw() const;
+
+private:
+
+ Time _timeout;
+ static const char* _name;
+};
}
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;
+}
diff --git a/cpp/test/IceUtil/thread/MonitorMutexTest.cpp b/cpp/test/IceUtil/thread/MonitorMutexTest.cpp
index 6cfc32d2cd6..6ffd194f37f 100644
--- a/cpp/test/IceUtil/thread/MonitorMutexTest.cpp
+++ b/cpp/test/IceUtil/thread/MonitorMutexTest.cpp
@@ -181,6 +181,16 @@ MonitorMutexTest::run()
// TEST: timedWait
{
Monitor<Mutex>::Lock lock(monitor);
+
+ try
+ {
+ monitor.timedWait(Time::milliSeconds(-1));
+ test(false);
+ }
+ catch(const IceUtil::InvalidTimeoutException&)
+ {
+ }
+
test(!monitor.timedWait(Time::milliSeconds(500)));
}
}