1919ef9dcSOleksiy Vyalov //===-- LockFileBase.cpp ----------------------------------------*- C++ -*-===//
2919ef9dcSOleksiy Vyalov //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6919ef9dcSOleksiy Vyalov //
7919ef9dcSOleksiy Vyalov //===----------------------------------------------------------------------===//
8919ef9dcSOleksiy Vyalov 
9919ef9dcSOleksiy Vyalov #include "lldb/Host/LockFileBase.h"
10919ef9dcSOleksiy Vyalov 
11919ef9dcSOleksiy Vyalov using namespace lldb;
12919ef9dcSOleksiy Vyalov using namespace lldb_private;
13919ef9dcSOleksiy Vyalov 
14b9c1b51eSKate Stone namespace {
15919ef9dcSOleksiy Vyalov 
1697206d57SZachary Turner Status AlreadyLocked() { return Status("Already locked"); }
17b9c1b51eSKate Stone 
1897206d57SZachary Turner Status NotLocked() { return Status("Not locked"); }
19919ef9dcSOleksiy Vyalov }
20919ef9dcSOleksiy Vyalov 
21b9c1b51eSKate Stone LockFileBase::LockFileBase(int fd)
22b9c1b51eSKate Stone     : m_fd(fd), m_locked(false), m_start(0), m_len(0) {}
23b9c1b51eSKate Stone 
24b9c1b51eSKate Stone bool LockFileBase::IsLocked() const { return m_locked; }
25b9c1b51eSKate Stone 
2697206d57SZachary Turner Status LockFileBase::WriteLock(const uint64_t start, const uint64_t len) {
27b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
28b9c1b51eSKate Stone                     const uint64_t len) { return DoWriteLock(start, len); },
29b9c1b51eSKate Stone                 start, len);
30919ef9dcSOleksiy Vyalov }
31919ef9dcSOleksiy Vyalov 
3297206d57SZachary Turner Status LockFileBase::TryWriteLock(const uint64_t start, const uint64_t len) {
33b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
34b9c1b51eSKate Stone                     const uint64_t len) { return DoTryWriteLock(start, len); },
35b9c1b51eSKate Stone                 start, len);
36919ef9dcSOleksiy Vyalov }
37919ef9dcSOleksiy Vyalov 
3897206d57SZachary Turner Status LockFileBase::ReadLock(const uint64_t start, const uint64_t len) {
39b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
40b9c1b51eSKate Stone                     const uint64_t len) { return DoReadLock(start, len); },
41b9c1b51eSKate Stone                 start, len);
42919ef9dcSOleksiy Vyalov }
43919ef9dcSOleksiy Vyalov 
4497206d57SZachary Turner Status LockFileBase::TryReadLock(const uint64_t start, const uint64_t len) {
45b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
46b9c1b51eSKate Stone                     const uint64_t len) { return DoTryReadLock(start, len); },
47b9c1b51eSKate Stone                 start, len);
48919ef9dcSOleksiy Vyalov }
49919ef9dcSOleksiy Vyalov 
5097206d57SZachary Turner Status LockFileBase::Unlock() {
51919ef9dcSOleksiy Vyalov   if (!IsLocked())
52919ef9dcSOleksiy Vyalov     return NotLocked();
53919ef9dcSOleksiy Vyalov 
54919ef9dcSOleksiy Vyalov   const auto error = DoUnlock();
55b9c1b51eSKate Stone   if (error.Success()) {
56919ef9dcSOleksiy Vyalov     m_locked = false;
57919ef9dcSOleksiy Vyalov     m_start = 0;
58919ef9dcSOleksiy Vyalov     m_len = 0;
59919ef9dcSOleksiy Vyalov   }
60919ef9dcSOleksiy Vyalov   return error;
61919ef9dcSOleksiy Vyalov }
62919ef9dcSOleksiy Vyalov 
63b9c1b51eSKate Stone bool LockFileBase::IsValidFile() const { return m_fd != -1; }
64919ef9dcSOleksiy Vyalov 
6597206d57SZachary Turner Status LockFileBase::DoLock(const Locker &locker, const uint64_t start,
66b9c1b51eSKate Stone                             const uint64_t len) {
67919ef9dcSOleksiy Vyalov   if (!IsValidFile())
6897206d57SZachary Turner     return Status("File is invalid");
69919ef9dcSOleksiy Vyalov 
70919ef9dcSOleksiy Vyalov   if (IsLocked())
71919ef9dcSOleksiy Vyalov     return AlreadyLocked();
72919ef9dcSOleksiy Vyalov 
73919ef9dcSOleksiy Vyalov   const auto error = locker(start, len);
74b9c1b51eSKate Stone   if (error.Success()) {
75919ef9dcSOleksiy Vyalov     m_locked = true;
76919ef9dcSOleksiy Vyalov     m_start = start;
77919ef9dcSOleksiy Vyalov     m_len = len;
78919ef9dcSOleksiy Vyalov   }
79919ef9dcSOleksiy Vyalov 
80919ef9dcSOleksiy Vyalov   return error;
81919ef9dcSOleksiy Vyalov }
82