| //===-- LockFileBase.cpp ----------------------------------------*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "lldb/Host/LockFileBase.h" | 
 |  | 
 | using namespace lldb; | 
 | using namespace lldb_private; | 
 |  | 
 | namespace { | 
 |  | 
 | Status AlreadyLocked() { return Status("Already locked"); } | 
 |  | 
 | Status NotLocked() { return Status("Not locked"); } | 
 | } | 
 |  | 
 | LockFileBase::LockFileBase(int fd) | 
 |     : m_fd(fd), m_locked(false), m_start(0), m_len(0) {} | 
 |  | 
 | bool LockFileBase::IsLocked() const { return m_locked; } | 
 |  | 
 | Status LockFileBase::WriteLock(const uint64_t start, const uint64_t len) { | 
 |   return DoLock([&](const uint64_t start, | 
 |                     const uint64_t len) { return DoWriteLock(start, len); }, | 
 |                 start, len); | 
 | } | 
 |  | 
 | Status LockFileBase::TryWriteLock(const uint64_t start, const uint64_t len) { | 
 |   return DoLock([&](const uint64_t start, | 
 |                     const uint64_t len) { return DoTryWriteLock(start, len); }, | 
 |                 start, len); | 
 | } | 
 |  | 
 | Status LockFileBase::ReadLock(const uint64_t start, const uint64_t len) { | 
 |   return DoLock([&](const uint64_t start, | 
 |                     const uint64_t len) { return DoReadLock(start, len); }, | 
 |                 start, len); | 
 | } | 
 |  | 
 | Status LockFileBase::TryReadLock(const uint64_t start, const uint64_t len) { | 
 |   return DoLock([&](const uint64_t start, | 
 |                     const uint64_t len) { return DoTryReadLock(start, len); }, | 
 |                 start, len); | 
 | } | 
 |  | 
 | Status LockFileBase::Unlock() { | 
 |   if (!IsLocked()) | 
 |     return NotLocked(); | 
 |  | 
 |   const auto error = DoUnlock(); | 
 |   if (error.Success()) { | 
 |     m_locked = false; | 
 |     m_start = 0; | 
 |     m_len = 0; | 
 |   } | 
 |   return error; | 
 | } | 
 |  | 
 | bool LockFileBase::IsValidFile() const { return m_fd != -1; } | 
 |  | 
 | Status LockFileBase::DoLock(const Locker &locker, const uint64_t start, | 
 |                             const uint64_t len) { | 
 |   if (!IsValidFile()) | 
 |     return Status("File is invalid"); | 
 |  | 
 |   if (IsLocked()) | 
 |     return AlreadyLocked(); | 
 |  | 
 |   const auto error = locker(start, len); | 
 |   if (error.Success()) { | 
 |     m_locked = true; | 
 |     m_start = start; | 
 |     m_len = len; | 
 |   } | 
 |  | 
 |   return error; | 
 | } |