blob: 1f21552a306238ef3c2cc2459ca4482169de38e5 [file] [log] [blame]
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001#include "lldb/Host/ProcessRunLock.h"
Virgile Bello0a3b1512013-09-04 13:56:11 +00002#include "lldb/Host/windows/windows.h"
Virgile Bellob2f1fb22013-08-23 12:44:05 +00003
Zachary Turner275806f2015-05-14 22:50:19 +00004namespace
5{
Virgile Bellob2f1fb22013-08-23 12:44:05 +00006#if defined(__MINGW32__)
Zachary Turner275806f2015-05-14 22:50:19 +00007// Taken from WinNT.h
8typedef struct _RTL_SRWLOCK {
9 PVOID Ptr;
10} RTL_SRWLOCK, *PRTL_SRWLOCK;
Virgile Bellob2f1fb22013-08-23 12:44:05 +000011
Zachary Turner275806f2015-05-14 22:50:19 +000012// Taken from WinBase.h
13typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
Virgile Bellob2f1fb22013-08-23 12:44:05 +000014#endif
Virgile Bellob2f1fb22013-08-23 12:44:05 +000015}
16
Zachary Turner275806f2015-05-14 22:50:19 +000017
18static PSRWLOCK GetLock(lldb::rwlock_t lock)
19{
20 return static_cast<PSRWLOCK>(lock);
21}
22
23static bool ReadLock(lldb::rwlock_t rwlock)
24{
25 ::AcquireSRWLockShared(GetLock(rwlock));
26 return true;
27}
28
29static bool ReadUnlock(lldb::rwlock_t rwlock)
30{
31 ::ReleaseSRWLockShared(GetLock(rwlock));
32 return true;
33}
34
35static bool WriteLock(lldb::rwlock_t rwlock)
36{
37 ::AcquireSRWLockExclusive(GetLock(rwlock));
38 return true;
39}
40
41static bool WriteTryLock(lldb::rwlock_t rwlock)
42{
43 return !!::TryAcquireSRWLockExclusive(GetLock(rwlock));
44}
45
46static bool WriteUnlock(lldb::rwlock_t rwlock)
47{
48 ::ReleaseSRWLockExclusive(GetLock(rwlock));
49 return true;
50}
51
52using namespace lldb_private;
53
54ProcessRunLock::ProcessRunLock()
55 : m_running(false)
56{
57 m_rwlock = new SRWLOCK;
58 InitializeSRWLock(GetLock(m_rwlock));
59}
60
61ProcessRunLock::~ProcessRunLock()
62{
63 delete m_rwlock;
64}
65
66bool ProcessRunLock::ReadTryLock()
67{
68 ::ReadLock(m_rwlock);
69 if (m_running == false)
70 return true;
71 ::ReadUnlock(m_rwlock);
72 return false;
73}
74
75bool ProcessRunLock::ReadUnlock()
76{
77 return ::ReadUnlock(m_rwlock);
78}
79
80bool ProcessRunLock::SetRunning ()
81{
82 WriteLock(m_rwlock);
83 m_running = true;
84 WriteUnlock(m_rwlock);
85 return true;
86}
87
88bool 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
100bool ProcessRunLock::SetStopped ()
101{
102 WriteLock(m_rwlock);
103 m_running = false;
104 WriteUnlock(m_rwlock);
105 return true;
106}