| //===-- 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 |
| { |
| |
| Error |
| AlreadyLocked () |
| { |
| return Error ("Already locked"); |
| } |
| |
| Error |
| NotLocked () |
| { |
| return Error ("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; |
| } |
| |
| Error |
| 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); |
| } |
| |
| Error |
| 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); |
| } |
| |
| Error |
| 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); |
| } |
| |
| Error |
| 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); |
| |
| } |
| |
| Error |
| 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; |
| } |
| |
| Error |
| LockFileBase::DoLock (const Locker &locker, const uint64_t start, const uint64_t len) |
| { |
| if (!IsValidFile ()) |
| return Error("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; |
| } |