| //===-- ProcessRunLock.cpp --------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Host/ProcessRunLock.h" |
| #include "lldb/Host/windows/windows.h" |
| |
| static PSRWLOCK GetLock(lldb::rwlock_t lock) { |
| return static_cast<PSRWLOCK>(lock); |
| } |
| |
| static bool ReadLock(lldb::rwlock_t rwlock) { |
| ::AcquireSRWLockShared(GetLock(rwlock)); |
| return true; |
| } |
| |
| static bool ReadUnlock(lldb::rwlock_t rwlock) { |
| ::ReleaseSRWLockShared(GetLock(rwlock)); |
| return true; |
| } |
| |
| static bool WriteLock(lldb::rwlock_t rwlock) { |
| ::AcquireSRWLockExclusive(GetLock(rwlock)); |
| return true; |
| } |
| |
| static bool WriteTryLock(lldb::rwlock_t rwlock) { |
| return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); |
| } |
| |
| static bool WriteUnlock(lldb::rwlock_t rwlock) { |
| ::ReleaseSRWLockExclusive(GetLock(rwlock)); |
| return true; |
| } |
| |
| using namespace lldb_private; |
| |
| ProcessRunLock::ProcessRunLock() : m_running(false) { |
| m_rwlock = new SRWLOCK; |
| InitializeSRWLock(GetLock(m_rwlock)); |
| } |
| |
| ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); } |
| |
| bool ProcessRunLock::ReadTryLock() { |
| ::ReadLock(m_rwlock); |
| if (m_running == false) |
| return true; |
| ::ReadUnlock(m_rwlock); |
| return false; |
| } |
| |
| bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); } |
| |
| bool ProcessRunLock::SetRunning() { |
| WriteLock(m_rwlock); |
| m_running = true; |
| WriteUnlock(m_rwlock); |
| return true; |
| } |
| |
| bool ProcessRunLock::TrySetRunning() { |
| if (WriteTryLock(m_rwlock)) { |
| bool was_running = m_running; |
| m_running = true; |
| WriteUnlock(m_rwlock); |
| return !was_running; |
| } |
| return false; |
| } |
| |
| bool ProcessRunLock::SetStopped() { |
| WriteLock(m_rwlock); |
| m_running = false; |
| WriteUnlock(m_rwlock); |
| return true; |
| } |