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