| #include "lldb/Host/ProcessRunLock.h" |
| #include "lldb/Host/windows/windows.h" |
| |
| namespace |
| { |
| #if defined(__MINGW32__) |
| // Taken from WinNT.h |
| typedef struct _RTL_SRWLOCK { |
| PVOID Ptr; |
| } RTL_SRWLOCK, *PRTL_SRWLOCK; |
| |
| // Taken from WinBase.h |
| typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; |
| #endif |
| } |
| |
| |
| 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 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; |
| } |