Zero  0.1.0
lock_lil.h
Go to the documentation of this file.
1 /*
2  * (c) Copyright 2011-2013, Hewlett-Packard Development Company, LP
3  */
4 
5 #ifndef __LOCK_LIL_H
6 #define __LOCK_LIL_H
7 
19 #include "w_defines.h"
20 
21 #include <cstring> // for memset
22 #include "w_rc.h"
23 #include "latches.h"
24 #include "stnode_page.h" // only for stnode_page::max
25 #include "vol.h"
26 
28 const uint16_t MAX_VOL_GLOBAL = 1;
29 
31 const uint16_t MAX_VOL_PER_XCT = 4;
32 
34 const uint16_t MAX_STORE_PER_VOL_XCT = 16;
35 
37  LIL_IS = 0,
38  LIL_IX = 1,
39  LIL_S = 2,
40  LIL_X = 3,
42 };
43 
44 // All objects here are okay to initialize by memset(0).
45 
59 public:
60  uint16_t _IS_count; // +2 -> 2
61  uint16_t _IX_count; // +2 -> 4
62  uint16_t _S_count; // +2 -> 6
63  bool _X_taken; // +1 -> 7
64  bool _dummy1; // +1 -> 8
65  uint16_t _waiting_S; // +2 -> 10
66  uint16_t _waiting_X; // +2 -> 12
67  uint32_t _release_version; // +4 -> 16
68  lsn_t _x_lock_tag; // +8 -> 24. this is for Safe SX-ELR
69  pthread_mutex_t _waiter_mutex;
70 
71  pthread_cond_t _waiter_cond;
72 
74  // queue_based_lock_t _spin_lock;
75  // srwlock_t _spin_lock;
77  // mmm, scalability and overhead is the trade-off here.
78 
84 
89  void release_locks(bool* lock_taken, bool read_lock_only = false, lsn_t commit_lsn = lsn_t::null);
90 
91 private:
92  w_rc_t _request_lock_IS(lsn_t& observed_tag);
93 
94  w_rc_t _request_lock_IX(lsn_t& observed_tag);
95 
96  w_rc_t _request_lock_S(lsn_t& observed_tag);
97 
98  w_rc_t _request_lock_X(lsn_t& observed_tag);
99 
101  bool _cond_timedwait(uint32_t base_version, uint32_t timeout_microsec);
102 };
103 
109 public:
111 
113 };
114 
120 public:
121  lil_global_store_table _store_tables[stnode_page::max]; // for all possible stores
122 
124  ::memset(this, 0, sizeof(*this));
125  ::pthread_mutex_init(&_waiter_mutex, nullptr);
126  ::pthread_cond_init(&_waiter_cond, nullptr);
127  for (size_t i = 0; i < stnode_page::max; ++i) {
128  ::pthread_mutex_init(&(_store_tables[i]._waiter_mutex), nullptr);
129  ::pthread_cond_init(&(_store_tables[i]._waiter_cond), nullptr);
130  }
131  }
132 
134  ::pthread_mutex_destroy(&_waiter_mutex);
135  ::pthread_cond_destroy(&_waiter_cond);
136  for (size_t i = 0; i < stnode_page::max; ++i) {
137  ::pthread_mutex_destroy(&(_store_tables[i]._waiter_mutex));
138  ::pthread_cond_destroy(&(_store_tables[i]._waiter_cond));
139  }
140  }
141 };
142 
148 public:
150 
152  clear();
153  }
154 
156 
157  void clear() {
158  ::memset(this, 0, sizeof(*this));
159  }
160 };
161 
167 public:
168  uint32_t _store; // +4 -> 4. zero if this table is not used yet.
169  bool _lock_taken[LIL_MODES]; // +4 -> 8
170 
172  clear();
173  }
174 
176 
177  void clear() {
178  ::memset(this, 0, sizeof(*this));
179  }
180 };
181 
187 public:
188  uint16_t _vid; // +2 -> 2. zero if this table is not used yet.
189  uint16_t _stores; // +2 -> 4. number of stores used in _store_tables
190  bool _lock_taken[LIL_MODES]; // +4 -> 8
191 
192  lil_private_store_table _store_tables[MAX_STORE_PER_VOL_XCT]; // 8 * MAX_STORE_PER_VOL_XCT
193 
195  clear();
196  }
197 
199 
200  void clear() {
201  ::memset(this, 0, sizeof(*this));
202  }
203 
210  w_rc_t acquire_store_lock(lil_global_table* global_table, const StoreID& stid,
211  lil_lock_modes_t mode);
212 
217  void release_vol_locks(lil_global_table* global_table, bool read_lock_only = false, lsn_t commit_lsn = lsn_t::null);
218 
219 private:
220  lil_private_store_table* _find_store_table(uint32_t store);
221 };
222 
228 public:
229  uint16_t _volumes; // +2 -> 2. number of volumes used in _vol_tables
230  uint16_t _unused1; // +2 -> 4
231  uint32_t _unused2; // +4 -> 8
232 
234 
236  clear();
237  }
238 
240 
241  void clear() {
242  ::memset(this, 0, sizeof(*this));
243  }
244 
252  w_rc_t acquire_vol_table(lil_global_table* global_table, uint16_t vid,
254 
258  w_rc_t get_vol_table_nolock(lil_global_table* global_table, uint16_t vid,
259  lil_private_vol_table*& table);
260 
264  w_rc_t acquire_vol_store_lock(lil_global_table* global_table, const StoreID& stid,
265  lil_lock_modes_t mode);
266 
272  void release_all_locks(lil_global_table* global_table, bool read_lock_only = false, lsn_t commit_lsn = lsn_t::null);
273 
277  lil_private_vol_table* find_vol_table(uint16_t vid);
278 };
279 
280 #endif // __LOCK_LIL_H
uint16_t _vid
Definition: lock_lil.h:188
Definition: lock_lil.h:37
Definition: lock_lil.h:108
uint16_t _IS_count
Definition: lock_lil.h:60
static constexpr size_t max
Definition: stnode_page.h:64
Definition: lock_lil.h:147
~lil_global_store_table()
Definition: lock_lil.h:112
pthread_cond_t _waiter_cond
Definition: lock_lil.h:71
w_rc_t _request_lock_S(lsn_t &observed_tag)
Definition: lock_lil.cpp:213
w_rc_t _request_lock_IS(lsn_t &observed_tag)
Definition: lock_lil.cpp:157
Definition: lock_lil.h:40
bool _X_taken
Definition: lock_lil.h:63
~lil_private_table()
Definition: lock_lil.h:239
void clear()
Definition: lock_lil.h:241
Definition: lock_lil.h:39
void clear()
Definition: lock_lil.h:200
uint32_t StoreID
Definition: basics.h:47
const uint16_t MAX_STORE_PER_VOL_XCT
Definition: lock_lil.h:34
uint16_t _waiting_S
Definition: lock_lil.h:65
lil_private_store_table()
Definition: lock_lil.h:171
bool _cond_timedwait(uint32_t base_version, uint32_t timeout_microsec)
Definition: lock_lil.cpp:98
uint16_t _waiting_X
Definition: lock_lil.h:66
static const lsn_t null
Definition: lsn.h:371
lil_global_vol_table()
Definition: lock_lil.h:123
Definition: lock_lil.h:119
lsn_t _x_lock_tag
Definition: lock_lil.h:68
w_rc_t request_lock(lil_lock_modes_t mode)
Definition: lock_lil.cpp:24
w_rc_t _request_lock_IX(lsn_t &observed_tag)
Definition: lock_lil.cpp:185
pthread_mutex_t _waiter_mutex
Definition: lock_lil.h:69
uint16_t _IX_count
Definition: lock_lil.h:61
void release_locks(bool *lock_taken, bool read_lock_only=false, lsn_t commit_lsn=lsn_t::null)
Definition: lock_lil.cpp:47
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
Definition: lock_lil.h:38
uint16_t _stores
Definition: lock_lil.h:189
uint32_t _unused2
Definition: lock_lil.h:231
void clear()
Definition: lock_lil.h:177
Definition: lock_lil.h:41
Return code for most functions and methods.
Definition: w_rc.h:87
uint16_t _volumes
Definition: lock_lil.h:229
LIL private lock table to remember all locks in xct.
Definition: lock_lil.h:227
~lil_private_vol_table()
Definition: lock_lil.h:198
uint32_t _store
Definition: lock_lil.h:168
LIL private lock table to remember Store locks taken by current xct.
Definition: lock_lil.h:166
tatas_lock _spin_lock
Definition: lock_lil.h:76
~lil_global_table()
Definition: lock_lil.h:155
A test-and-test-and-set spinlock.
Definition: tatas.h:25
~lil_private_store_table()
Definition: lock_lil.h:175
lil_lock_modes_t
Definition: lock_lil.h:36
LIL global lock table to protect Volume/Store from concurrent accesses.
Definition: lock_lil.h:58
uint16_t _S_count
Definition: lock_lil.h:62
~lil_global_vol_table()
Definition: lock_lil.h:133
const uint16_t MAX_VOL_GLOBAL
Definition: lock_lil.h:28
void clear()
Definition: lock_lil.h:157
w_rc_t _request_lock_X(lsn_t &observed_tag)
Definition: lock_lil.cpp:247
uint16_t _unused1
Definition: lock_lil.h:230
lil_global_table()
Definition: lock_lil.h:151
lil_private_table()
Definition: lock_lil.h:235
const uint16_t MAX_VOL_PER_XCT
Definition: lock_lil.h:31
uint32_t _release_version
Definition: lock_lil.h:67
bool _dummy1
Definition: lock_lil.h:64
lil_private_vol_table()
Definition: lock_lil.h:194
LIL private lock table to remember Volume locks and Stores in it.
Definition: lock_lil.h:186
lil_global_store_table()
Definition: lock_lil.h:110