1285101Semaste//===-- LockFileBase.cpp ----------------------------------------*- C++ -*-===// 2285101Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6285101Semaste// 7285101Semaste//===----------------------------------------------------------------------===// 8285101Semaste 9285101Semaste#include "lldb/Host/LockFileBase.h" 10285101Semaste 11285101Semasteusing namespace lldb; 12285101Semasteusing namespace lldb_private; 13285101Semaste 14314564Sdimnamespace { 15285101Semaste 16321369SdimStatus AlreadyLocked() { return Status("Already locked"); } 17285101Semaste 18321369SdimStatus NotLocked() { return Status("Not locked"); } 19285101Semaste} 20285101Semaste 21314564SdimLockFileBase::LockFileBase(int fd) 22314564Sdim : m_fd(fd), m_locked(false), m_start(0), m_len(0) {} 23285101Semaste 24314564Sdimbool LockFileBase::IsLocked() const { return m_locked; } 25285101Semaste 26321369SdimStatus LockFileBase::WriteLock(const uint64_t start, const uint64_t len) { 27314564Sdim return DoLock([&](const uint64_t start, 28314564Sdim const uint64_t len) { return DoWriteLock(start, len); }, 29314564Sdim start, len); 30285101Semaste} 31285101Semaste 32321369SdimStatus LockFileBase::TryWriteLock(const uint64_t start, const uint64_t len) { 33314564Sdim return DoLock([&](const uint64_t start, 34314564Sdim const uint64_t len) { return DoTryWriteLock(start, len); }, 35314564Sdim start, len); 36285101Semaste} 37285101Semaste 38321369SdimStatus LockFileBase::ReadLock(const uint64_t start, const uint64_t len) { 39314564Sdim return DoLock([&](const uint64_t start, 40314564Sdim const uint64_t len) { return DoReadLock(start, len); }, 41314564Sdim start, len); 42285101Semaste} 43285101Semaste 44321369SdimStatus LockFileBase::TryReadLock(const uint64_t start, const uint64_t len) { 45314564Sdim return DoLock([&](const uint64_t start, 46314564Sdim const uint64_t len) { return DoTryReadLock(start, len); }, 47314564Sdim start, len); 48285101Semaste} 49285101Semaste 50321369SdimStatus LockFileBase::Unlock() { 51314564Sdim if (!IsLocked()) 52314564Sdim return NotLocked(); 53285101Semaste 54314564Sdim const auto error = DoUnlock(); 55314564Sdim if (error.Success()) { 56314564Sdim m_locked = false; 57314564Sdim m_start = 0; 58314564Sdim m_len = 0; 59314564Sdim } 60314564Sdim return error; 61285101Semaste} 62285101Semaste 63314564Sdimbool LockFileBase::IsValidFile() const { return m_fd != -1; } 64285101Semaste 65321369SdimStatus LockFileBase::DoLock(const Locker &locker, const uint64_t start, 66321369Sdim const uint64_t len) { 67314564Sdim if (!IsValidFile()) 68321369Sdim return Status("File is invalid"); 69285101Semaste 70314564Sdim if (IsLocked()) 71314564Sdim return AlreadyLocked(); 72285101Semaste 73314564Sdim const auto error = locker(start, len); 74314564Sdim if (error.Success()) { 75314564Sdim m_locked = true; 76314564Sdim m_start = start; 77314564Sdim m_len = len; 78314564Sdim } 79285101Semaste 80314564Sdim return error; 81285101Semaste} 82