This API has been present since XP, and I think it's safe to drop support for XP (since other things have been introduced long ago which already don't work on XP anyway). With this patch, we can statically bind against the exports and not bother falling back to a CRITICAL_SECTION if we can't load the API. llvm-svn: 237402
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;
|
|
}
|