LockFileBase.cpp revision 321369
1285101Semaste//===-- LockFileBase.cpp ----------------------------------------*- C++ -*-===//
2285101Semaste//
3285101Semaste//                     The LLVM Compiler Infrastructure
4285101Semaste//
5285101Semaste// This file is distributed under the University of Illinois Open Source
6285101Semaste// License. See LICENSE.TXT for details.
7285101Semaste//
8285101Semaste//===----------------------------------------------------------------------===//
9285101Semaste
10285101Semaste#include "lldb/Host/LockFileBase.h"
11285101Semaste
12285101Semasteusing namespace lldb;
13285101Semasteusing namespace lldb_private;
14285101Semaste
15314564Sdimnamespace {
16285101Semaste
17321369SdimStatus AlreadyLocked() { return Status("Already locked"); }
18285101Semaste
19321369SdimStatus NotLocked() { return Status("Not locked"); }
20285101Semaste}
21285101Semaste
22314564SdimLockFileBase::LockFileBase(int fd)
23314564Sdim    : m_fd(fd), m_locked(false), m_start(0), m_len(0) {}
24285101Semaste
25314564Sdimbool LockFileBase::IsLocked() const { return m_locked; }
26285101Semaste
27321369SdimStatus LockFileBase::WriteLock(const uint64_t start, const uint64_t len) {
28314564Sdim  return DoLock([&](const uint64_t start,
29314564Sdim                    const uint64_t len) { return DoWriteLock(start, len); },
30314564Sdim                start, len);
31285101Semaste}
32285101Semaste
33321369SdimStatus LockFileBase::TryWriteLock(const uint64_t start, const uint64_t len) {
34314564Sdim  return DoLock([&](const uint64_t start,
35314564Sdim                    const uint64_t len) { return DoTryWriteLock(start, len); },
36314564Sdim                start, len);
37285101Semaste}
38285101Semaste
39321369SdimStatus LockFileBase::ReadLock(const uint64_t start, const uint64_t len) {
40314564Sdim  return DoLock([&](const uint64_t start,
41314564Sdim                    const uint64_t len) { return DoReadLock(start, len); },
42314564Sdim                start, len);
43285101Semaste}
44285101Semaste
45321369SdimStatus LockFileBase::TryReadLock(const uint64_t start, const uint64_t len) {
46314564Sdim  return DoLock([&](const uint64_t start,
47314564Sdim                    const uint64_t len) { return DoTryReadLock(start, len); },
48314564Sdim                start, len);
49285101Semaste}
50285101Semaste
51321369SdimStatus LockFileBase::Unlock() {
52314564Sdim  if (!IsLocked())
53314564Sdim    return NotLocked();
54285101Semaste
55314564Sdim  const auto error = DoUnlock();
56314564Sdim  if (error.Success()) {
57314564Sdim    m_locked = false;
58314564Sdim    m_start = 0;
59314564Sdim    m_len = 0;
60314564Sdim  }
61314564Sdim  return error;
62285101Semaste}
63285101Semaste
64314564Sdimbool LockFileBase::IsValidFile() const { return m_fd != -1; }
65285101Semaste
66321369SdimStatus LockFileBase::DoLock(const Locker &locker, const uint64_t start,
67321369Sdim                            const uint64_t len) {
68314564Sdim  if (!IsValidFile())
69321369Sdim    return Status("File is invalid");
70285101Semaste
71314564Sdim  if (IsLocked())
72314564Sdim    return AlreadyLocked();
73285101Semaste
74314564Sdim  const auto error = locker(start, len);
75314564Sdim  if (error.Success()) {
76314564Sdim    m_locked = true;
77314564Sdim    m_start = start;
78314564Sdim    m_len = len;
79314564Sdim  }
80285101Semaste
81314564Sdim  return error;
82285101Semaste}
83