107 lines
1.9 KiB
C++
107 lines
1.9 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;
|
|
}
|