version 1.8.2.1, 2008/08/20 23:05:50
|
version 1.10, 2008/08/21 17:51:31
|
|
|
| |
void ReadWriteSem::_unlock(Boolean writeLock, ThreadType caller) | void ReadWriteSem::_unlock(Boolean writeLock, ThreadType caller) |
{ | { |
ThreadType owner; |
|
|
|
if (writeLock) | if (writeLock) |
{ | { |
owner = _rwlock.owner; |
|
Threads::clear(_rwlock.owner); | Threads::clear(_rwlock.owner); |
|
PEGASUS_ASSERT(_writers.get() == 1); |
|
_writers = 0; |
} | } |
if (0 != pthread_rwlock_unlock(&_rwlock.rwlock)) |
else |
{ | { |
_rwlock.owner = owner; |
PEGASUS_ASSERT(_readers.get() > 0); |
throw(Permission(Threads::self())); |
|
} |
|
if (!writeLock && _readers.get() != 0) |
|
_readers--; | _readers--; |
else if (_writers.get() != 0) |
} |
_writers--; |
|
|
int rc = pthread_rwlock_unlock(&_rwlock.rwlock); |
|
// All documented error codes represent coding errors. |
|
PEGASUS_ASSERT(rc == 0); |
} | } |
| |
int ReadWriteSem::read_count() const | int ReadWriteSem::read_count() const |
|
|
| |
void ReadWriteSem::_unlock(Boolean writeLock, ThreadType caller) | void ReadWriteSem::_unlock(Boolean writeLock, ThreadType caller) |
{ | { |
if (writeLock && _writers.get() != 0) |
if (writeLock) |
{ | { |
|
PEGASUS_ASSERT(_writers.get() == 1); |
_writers = 0; | _writers = 0; |
_rwlock._wlock.unlock(); | _rwlock._wlock.unlock(); |
} | } |
else if (_readers.get() != 0) |
else |
{ | { |
|
PEGASUS_ASSERT(_readers.get() > 0); |
_readers--; | _readers--; |
_rwlock._rlock.signal(); | _rwlock._rlock.signal(); |
} | } |