Botan  2.15.0
Crypto and TLS for C++11
Public Member Functions | List of all members
Botan::RWLock Class Referencefinal

#include <rwlock.h>

Public Member Functions

void lock ()
 
void lock_shared ()
 
 RWLock ()
 
void unlock ()
 
void unlock_shared ()
 

Detailed Description

A read-write lock. Writers are favored.

Definition at line 19 of file rwlock.h.

Constructor & Destructor Documentation

◆ RWLock()

Botan::RWLock::RWLock ( )

Definition at line 11 of file rwlock.cpp.

11 : m_state(0) {}

Member Function Documentation

◆ lock()

void Botan::RWLock::lock ( )

Definition at line 13 of file rwlock.cpp.

Referenced by lock_shared(), unlock(), and unlock_shared().

14  {
15  std::unique_lock<std::mutex> lock(m_mutex);
16  while(m_state & is_writing)
17  m_gate1.wait(lock);
18  m_state |= is_writing;
19  while(m_state & readers_mask)
20  m_gate2.wait(lock);
21  }
void lock()
Definition: rwlock.cpp:13

◆ lock_shared()

void Botan::RWLock::lock_shared ( )

Definition at line 30 of file rwlock.cpp.

References lock().

31  {
32  std::unique_lock<std::mutex> lock(m_mutex);
33  while((m_state & is_writing) || (m_state & readers_mask) == readers_mask)
34  m_gate1.wait(lock);
35  const uint32_t num_readers = (m_state & readers_mask) + 1;
36  m_state &= ~readers_mask;
37  m_state |= num_readers;
38  }
void lock()
Definition: rwlock.cpp:13

◆ unlock()

void Botan::RWLock::unlock ( )

Definition at line 23 of file rwlock.cpp.

References lock().

24  {
25  std::unique_lock<std::mutex> lock(m_mutex);
26  m_state = 0;
27  m_gate1.notify_all();
28  }
void lock()
Definition: rwlock.cpp:13

◆ unlock_shared()

void Botan::RWLock::unlock_shared ( )

Definition at line 40 of file rwlock.cpp.

References lock().

41  {
42  std::unique_lock<std::mutex> lock(m_mutex);
43  const uint32_t num_readers = (m_state & readers_mask) - 1;
44  m_state &= ~readers_mask;
45  m_state |= num_readers;
46  if(m_state & is_writing)
47  {
48  if(num_readers == 0)
49  m_gate2.notify_one();
50  }
51  else
52  {
53  if(num_readers == readers_mask - 1)
54  m_gate1.notify_one();
55  }
56  }
void lock()
Definition: rwlock.cpp:13

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