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