diff options
author | ZeroC Staff <git@zeroc.com> | 2007-12-18 12:43:45 -0500 |
---|---|---|
committer | ZeroC Staff <git@zeroc.com> | 2007-12-18 12:43:45 -0500 |
commit | 41b6ef772bdf2fa6724cfbf2d71acdb866140eac (patch) | |
tree | 33284f1fee522dac6f463034ae52d56ac97114db /cpp | |
parent | changing version of Berkeley DB (diff) | |
download | ice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.tar.bz2 ice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.tar.xz ice-41b6ef772bdf2fa6724cfbf2d71acdb866140eac.zip |
Fixed bug #2277
Diffstat (limited to 'cpp')
-rwxr-xr-x | cpp/config/Make.rules.msvc | 2 | ||||
-rw-r--r-- | cpp/include/IceUtil/Cond.h | 5 | ||||
-rw-r--r-- | cpp/include/IceUtil/ThreadException.h | 17 | ||||
-rw-r--r-- | cpp/src/IceUtil/Cond.cpp | 9 | ||||
-rw-r--r-- | cpp/src/IceUtil/ThreadException.cpp | 34 | ||||
-rw-r--r-- | cpp/test/IceUtil/thread/MonitorMutexTest.cpp | 10 |
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))); } } |