]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Host/windows/ProcessRunLock.cpp
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Host / windows / ProcessRunLock.cpp
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 }