summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/RWRecMutex.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2003-05-16 01:23:41 +0000
committerBernard Normier <bernard@zeroc.com>2003-05-16 01:23:41 +0000
commitcc09afcf9b253e361af24cfaba1da025742d6335 (patch)
tree922a544d3c70685a76ecb31d1e87beadd85f43d3 /cpp/src/IceUtil/RWRecMutex.cpp
parentOpteron port (diff)
downloadice-cc09afcf9b253e361af24cfaba1da025742d6335.tar.bz2
ice-cc09afcf9b253e361af24cfaba1da025742d6335.tar.xz
ice-cc09afcf9b253e361af24cfaba1da025742d6335.zip
all timed function now return false on timeout instead of raising an
exception
Diffstat (limited to 'cpp/src/IceUtil/RWRecMutex.cpp')
-rw-r--r--cpp/src/IceUtil/RWRecMutex.cpp53
1 files changed, 28 insertions, 25 deletions
diff --git a/cpp/src/IceUtil/RWRecMutex.cpp b/cpp/src/IceUtil/RWRecMutex.cpp
index 5a98ae9036d..5a8bea627b4 100644
--- a/cpp/src/IceUtil/RWRecMutex.cpp
+++ b/cpp/src/IceUtil/RWRecMutex.cpp
@@ -62,7 +62,7 @@ IceUtil::RWRecMutex::tryReadlock() const
}
bool
-IceUtil::RWRecMutex::timedTryReadlock(const Time& timeout) const
+IceUtil::RWRecMutex::timedReadlock(const Time& timeout) const
{
Mutex::Lock lock(_mutex);
@@ -76,7 +76,10 @@ IceUtil::RWRecMutex::timedTryReadlock(const Time& timeout) const
Time remainder = end - Time::now();
if(remainder > Time())
{
- _readers.timedWait(lock, remainder);
+ if(_readers.timedWait(lock, remainder) == false)
+ {
+ return false;
+ }
}
else
{
@@ -161,7 +164,7 @@ IceUtil::RWRecMutex::tryWritelock() const
}
bool
-IceUtil::RWRecMutex::timedTryWritelock(const Time& timeout) const
+IceUtil::RWRecMutex::timedWritelock(const Time& timeout) const
{
Mutex::Lock lock(_mutex);
@@ -187,14 +190,18 @@ IceUtil::RWRecMutex::timedTryWritelock(const Time& timeout) const
_waitingWriters++;
try
{
- _writers.timedWait(lock, remainder);
+ bool result = _writers.timedWait(lock, remainder);
+ _waitingWriters--;
+ if(result == false)
+ {
+ return false;
+ }
}
catch(...)
{
--_waitingWriters;
throw;
}
- _waitingWriters--;
}
else
{
@@ -284,16 +291,14 @@ IceUtil::RWRecMutex::upgrade() const
{
Mutex::Lock lock(_mutex);
- //
- // Reader called unlock
+ // Reader owns at least one count
//
assert(_count > 0);
- --_count;
-
+
//
// Wait to acquire the write lock.
//
- while(_count != 0)
+ while(_count != 1)
{
_waitingWriters++;
try
@@ -305,9 +310,7 @@ IceUtil::RWRecMutex::upgrade() const
--_waitingWriters;
throw;
}
- _waitingWriters--;
-
-
+ _waitingWriters--;
}
//
@@ -317,22 +320,20 @@ IceUtil::RWRecMutex::upgrade() const
_writerId = ThreadControl().id();
}
-void
+bool
IceUtil::RWRecMutex::timedUpgrade(const Time& timeout) const
{
Mutex::Lock lock(_mutex);
- //
- // Reader called unlock
+ // Reader owns at least one count
//
assert(_count > 0);
- --_count;
//
// Wait to acquire the write lock.
//
Time end = Time::now() + timeout;
- while(_count != 0)
+ while(_count != 1)
{
Time remainder = end - Time::now();
if(remainder > Time())
@@ -340,23 +341,24 @@ IceUtil::RWRecMutex::timedUpgrade(const Time& timeout) const
_waitingWriters++;
try
{
- _writers.timedWait(lock, remainder);
+ bool result = _writers.timedWait(lock, remainder);
+ _waitingWriters--;
+ if(result == false)
+ {
+ return false;
+ }
}
catch(...)
{
--_waitingWriters;
throw;
}
- _waitingWriters--;
}
else
{
//
- // If a timeout occurred then the lock wasn't acquired. Ensure
- // that the _count is increased again before returning.
- //
- ++_count;
- throw ThreadLockedException(__FILE__, __LINE__);
+ // If a timeout occurred then the lock wasn't acquired
+ return false;
}
}
@@ -365,4 +367,5 @@ IceUtil::RWRecMutex::timedUpgrade(const Time& timeout) const
//
_count = -1;
_writerId = ThreadControl().id();
+ return true;
}