9#ifndef INCLUDED_BSLMT_READERWRITERMUTEXIMPL
10#define INCLUDED_BSLMT_READERWRITERMUTEXIMPL
77#include <bslscm_version.h>
93template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
100 = 0x0fffffff00000000LL;
102 = 0x0000000100000000LL;
106 bsls::AtomicOperations::AtomicTypes::Int64 d_state;
114 SEMAPHORE d_semaphore;
216template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
220 ATOMIC_OP::initInt64(&d_state);
224template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
237 if (state & (k_WRITER | k_PENDING_WRITER_MASK)) {
239 ATOMIC_OP::addInt64AcqRel(&d_state, k_READER_INC);
245 state = ATOMIC_OP::testAndSwapInt64AcqRel(&d_state,
247 state + k_READER_INC);
248 }
while (state != expState);
251template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
258 ATOMIC_OP::addInt64AcqRel(&d_state, k_PENDING_WRITER_INC);
260 if (ATOMIC_OP::addInt64NvAcqRel(&d_state,
261 k_WRITER - k_PENDING_WRITER_INC)
275template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
286 if (0 == (state & (k_WRITER | k_PENDING_WRITER_MASK))) {
287 if (state == ATOMIC_OP::testAndSwapInt64AcqRel(&d_state,
289 state + k_READER_INC)) {
298 if (0 == d_mutex.tryLock()) {
299 ATOMIC_OP::addInt64AcqRel(&d_state, k_READER_INC);
306template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
313 if (0 == d_mutex.tryLock()) {
316 if (0 == (state & k_READER_MASK)) {
320 ATOMIC_OP::addInt64AcqRel(&d_state, k_WRITER);
329template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
340 if (ATOMIC_OP::getInt64Acquire(&d_state) & k_READER_MASK) {
348template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
362 if (0 == (state & k_READER_MASK) && (state & k_WRITER)) {
367template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
374 ATOMIC_OP::addInt64AcqRel(&d_state, -k_WRITER);
379template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
384 return (state & k_READER_MASK) || (k_WRITER == (state & k_WRITER));
387template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
392 return state & k_READER_MASK;
395template <
class ATOMIC_OP,
class MUTEX,
class SEMAPHORE>
400 return k_WRITER == (state & k_WRITER);
Definition bslmt_readerwritermuteximpl.h:94
bool isLockedRead() const
Definition bslmt_readerwritermuteximpl.h:389
void lockRead()
Definition bslmt_readerwritermuteximpl.h:226
bool isLockedWrite() const
Definition bslmt_readerwritermuteximpl.h:397
void unlock()
Definition bslmt_readerwritermuteximpl.h:331
void unlockRead()
Definition bslmt_readerwritermuteximpl.h:350
void unlockWrite()
Definition bslmt_readerwritermuteximpl.h:369
ReaderWriterMutexImpl()
Construct a reader/writer lock initialized to an unlocked state.
Definition bslmt_readerwritermuteximpl.h:218
int tryLockRead()
Definition bslmt_readerwritermuteximpl.h:277
~ReaderWriterMutexImpl()
Destroy this object.
void lockWrite()
Definition bslmt_readerwritermuteximpl.h:253
bool isLocked() const
Definition bslmt_readerwritermuteximpl.h:381
int tryLockWrite()
Definition bslmt_readerwritermuteximpl.h:308
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bslmt_barrier.h:344
long long Int64
Definition bsls_types.h:134