1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#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;
}
|