1 //===-- ProcessRunLock.cpp --------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Host/ProcessRunLock.h"
11 #include "lldb/Host/windows/windows.h"
12 
13 static PSRWLOCK GetLock(lldb::rwlock_t lock) {
14   return static_cast<PSRWLOCK>(lock);
15 }
16 
17 static bool ReadLock(lldb::rwlock_t rwlock) {
18   ::AcquireSRWLockShared(GetLock(rwlock));
19   return true;
20 }
21 
22 static bool ReadUnlock(lldb::rwlock_t rwlock) {
23   ::ReleaseSRWLockShared(GetLock(rwlock));
24   return true;
25 }
26 
27 static bool WriteLock(lldb::rwlock_t rwlock) {
28   ::AcquireSRWLockExclusive(GetLock(rwlock));
29   return true;
30 }
31 
32 static bool WriteTryLock(lldb::rwlock_t rwlock) {
33   return !!::TryAcquireSRWLockExclusive(GetLock(rwlock));
34 }
35 
36 static bool WriteUnlock(lldb::rwlock_t rwlock) {
37   ::ReleaseSRWLockExclusive(GetLock(rwlock));
38   return true;
39 }
40 
41 using namespace lldb_private;
42 
43 ProcessRunLock::ProcessRunLock() : m_running(false) {
44   m_rwlock = new SRWLOCK;
45   InitializeSRWLock(GetLock(m_rwlock));
46 }
47 
48 ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); }
49 
50 bool ProcessRunLock::ReadTryLock() {
51   ::ReadLock(m_rwlock);
52   if (m_running == false)
53     return true;
54   ::ReadUnlock(m_rwlock);
55   return false;
56 }
57 
58 bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); }
59 
60 bool ProcessRunLock::SetRunning() {
61   WriteLock(m_rwlock);
62   m_running = true;
63   WriteUnlock(m_rwlock);
64   return true;
65 }
66 
67 bool ProcessRunLock::TrySetRunning() {
68   if (WriteTryLock(m_rwlock)) {
69     bool was_running = m_running;
70     m_running = true;
71     WriteUnlock(m_rwlock);
72     return !was_running;
73   }
74   return false;
75 }
76 
77 bool ProcessRunLock::SetStopped() {
78   WriteLock(m_rwlock);
79   m_running = false;
80   WriteUnlock(m_rwlock);
81   return true;
82 }
83