summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/Cond.cpp
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2002-04-22 22:16:29 +0000
committerMatthew Newhook <matthew@zeroc.com>2002-04-22 22:16:29 +0000
commitb3926429557017367ad4c92d8fd42f17786e8c61 (patch)
tree38fc04618f3a8d0e280ac6da0b1f863677e3d012 /cpp/src/IceUtil/Cond.cpp
parentAdded IceUtil/Time.h (diff)
downloadice-b3926429557017367ad4c92d8fd42f17786e8c61.tar.bz2
ice-b3926429557017367ad4c92d8fd42f17786e8c61.tar.xz
ice-b3926429557017367ad4c92d8fd42f17786e8c61.zip
time updates.
Diffstat (limited to 'cpp/src/IceUtil/Cond.cpp')
-rw-r--r--cpp/src/IceUtil/Cond.cpp67
1 files changed, 31 insertions, 36 deletions
diff --git a/cpp/src/IceUtil/Cond.cpp b/cpp/src/IceUtil/Cond.cpp
index c08559d8d28..867d153224c 100644
--- a/cpp/src/IceUtil/Cond.cpp
+++ b/cpp/src/IceUtil/Cond.cpp
@@ -30,14 +30,23 @@ IceUtil::Semaphore::~Semaphore()
CloseHandle(_sem);
}
-bool
-IceUtil::Semaphore::wait(long timeout) const
+void
+IceUtil::Semaphore::wait() const
{
- if (timeout < 0)
+ int rc = WaitForSingleObject(_sem, INFINITE);
+ if (rc != WAIT_OBJECT_0)
{
- timeout = INFINITE;
+ throw SyscallException(SyscallException::errorToString(GetLastError()), __FILE__, __LINE__);
}
- int rc = WaitForSingleObject(_sem, timeout);
+}
+
+bool
+IceUtil::Semaphore::timedWait(const Time& timeout) const
+{
+ timeval tv = timeout;
+ long msec = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+
+ int rc = WaitForSingleObject(_sem, msec);
if (rc != WAIT_TIMEOUT && rc != WAIT_OBJECT_0)
{
throw SyscallException(SyscallException::errorToString(GetLastError()), __FILE__, __LINE__);
@@ -152,12 +161,27 @@ IceUtil::Cond::postWait(bool timedOut) const
}
}
+void
+IceUtil::Cond::dowait() const
+{
+ try
+ {
+ _queue.wait();
+ postWait(false);
+ }
+ catch(...)
+ {
+ postWait(false);
+ throw;
+ }
+}
+
bool
-IceUtil::Cond::dowait(long timeout) const
+IceUtil::Cond::timedDowait(const Time& timeout) const
{
try
{
- bool rc = _queue.wait(timeout);
+ bool rc = _queue.timedWait(timeout);
postWait(!rc);
return rc;
}
@@ -206,33 +230,4 @@ IceUtil::Cond::broadcast()
}
}
-namespace IceUtil
-{
-
-struct timespec
-msecToTimespec(
- long timeout
-)
-{
- assert(timeout >= 0);
- struct timeval tv;
- gettimeofday(&tv, 0);
- // 123456789 - 10^9
- const long oneBillion = 1000000000;
-
- struct timespec abstime;
-
- abstime.tv_sec = tv.tv_sec + (timeout/1000);
- abstime.tv_nsec = (tv.tv_usec * 1000) + ((timeout%1000) * 1000000);
- if (abstime.tv_nsec > oneBillion)
- {
- ++abstime.tv_sec;
- abstime.tv_nsec -= oneBillion;
- }
-
- return abstime;
-}
-
-} // End namespace IceUtil
-
#endif