xref: /openbsd-src/gnu/llvm/lldb/source/Host/windows/ProcessRunLock.cpp (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
1*061da546Spatrick //===-- ProcessRunLock.cpp --------------------------------------*- C++ -*-===//
2*061da546Spatrick //
3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*061da546Spatrick //
7*061da546Spatrick //===----------------------------------------------------------------------===//
8*061da546Spatrick 
9*061da546Spatrick #include "lldb/Host/ProcessRunLock.h"
10*061da546Spatrick #include "lldb/Host/windows/windows.h"
11*061da546Spatrick 
12*061da546Spatrick static PSRWLOCK GetLock(lldb::rwlock_t lock) {
13*061da546Spatrick   return static_cast<PSRWLOCK>(lock);
14*061da546Spatrick }
15*061da546Spatrick 
16*061da546Spatrick static bool ReadLock(lldb::rwlock_t rwlock) {
17*061da546Spatrick   ::AcquireSRWLockShared(GetLock(rwlock));
18*061da546Spatrick   return true;
19*061da546Spatrick }
20*061da546Spatrick 
21*061da546Spatrick static bool ReadUnlock(lldb::rwlock_t rwlock) {
22*061da546Spatrick   ::ReleaseSRWLockShared(GetLock(rwlock));
23*061da546Spatrick   return true;
24*061da546Spatrick }
25*061da546Spatrick 
26*061da546Spatrick static bool WriteLock(lldb::rwlock_t rwlock) {
27*061da546Spatrick   ::AcquireSRWLockExclusive(GetLock(rwlock));
28*061da546Spatrick   return true;
29*061da546Spatrick }
30*061da546Spatrick 
31*061da546Spatrick static bool WriteTryLock(lldb::rwlock_t rwlock) {
32*061da546Spatrick   return !!::TryAcquireSRWLockExclusive(GetLock(rwlock));
33*061da546Spatrick }
34*061da546Spatrick 
35*061da546Spatrick static bool WriteUnlock(lldb::rwlock_t rwlock) {
36*061da546Spatrick   ::ReleaseSRWLockExclusive(GetLock(rwlock));
37*061da546Spatrick   return true;
38*061da546Spatrick }
39*061da546Spatrick 
40*061da546Spatrick using namespace lldb_private;
41*061da546Spatrick 
42*061da546Spatrick ProcessRunLock::ProcessRunLock() : m_running(false) {
43*061da546Spatrick   m_rwlock = new SRWLOCK;
44*061da546Spatrick   InitializeSRWLock(GetLock(m_rwlock));
45*061da546Spatrick }
46*061da546Spatrick 
47*061da546Spatrick ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); }
48*061da546Spatrick 
49*061da546Spatrick bool ProcessRunLock::ReadTryLock() {
50*061da546Spatrick   ::ReadLock(m_rwlock);
51*061da546Spatrick   if (m_running == false)
52*061da546Spatrick     return true;
53*061da546Spatrick   ::ReadUnlock(m_rwlock);
54*061da546Spatrick   return false;
55*061da546Spatrick }
56*061da546Spatrick 
57*061da546Spatrick bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); }
58*061da546Spatrick 
59*061da546Spatrick bool ProcessRunLock::SetRunning() {
60*061da546Spatrick   WriteLock(m_rwlock);
61*061da546Spatrick   m_running = true;
62*061da546Spatrick   WriteUnlock(m_rwlock);
63*061da546Spatrick   return true;
64*061da546Spatrick }
65*061da546Spatrick 
66*061da546Spatrick bool ProcessRunLock::TrySetRunning() {
67*061da546Spatrick   if (WriteTryLock(m_rwlock)) {
68*061da546Spatrick     bool was_running = m_running;
69*061da546Spatrick     m_running = true;
70*061da546Spatrick     WriteUnlock(m_rwlock);
71*061da546Spatrick     return !was_running;
72*061da546Spatrick   }
73*061da546Spatrick   return false;
74*061da546Spatrick }
75*061da546Spatrick 
76*061da546Spatrick bool ProcessRunLock::SetStopped() {
77*061da546Spatrick   WriteLock(m_rwlock);
78*061da546Spatrick   m_running = false;
79*061da546Spatrick   WriteUnlock(m_rwlock);
80*061da546Spatrick   return true;
81*061da546Spatrick }
82