1 //===-- ProcessRunLock.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/ProcessRunLock.h" 11 #include "lldb/Host/windows/windows.h" 12 13 static PSRWLOCK GetLock(lldb::rwlock_t lock) { 14 return static_cast<PSRWLOCK>(lock); 15 } 16 17 static bool ReadLock(lldb::rwlock_t rwlock) { 18 ::AcquireSRWLockShared(GetLock(rwlock)); 19 return true; 20 } 21 22 static bool ReadUnlock(lldb::rwlock_t rwlock) { 23 ::ReleaseSRWLockShared(GetLock(rwlock)); 24 return true; 25 } 26 27 static bool WriteLock(lldb::rwlock_t rwlock) { 28 ::AcquireSRWLockExclusive(GetLock(rwlock)); 29 return true; 30 } 31 32 static bool WriteTryLock(lldb::rwlock_t rwlock) { 33 return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); 34 } 35 36 static bool WriteUnlock(lldb::rwlock_t rwlock) { 37 ::ReleaseSRWLockExclusive(GetLock(rwlock)); 38 return true; 39 } 40 41 using namespace lldb_private; 42 43 ProcessRunLock::ProcessRunLock() : m_running(false) { 44 m_rwlock = new SRWLOCK; 45 InitializeSRWLock(GetLock(m_rwlock)); 46 } 47 48 ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); } 49 50 bool ProcessRunLock::ReadTryLock() { 51 ::ReadLock(m_rwlock); 52 if (m_running == false) 53 return true; 54 ::ReadUnlock(m_rwlock); 55 return false; 56 } 57 58 bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); } 59 60 bool ProcessRunLock::SetRunning() { 61 WriteLock(m_rwlock); 62 m_running = true; 63 WriteUnlock(m_rwlock); 64 return true; 65 } 66 67 bool ProcessRunLock::TrySetRunning() { 68 if (WriteTryLock(m_rwlock)) { 69 bool was_running = m_running; 70 m_running = true; 71 WriteUnlock(m_rwlock); 72 return !was_running; 73 } 74 return false; 75 } 76 77 bool ProcessRunLock::SetStopped() { 78 WriteLock(m_rwlock); 79 m_running = false; 80 WriteUnlock(m_rwlock); 81 return true; 82 } 83