125 lines
2.4 KiB
C++
125 lines
2.4 KiB
C++
//===-- 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;
|
|
}
|