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 } 49 50 bool 51 LockFileWindows::IsValidFile () const 52 { 53 return LockFileBase::IsValidFile() && m_file != INVALID_HANDLE_VALUE; 54 } 55 56 Error 57 LockFileWindows::DoWriteLock (const uint64_t start, const uint64_t len) 58 { 59 return fileLock (m_file, LOCKFILE_EXCLUSIVE_LOCK, start, len); 60 } 61 62 Error 63 LockFileWindows::DoTryWriteLock (const uint64_t start, const uint64_t len) 64 { 65 return fileLock (m_file, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, start, len); 66 } 67 68 Error 69 LockFileWindows::DoReadLock (const uint64_t start, const uint64_t len) 70 { 71 return fileLock (m_file, 0, start, len); 72 } 73 74 Error 75 LockFileWindows::DoTryReadLock (const uint64_t start, const uint64_t len) 76 { 77 return fileLock (m_file, LOCKFILE_FAIL_IMMEDIATELY, start, len); 78 } 79 80 Error 81 LockFileWindows::DoUnlock () 82 { 83 OVERLAPPED overlapped = {0}; 84 85 if (!::UnlockFileEx (m_file, 0, m_len, 0, &overlapped) && ::GetLastError () != ERROR_IO_PENDING) 86 return Error (::GetLastError (), eErrorTypeWin32); 87 88 DWORD bytes; 89 if (!::GetOverlappedResult (m_file, &overlapped, &bytes, TRUE)) 90 return Error (::GetLastError (), eErrorTypeWin32); 91 92 return Error (); 93 } 94