forked from OSchip/llvm-project
84 lines
1.8 KiB
C++
84 lines
1.8 KiB
C++
#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;
|
|
}
|