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