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