//===-- 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; }