blob: d405a6b33bb2eb44a338df3551d2407b10de7c33 (
plain)
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
61
62
63
64
65
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/
#ifndef CEPH_LOCALLOCK_H
#define CEPH_LOCALLOCK_H
#include "SimpleLock.h"
class LocalLock : public SimpleLock {
public:
client_t last_wrlock_client;
LocalLock(MDSCacheObject *o, LockType *t) :
SimpleLock(o, t) {
set_state(LOCK_LOCK); // always.
}
bool is_locallock() const override {
return true;
}
bool can_xlock_local() const {
return !is_wrlocked() && (get_xlock_by() == MutationRef());
}
bool can_wrlock() const {
return !is_xlocked();
}
void get_wrlock(client_t client) {
ceph_assert(can_wrlock());
SimpleLock::get_wrlock();
last_wrlock_client = client;
}
void put_wrlock() {
SimpleLock::put_wrlock();
if (get_num_wrlocks() == 0)
last_wrlock_client = client_t();
}
client_t get_last_wrlock_client() const {
return last_wrlock_client;
}
void print(ostream& out) const override {
out << "(";
_print(out);
if (last_wrlock_client >= 0)
out << " last_client=" << last_wrlock_client;
out << ")";
}
};
#endif
|