aboutsummaryrefslogtreecommitdiff
path: root/source/Host/common/LockFileBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Host/common/LockFileBase.cpp')
-rw-r--r--source/Host/common/LockFileBase.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/source/Host/common/LockFileBase.cpp b/source/Host/common/LockFileBase.cpp
new file mode 100644
index 000000000000..f74694561184
--- /dev/null
+++ b/source/Host/common/LockFileBase.cpp
@@ -0,0 +1,124 @@
+//===-- 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;
+}