Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 1 | #include "lldb/Host/ProcessRunLock.h" |
Virgile Bello | 0a3b151 | 2013-09-04 13:56:11 +0000 | [diff] [blame] | 2 | #include "lldb/Host/windows/windows.h" |
Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 3 | |
Zachary Turner | 275806f | 2015-05-14 22:50:19 +0000 | [diff] [blame^] | 4 | namespace |
| 5 | { |
Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 6 | #if defined(__MINGW32__) |
Zachary Turner | 275806f | 2015-05-14 22:50:19 +0000 | [diff] [blame^] | 7 | // Taken from WinNT.h |
| 8 | typedef struct _RTL_SRWLOCK { |
| 9 | PVOID Ptr; |
| 10 | } RTL_SRWLOCK, *PRTL_SRWLOCK; |
Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 11 | |
Zachary Turner | 275806f | 2015-05-14 22:50:19 +0000 | [diff] [blame^] | 12 | // Taken from WinBase.h |
| 13 | typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; |
Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 14 | #endif |
Virgile Bello | b2f1fb2 | 2013-08-23 12:44:05 +0000 | [diff] [blame] | 15 | } |
| 16 | |
Zachary Turner | 275806f | 2015-05-14 22:50:19 +0000 | [diff] [blame^] | 17 | |
| 18 | static PSRWLOCK GetLock(lldb::rwlock_t lock) |
| 19 | { |
| 20 | return static_cast<PSRWLOCK>(lock); |
| 21 | } |
| 22 | |
| 23 | static bool ReadLock(lldb::rwlock_t rwlock) |
| 24 | { |
| 25 | ::AcquireSRWLockShared(GetLock(rwlock)); |
| 26 | return true; |
| 27 | } |
| 28 | |
| 29 | static bool ReadUnlock(lldb::rwlock_t rwlock) |
| 30 | { |
| 31 | ::ReleaseSRWLockShared(GetLock(rwlock)); |
| 32 | return true; |
| 33 | } |
| 34 | |
| 35 | static bool WriteLock(lldb::rwlock_t rwlock) |
| 36 | { |
| 37 | ::AcquireSRWLockExclusive(GetLock(rwlock)); |
| 38 | return true; |
| 39 | } |
| 40 | |
| 41 | static bool WriteTryLock(lldb::rwlock_t rwlock) |
| 42 | { |
| 43 | return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); |
| 44 | } |
| 45 | |
| 46 | static bool WriteUnlock(lldb::rwlock_t rwlock) |
| 47 | { |
| 48 | ::ReleaseSRWLockExclusive(GetLock(rwlock)); |
| 49 | return true; |
| 50 | } |
| 51 | |
| 52 | using namespace lldb_private; |
| 53 | |
| 54 | ProcessRunLock::ProcessRunLock() |
| 55 | : m_running(false) |
| 56 | { |
| 57 | m_rwlock = new SRWLOCK; |
| 58 | InitializeSRWLock(GetLock(m_rwlock)); |
| 59 | } |
| 60 | |
| 61 | ProcessRunLock::~ProcessRunLock() |
| 62 | { |
| 63 | delete m_rwlock; |
| 64 | } |
| 65 | |
| 66 | bool ProcessRunLock::ReadTryLock() |
| 67 | { |
| 68 | ::ReadLock(m_rwlock); |
| 69 | if (m_running == false) |
| 70 | return true; |
| 71 | ::ReadUnlock(m_rwlock); |
| 72 | return false; |
| 73 | } |
| 74 | |
| 75 | bool ProcessRunLock::ReadUnlock() |
| 76 | { |
| 77 | return ::ReadUnlock(m_rwlock); |
| 78 | } |
| 79 | |
| 80 | bool ProcessRunLock::SetRunning () |
| 81 | { |
| 82 | WriteLock(m_rwlock); |
| 83 | m_running = true; |
| 84 | WriteUnlock(m_rwlock); |
| 85 | return true; |
| 86 | } |
| 87 | |
| 88 | bool ProcessRunLock::TrySetRunning () |
| 89 | { |
| 90 | if (WriteTryLock(m_rwlock)) |
| 91 | { |
| 92 | bool was_running = m_running; |
| 93 | m_running = true; |
| 94 | WriteUnlock(m_rwlock); |
| 95 | return !was_running; |
| 96 | } |
| 97 | return false; |
| 98 | } |
| 99 | |
| 100 | bool ProcessRunLock::SetStopped () |
| 101 | { |
| 102 | WriteLock(m_rwlock); |
| 103 | m_running = false; |
| 104 | WriteUnlock(m_rwlock); |
| 105 | return true; |
| 106 | } |