1 //===-- LockFileWindows.cpp -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Host/windows/LockFileWindows.h" 11 12 #include <io.h> 13 14 using namespace lldb; 15 using namespace lldb_private; 16 17 namespace 18 { 19 20 Error fileLock (HANDLE file_handle, DWORD flags, const uint64_t start, const uint64_t len) 21 { 22 if (start != 0) 23 return Error ("Non-zero start lock regions are not supported"); 24 25 OVERLAPPED overlapped = {0}; 26 27 if (!::LockFileEx (file_handle, flags, 0, len, 0, &overlapped) && ::GetLastError () != ERROR_IO_PENDING) 28 return Error (::GetLastError (), eErrorTypeWin32); 29 30 DWORD bytes; 31 if (!::GetOverlappedResult (file_handle, &overlapped, &bytes, TRUE)) 32 return Error (::GetLastError (), eErrorTypeWin32); 33 34 return Error (); 35 } 36 37 } // namespace 38 39 LockFileWindows::LockFileWindows (int fd) 40 : LockFileBase (fd), 41 m_file (reinterpret_cast<HANDLE> (_get_osfhandle (fd))) 42 { 43 } 44 45 LockFileWindows::~LockFileWindows () 46 { 47 Unlock (); 48 if (m_file != INVALID_HANDLE_VALUE) 49 { 50 ::CloseHandle (m_file); 51 m_file = INVALID_HANDLE_VALUE; 52 } 53 } 54 55 bool 56 LockFileWindows::IsValidFile () const 57 { 58 return LockFileBase::IsValidFile() && m_file != INVALID_HANDLE_VALUE; 59 } 60 61 Error 62 LockFileWindows::DoWriteLock (const uint64_t start, const uint64_t len) 63 { 64 return fileLock (m_file, LOCKFILE_EXCLUSIVE_LOCK, start, len); 65 } 66 67 Error 68 LockFileWindows::DoTryWriteLock (const uint64_t start, const uint64_t len) 69 { 70 return fileLock (m_file, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, start, len); 71 } 72 73 Error 74 LockFileWindows::DoReadLock (const uint64_t start, const uint64_t len) 75 { 76 return fileLock (m_file, 0, start, len); 77 } 78 79 Error 80 LockFileWindows::DoTryReadLock (const uint64_t start, const uint64_t len) 81 { 82 return fileLock (m_file, LOCKFILE_FAIL_IMMEDIATELY, start, len); 83 } 84 85 Error 86 LockFileWindows::DoUnlock () 87 { 88 OVERLAPPED overlapped = {0}; 89 90 if (!::UnlockFileEx (m_file, 0, m_len, 0, &overlapped) && ::GetLastError () != ERROR_IO_PENDING) 91 return Error (::GetLastError (), eErrorTypeWin32); 92 93 DWORD bytes; 94 if (!::GetOverlappedResult (m_file, &overlapped, &bytes, TRUE)) 95 return Error (::GetLastError (), eErrorTypeWin32); 96 97 return Error (); 98 } 99