-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy pathmulti_lock_holder.h
60 lines (53 loc) · 1.4 KB
/
multi_lock_holder.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
* Copyright 2015-Present Couchbase, Inc.
*
* Use of this software is governed by the Business Source License included
* in the file licenses/BSL-Couchbase.txt. As of the Change Date specified
* in that file, in accordance with the Business Source License, use of this
* software will be governed by the Apache License, Version 2.0, included in
* the file licenses/APL2.txt.
*/
#pragma once
#include "utility.h"
#include <mutex>
#include <vector>
/**
* RAII lock holder over multiple locks.
*/
class MultiLockHolder {
public:
/**
* Acquire a series of locks.
*
* @param m reference to a vector of locks
*/
explicit MultiLockHolder(std::vector<std::mutex>& m) : mutexes(m) {
lock();
}
~MultiLockHolder() {
unlock();
}
private:
/**
* Relock the series after having manually unlocked it.
*/
void lock() {
for (auto& m : mutexes) {
m.lock();
}
}
/**
* Manually unlock the series.
*/
void unlock() {
for (auto& m : mutexes) {
m.unlock();
}
}
std::vector<std::mutex>& mutexes;
DISALLOW_COPY_AND_ASSIGN(MultiLockHolder);
};
#define MultiLockHolder(x) \
static_assert(false, \
"MultiLockHolder: missing variable name for scoped lock.")