1*919ef9dcSOleksiy Vyalov //===-- LockFileBase.cpp ----------------------------------------*- C++ -*-===//
2*919ef9dcSOleksiy Vyalov //
3*919ef9dcSOleksiy Vyalov //                     The LLVM Compiler Infrastructure
4*919ef9dcSOleksiy Vyalov //
5*919ef9dcSOleksiy Vyalov // This file is distributed under the University of Illinois Open Source
6*919ef9dcSOleksiy Vyalov // License. See LICENSE.TXT for details.
7*919ef9dcSOleksiy Vyalov //
8*919ef9dcSOleksiy Vyalov //===----------------------------------------------------------------------===//
9*919ef9dcSOleksiy Vyalov 
10*919ef9dcSOleksiy Vyalov #include "lldb/Host/LockFileBase.h"
11*919ef9dcSOleksiy Vyalov 
12*919ef9dcSOleksiy Vyalov using namespace lldb;
13*919ef9dcSOleksiy Vyalov using namespace lldb_private;
14*919ef9dcSOleksiy Vyalov 
15*919ef9dcSOleksiy Vyalov namespace
16*919ef9dcSOleksiy Vyalov {
17*919ef9dcSOleksiy Vyalov 
18*919ef9dcSOleksiy Vyalov Error
19*919ef9dcSOleksiy Vyalov AlreadyLocked ()
20*919ef9dcSOleksiy Vyalov {
21*919ef9dcSOleksiy Vyalov     return Error ("Already locked");
22*919ef9dcSOleksiy Vyalov }
23*919ef9dcSOleksiy Vyalov 
24*919ef9dcSOleksiy Vyalov Error
25*919ef9dcSOleksiy Vyalov NotLocked ()
26*919ef9dcSOleksiy Vyalov {
27*919ef9dcSOleksiy Vyalov     return Error ("Not locked");
28*919ef9dcSOleksiy Vyalov }
29*919ef9dcSOleksiy Vyalov 
30*919ef9dcSOleksiy Vyalov }
31*919ef9dcSOleksiy Vyalov 
32*919ef9dcSOleksiy Vyalov LockFileBase::LockFileBase (int fd) :
33*919ef9dcSOleksiy Vyalov     m_fd (fd),
34*919ef9dcSOleksiy Vyalov     m_locked (false),
35*919ef9dcSOleksiy Vyalov     m_start (0),
36*919ef9dcSOleksiy Vyalov     m_len (0)
37*919ef9dcSOleksiy Vyalov {
38*919ef9dcSOleksiy Vyalov 
39*919ef9dcSOleksiy Vyalov }
40*919ef9dcSOleksiy Vyalov 
41*919ef9dcSOleksiy Vyalov bool
42*919ef9dcSOleksiy Vyalov LockFileBase::IsLocked () const
43*919ef9dcSOleksiy Vyalov {
44*919ef9dcSOleksiy Vyalov     return m_locked;
45*919ef9dcSOleksiy Vyalov }
46*919ef9dcSOleksiy Vyalov 
47*919ef9dcSOleksiy Vyalov Error
48*919ef9dcSOleksiy Vyalov LockFileBase::WriteLock (const uint64_t start, const uint64_t len)
49*919ef9dcSOleksiy Vyalov {
50*919ef9dcSOleksiy Vyalov     return DoLock ([&] (const uint64_t start, const uint64_t len)
51*919ef9dcSOleksiy Vyalov                    {
52*919ef9dcSOleksiy Vyalov                        return DoWriteLock (start, len);
53*919ef9dcSOleksiy Vyalov                    }, start, len);
54*919ef9dcSOleksiy Vyalov }
55*919ef9dcSOleksiy Vyalov 
56*919ef9dcSOleksiy Vyalov Error
57*919ef9dcSOleksiy Vyalov LockFileBase::TryWriteLock (const uint64_t start, const uint64_t len)
58*919ef9dcSOleksiy Vyalov {
59*919ef9dcSOleksiy Vyalov     return DoLock ([&] (const uint64_t start, const uint64_t len)
60*919ef9dcSOleksiy Vyalov                    {
61*919ef9dcSOleksiy Vyalov                         return DoTryWriteLock (start, len);
62*919ef9dcSOleksiy Vyalov                    }, start, len);
63*919ef9dcSOleksiy Vyalov }
64*919ef9dcSOleksiy Vyalov 
65*919ef9dcSOleksiy Vyalov Error
66*919ef9dcSOleksiy Vyalov LockFileBase::ReadLock (const uint64_t start, const uint64_t len)
67*919ef9dcSOleksiy Vyalov {
68*919ef9dcSOleksiy Vyalov     return DoLock ([&] (const uint64_t start, const uint64_t len)
69*919ef9dcSOleksiy Vyalov                    {
70*919ef9dcSOleksiy Vyalov                         return DoReadLock (start, len);
71*919ef9dcSOleksiy Vyalov                    }, start, len);
72*919ef9dcSOleksiy Vyalov }
73*919ef9dcSOleksiy Vyalov 
74*919ef9dcSOleksiy Vyalov Error
75*919ef9dcSOleksiy Vyalov LockFileBase::TryReadLock (const uint64_t start, const uint64_t len)
76*919ef9dcSOleksiy Vyalov {
77*919ef9dcSOleksiy Vyalov     return DoLock ([&] (const uint64_t start, const uint64_t len)
78*919ef9dcSOleksiy Vyalov                    {
79*919ef9dcSOleksiy Vyalov                        return DoTryReadLock (start, len);
80*919ef9dcSOleksiy Vyalov                    }, start, len);
81*919ef9dcSOleksiy Vyalov 
82*919ef9dcSOleksiy Vyalov }
83*919ef9dcSOleksiy Vyalov 
84*919ef9dcSOleksiy Vyalov Error
85*919ef9dcSOleksiy Vyalov LockFileBase::Unlock ()
86*919ef9dcSOleksiy Vyalov {
87*919ef9dcSOleksiy Vyalov     if (!IsLocked ())
88*919ef9dcSOleksiy Vyalov         return NotLocked ();
89*919ef9dcSOleksiy Vyalov 
90*919ef9dcSOleksiy Vyalov     const auto error = DoUnlock ();
91*919ef9dcSOleksiy Vyalov     if (error.Success ())
92*919ef9dcSOleksiy Vyalov     {
93*919ef9dcSOleksiy Vyalov         m_locked = false;
94*919ef9dcSOleksiy Vyalov         m_start = 0;
95*919ef9dcSOleksiy Vyalov         m_len = 0;
96*919ef9dcSOleksiy Vyalov     }
97*919ef9dcSOleksiy Vyalov     return error;
98*919ef9dcSOleksiy Vyalov }
99*919ef9dcSOleksiy Vyalov 
100*919ef9dcSOleksiy Vyalov bool
101*919ef9dcSOleksiy Vyalov LockFileBase::IsValidFile () const
102*919ef9dcSOleksiy Vyalov {
103*919ef9dcSOleksiy Vyalov     return m_fd != -1;
104*919ef9dcSOleksiy Vyalov }
105*919ef9dcSOleksiy Vyalov 
106*919ef9dcSOleksiy Vyalov Error
107*919ef9dcSOleksiy Vyalov LockFileBase::DoLock (const Locker &locker, const uint64_t start, const uint64_t len)
108*919ef9dcSOleksiy Vyalov {
109*919ef9dcSOleksiy Vyalov     if (!IsValidFile ())
110*919ef9dcSOleksiy Vyalov         return Error("File is invalid");
111*919ef9dcSOleksiy Vyalov 
112*919ef9dcSOleksiy Vyalov     if (IsLocked ())
113*919ef9dcSOleksiy Vyalov         return AlreadyLocked ();
114*919ef9dcSOleksiy Vyalov 
115*919ef9dcSOleksiy Vyalov     const auto error = locker (start, len);
116*919ef9dcSOleksiy Vyalov     if (error.Success ())
117*919ef9dcSOleksiy Vyalov     {
118*919ef9dcSOleksiy Vyalov         m_locked = true;
119*919ef9dcSOleksiy Vyalov         m_start = start;
120*919ef9dcSOleksiy Vyalov         m_len = len;
121*919ef9dcSOleksiy Vyalov     }
122*919ef9dcSOleksiy Vyalov 
123*919ef9dcSOleksiy Vyalov     return error;
124*919ef9dcSOleksiy Vyalov }
125