Zero  0.1.0
Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
mcs_rwlock Class Reference

Shore read-write lock:: many-reader/one-writer spin lock. More...

#include <latches.h>

Inheritance diagram for mcs_rwlock:
mcs_lock

Public Types

enum  rwmode_t { NONE = 0, WRITER = 0x1, READER = 0x2 }
 

Public Member Functions

 mcs_rwlock ()
 
 ~mcs_rwlock ()
 
rwmode_t mode () const
 Return the mode in which this lock is held by anyone. More...
 
bool is_locked () const
 True if locked in any mode. More...
 
int num_holders () const
 1 if held in write mode, else it's the number of readers More...
 
bool has_reader () const
 True iff has one or more readers. More...
 
bool has_writer () const
 True iff has a writer (never more than 1) More...
 
bool attempt_read ()
 True if success. More...
 
void acquire_read ()
 Wait (spin) until acquired. More...
 
void release_read ()
 This thread had better hold the lock in read mode. More...
 
bool attempt_write ()
 True if success. More...
 
void acquire_write ()
 Wait (spin) until acquired. More...
 
void release_write ()
 This thread had better hold the lock in write mode. More...
 
bool attempt_upgrade ()
 Try to upgrade from READ to WRITE mode. Fail if any other threads are waiting. More...
 
void downgrade ()
 Atomically downgrade the lock from WRITE to READ mode. More...
 

Private Types

typedef queue_based_lock_t parent_lock
 

Private Member Functions

int _spin_on_writer ()
 
void _spin_on_readers ()
 
bool _attempt_write (unsigned int expected)
 
void _add_when_writer_leaves (int delta)
 

Private Attributes

unsigned int volatile _holders
 

Additional Inherited Members

- Protected Member Functions inherited from mcs_lock
 mcs_lock ()
 
void spin_on_waiting (qnode *me)
 
bool attempt (ext_qnode *me)
 
bool attempt (qnode *me)
 
void * acquire (ext_qnode *me)
 
void * acquire (qnode *me)
 
qnode__unsafe_begin_acquire (qnode *me)
 
void * __unsafe_end_acquire (qnode *me, qnode *pred)
 
qnodespin_on_next (qnode *me)
 
void release (ext_qnode *me)
 
void release (ext_qnode &me)
 
void release (qnode &me)
 
void release (qnode *me)
 
bool is_mine (ext_qnode *me)
 
- Protected Attributes inherited from mcs_lock
qnode_tail
 

Detailed Description

Shore read-write lock:: many-reader/one-writer spin lock.

This read-write lock is implemented around a queue-based lock. It is the basis for latches in the storage manager.

Use this to protect data structures that get constantly hammered by short reads, and less frequently (but still often) by short writes.

"Short" is the key word here, since this is spin-based.

Member Typedef Documentation

§ parent_lock

Member Enumeration Documentation

§ rwmode_t

Enumerator
NONE 
WRITER 
READER 

Constructor & Destructor Documentation

§ mcs_rwlock()

mcs_rwlock::mcs_rwlock ( )
inline

§ ~mcs_rwlock()

mcs_rwlock::~mcs_rwlock ( )
inline

Member Function Documentation

§ _add_when_writer_leaves()

void mcs_rwlock::_add_when_writer_leaves ( int  delta)
private

§ _attempt_write()

bool mcs_rwlock::_attempt_write ( unsigned int  expected)
private

§ _spin_on_readers()

void mcs_rwlock::_spin_on_readers ( )
private

§ _spin_on_writer()

int mcs_rwlock::_spin_on_writer ( )
private

§ acquire_read()

void mcs_rwlock::acquire_read ( )

Wait (spin) until acquired.

§ acquire_write()

void mcs_rwlock::acquire_write ( )

Wait (spin) until acquired.

§ attempt_read()

bool mcs_rwlock::attempt_read ( )

True if success.

§ attempt_upgrade()

bool mcs_rwlock::attempt_upgrade ( )

Try to upgrade from READ to WRITE mode. Fail if any other threads are waiting.

§ attempt_write()

bool mcs_rwlock::attempt_write ( )

True if success.

§ downgrade()

void mcs_rwlock::downgrade ( )

Atomically downgrade the lock from WRITE to READ mode.

§ has_reader()

bool mcs_rwlock::has_reader ( ) const
inline

True iff has one or more readers.

§ has_writer()

bool mcs_rwlock::has_writer ( ) const
inline

True iff has a writer (never more than 1)

§ is_locked()

bool mcs_rwlock::is_locked ( ) const
inline

True if locked in any mode.

§ mode()

rwmode_t mcs_rwlock::mode ( ) const
inline

Return the mode in which this lock is held by anyone.

§ num_holders()

int mcs_rwlock::num_holders ( ) const
inline

1 if held in write mode, else it's the number of readers

§ release_read()

void mcs_rwlock::release_read ( )

This thread had better hold the lock in read mode.

§ release_write()

void mcs_rwlock::release_write ( )

This thread had better hold the lock in write mode.

Member Data Documentation

§ _holders

unsigned int volatile mcs_rwlock::_holders
private

The documentation for this class was generated from the following files: