1 #include "lldb/Host/ProcessRunLock.h" 2 #include "lldb/Host/windows/windows.h" 3 4 namespace { 5 #if defined(__MINGW32__) 6 // Taken from WinNT.h 7 typedef struct _RTL_SRWLOCK { PVOID Ptr; } RTL_SRWLOCK, *PRTL_SRWLOCK; 8 9 // Taken from WinBase.h 10 typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; 11 #endif 12 } 13 14 static PSRWLOCK GetLock(lldb::rwlock_t lock) { 15 return static_cast<PSRWLOCK>(lock); 16 } 17 18 static bool ReadLock(lldb::rwlock_t rwlock) { 19 ::AcquireSRWLockShared(GetLock(rwlock)); 20 return true; 21 } 22 23 static bool ReadUnlock(lldb::rwlock_t rwlock) { 24 ::ReleaseSRWLockShared(GetLock(rwlock)); 25 return true; 26 } 27 28 static bool WriteLock(lldb::rwlock_t rwlock) { 29 ::AcquireSRWLockExclusive(GetLock(rwlock)); 30 return true; 31 } 32 33 static bool WriteTryLock(lldb::rwlock_t rwlock) { 34 return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); 35 } 36 37 static bool WriteUnlock(lldb::rwlock_t rwlock) { 38 ::ReleaseSRWLockExclusive(GetLock(rwlock)); 39 return true; 40 } 41 42 using namespace lldb_private; 43 44 ProcessRunLock::ProcessRunLock() : m_running(false) { 45 m_rwlock = new SRWLOCK; 46 InitializeSRWLock(GetLock(m_rwlock)); 47 } 48 49 ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); } 50 51 bool ProcessRunLock::ReadTryLock() { 52 ::ReadLock(m_rwlock); 53 if (m_running == false) 54 return true; 55 ::ReadUnlock(m_rwlock); 56 return false; 57 } 58 59 bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); } 60 61 bool ProcessRunLock::SetRunning() { 62 WriteLock(m_rwlock); 63 m_running = true; 64 WriteUnlock(m_rwlock); 65 return true; 66 } 67 68 bool ProcessRunLock::TrySetRunning() { 69 if (WriteTryLock(m_rwlock)) { 70 bool was_running = m_running; 71 m_running = true; 72 WriteUnlock(m_rwlock); 73 return !was_running; 74 } 75 return false; 76 } 77 78 bool ProcessRunLock::SetStopped() { 79 WriteLock(m_rwlock); 80 m_running = false; 81 WriteUnlock(m_rwlock); 82 return true; 83 } 84