xref: /llvm-project/lldb/source/Host/windows/ProcessRunLock.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- ProcessRunLock.cpp ------------------------------------------------===//
2696bd635SAlexander Shaposhnikov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6696bd635SAlexander Shaposhnikov //
7696bd635SAlexander Shaposhnikov //===----------------------------------------------------------------------===//
8696bd635SAlexander Shaposhnikov 
9b2f1fb29SVirgile Bello #include "lldb/Host/ProcessRunLock.h"
100a3b151fSVirgile Bello #include "lldb/Host/windows/windows.h"
11b2f1fb29SVirgile Bello 
GetLock(lldb::rwlock_t lock)12b9c1b51eSKate Stone static PSRWLOCK GetLock(lldb::rwlock_t lock) {
13275806f9SZachary Turner   return static_cast<PSRWLOCK>(lock);
14b2f1fb29SVirgile Bello }
15275806f9SZachary Turner 
ReadLock(lldb::rwlock_t rwlock)16b9c1b51eSKate Stone static bool ReadLock(lldb::rwlock_t rwlock) {
17275806f9SZachary Turner   ::AcquireSRWLockShared(GetLock(rwlock));
18275806f9SZachary Turner   return true;
19b2f1fb29SVirgile Bello }
20275806f9SZachary Turner 
ReadUnlock(lldb::rwlock_t rwlock)21b9c1b51eSKate Stone static bool ReadUnlock(lldb::rwlock_t rwlock) {
22275806f9SZachary Turner   ::ReleaseSRWLockShared(GetLock(rwlock));
23275806f9SZachary Turner   return true;
24b2f1fb29SVirgile Bello }
25b2f1fb29SVirgile Bello 
WriteLock(lldb::rwlock_t rwlock)26b9c1b51eSKate Stone static bool WriteLock(lldb::rwlock_t rwlock) {
27275806f9SZachary Turner   ::AcquireSRWLockExclusive(GetLock(rwlock));
28275806f9SZachary Turner   return true;
29275806f9SZachary Turner }
30275806f9SZachary Turner 
WriteTryLock(lldb::rwlock_t rwlock)31b9c1b51eSKate Stone static bool WriteTryLock(lldb::rwlock_t rwlock) {
32275806f9SZachary Turner   return !!::TryAcquireSRWLockExclusive(GetLock(rwlock));
33275806f9SZachary Turner }
34275806f9SZachary Turner 
WriteUnlock(lldb::rwlock_t rwlock)35b9c1b51eSKate Stone static bool WriteUnlock(lldb::rwlock_t rwlock) {
36275806f9SZachary Turner   ::ReleaseSRWLockExclusive(GetLock(rwlock));
37275806f9SZachary Turner   return true;
38275806f9SZachary Turner }
39275806f9SZachary Turner 
40275806f9SZachary Turner using namespace lldb_private;
41275806f9SZachary Turner 
ProcessRunLock()42b9c1b51eSKate Stone ProcessRunLock::ProcessRunLock() : m_running(false) {
43275806f9SZachary Turner   m_rwlock = new SRWLOCK;
44275806f9SZachary Turner   InitializeSRWLock(GetLock(m_rwlock));
45b2f1fb29SVirgile Bello }
46b2f1fb29SVirgile Bello 
~ProcessRunLock()475a8ad459SZachary Turner ProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); }
48b2f1fb29SVirgile Bello 
ReadTryLock()49b9c1b51eSKate Stone bool ProcessRunLock::ReadTryLock() {
50275806f9SZachary Turner   ::ReadLock(m_rwlock);
51b2f1fb29SVirgile Bello   if (m_running == false)
52b2f1fb29SVirgile Bello     return true;
53275806f9SZachary Turner   ::ReadUnlock(m_rwlock);
54b2f1fb29SVirgile Bello   return false;
55b2f1fb29SVirgile Bello }
56b2f1fb29SVirgile Bello 
ReadUnlock()57b9c1b51eSKate Stone bool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); }
58b2f1fb29SVirgile Bello 
SetRunning()59b9c1b51eSKate Stone bool ProcessRunLock::SetRunning() {
60b2f1fb29SVirgile Bello   WriteLock(m_rwlock);
61b2f1fb29SVirgile Bello   m_running = true;
62b2f1fb29SVirgile Bello   WriteUnlock(m_rwlock);
63b2f1fb29SVirgile Bello   return true;
64b2f1fb29SVirgile Bello }
65b2f1fb29SVirgile Bello 
TrySetRunning()66b9c1b51eSKate Stone bool ProcessRunLock::TrySetRunning() {
67b9c1b51eSKate Stone   if (WriteTryLock(m_rwlock)) {
68275806f9SZachary Turner     bool was_running = m_running;
69b2f1fb29SVirgile Bello     m_running = true;
70b2f1fb29SVirgile Bello     WriteUnlock(m_rwlock);
71275806f9SZachary Turner     return !was_running;
72b2f1fb29SVirgile Bello   }
73b2f1fb29SVirgile Bello   return false;
74b2f1fb29SVirgile Bello }
75b2f1fb29SVirgile Bello 
SetStopped()76b9c1b51eSKate Stone bool ProcessRunLock::SetStopped() {
77b2f1fb29SVirgile Bello   WriteLock(m_rwlock);
78b2f1fb29SVirgile Bello   m_running = false;
79b2f1fb29SVirgile Bello   WriteUnlock(m_rwlock);
80b2f1fb29SVirgile Bello   return true;
81b2f1fb29SVirgile Bello }
82