180814287SRaphael Isemann //===-- LockFileBase.cpp --------------------------------------------------===//
2919ef9dcSOleksiy Vyalov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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 
AlreadyLocked()14*93c1b3caSPavel Labath static Status AlreadyLocked() { return Status("Already locked"); }
15919ef9dcSOleksiy Vyalov 
NotLocked()16*93c1b3caSPavel Labath static Status NotLocked() { return Status("Not locked"); }
17919ef9dcSOleksiy Vyalov 
LockFileBase(int fd)18b9c1b51eSKate Stone LockFileBase::LockFileBase(int fd)
19b9c1b51eSKate Stone     : m_fd(fd), m_locked(false), m_start(0), m_len(0) {}
20b9c1b51eSKate Stone 
IsLocked() const21b9c1b51eSKate Stone bool LockFileBase::IsLocked() const { return m_locked; }
22b9c1b51eSKate Stone 
WriteLock(const uint64_t start,const uint64_t len)2397206d57SZachary Turner Status LockFileBase::WriteLock(const uint64_t start, const uint64_t len) {
24b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
25b9c1b51eSKate Stone                     const uint64_t len) { return DoWriteLock(start, len); },
26b9c1b51eSKate Stone                 start, len);
27919ef9dcSOleksiy Vyalov }
28919ef9dcSOleksiy Vyalov 
TryWriteLock(const uint64_t start,const uint64_t len)2997206d57SZachary Turner Status LockFileBase::TryWriteLock(const uint64_t start, const uint64_t len) {
30b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
31b9c1b51eSKate Stone                     const uint64_t len) { return DoTryWriteLock(start, len); },
32b9c1b51eSKate Stone                 start, len);
33919ef9dcSOleksiy Vyalov }
34919ef9dcSOleksiy Vyalov 
ReadLock(const uint64_t start,const uint64_t len)3597206d57SZachary Turner Status LockFileBase::ReadLock(const uint64_t start, const uint64_t len) {
36b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
37b9c1b51eSKate Stone                     const uint64_t len) { return DoReadLock(start, len); },
38b9c1b51eSKate Stone                 start, len);
39919ef9dcSOleksiy Vyalov }
40919ef9dcSOleksiy Vyalov 
TryReadLock(const uint64_t start,const uint64_t len)4197206d57SZachary Turner Status LockFileBase::TryReadLock(const uint64_t start, const uint64_t len) {
42b9c1b51eSKate Stone   return DoLock([&](const uint64_t start,
43b9c1b51eSKate Stone                     const uint64_t len) { return DoTryReadLock(start, len); },
44b9c1b51eSKate Stone                 start, len);
45919ef9dcSOleksiy Vyalov }
46919ef9dcSOleksiy Vyalov 
Unlock()4797206d57SZachary Turner Status LockFileBase::Unlock() {
48919ef9dcSOleksiy Vyalov   if (!IsLocked())
49919ef9dcSOleksiy Vyalov     return NotLocked();
50919ef9dcSOleksiy Vyalov 
51919ef9dcSOleksiy Vyalov   const auto error = DoUnlock();
52b9c1b51eSKate Stone   if (error.Success()) {
53919ef9dcSOleksiy Vyalov     m_locked = false;
54919ef9dcSOleksiy Vyalov     m_start = 0;
55919ef9dcSOleksiy Vyalov     m_len = 0;
56919ef9dcSOleksiy Vyalov   }
57919ef9dcSOleksiy Vyalov   return error;
58919ef9dcSOleksiy Vyalov }
59919ef9dcSOleksiy Vyalov 
IsValidFile() const60b9c1b51eSKate Stone bool LockFileBase::IsValidFile() const { return m_fd != -1; }
61919ef9dcSOleksiy Vyalov 
DoLock(const Locker & locker,const uint64_t start,const uint64_t len)6297206d57SZachary Turner Status LockFileBase::DoLock(const Locker &locker, const uint64_t start,
63b9c1b51eSKate Stone                             const uint64_t len) {
64919ef9dcSOleksiy Vyalov   if (!IsValidFile())
6597206d57SZachary Turner     return Status("File is invalid");
66919ef9dcSOleksiy Vyalov 
67919ef9dcSOleksiy Vyalov   if (IsLocked())
68919ef9dcSOleksiy Vyalov     return AlreadyLocked();
69919ef9dcSOleksiy Vyalov 
70919ef9dcSOleksiy Vyalov   const auto error = locker(start, len);
71b9c1b51eSKate Stone   if (error.Success()) {
72919ef9dcSOleksiy Vyalov     m_locked = true;
73919ef9dcSOleksiy Vyalov     m_start = start;
74919ef9dcSOleksiy Vyalov     m_len = len;
75919ef9dcSOleksiy Vyalov   }
76919ef9dcSOleksiy Vyalov 
77919ef9dcSOleksiy Vyalov   return error;
78919ef9dcSOleksiy Vyalov }
79