1*dda28197Spatrick //===-- ProcessRunLock.cpp ------------------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "lldb/Host/ProcessRunLock.h" 10061da546Spatrick #include "lldb/Host/windows/windows.h" 11061da546Spatrick GetLock(lldb::rwlock_t lock)12061da546Spatrickstatic PSRWLOCK GetLock(lldb::rwlock_t lock) { 13061da546Spatrick return static_cast<PSRWLOCK>(lock); 14061da546Spatrick } 15061da546Spatrick ReadLock(lldb::rwlock_t rwlock)16061da546Spatrickstatic bool ReadLock(lldb::rwlock_t rwlock) { 17061da546Spatrick ::AcquireSRWLockShared(GetLock(rwlock)); 18061da546Spatrick return true; 19061da546Spatrick } 20061da546Spatrick ReadUnlock(lldb::rwlock_t rwlock)21061da546Spatrickstatic bool ReadUnlock(lldb::rwlock_t rwlock) { 22061da546Spatrick ::ReleaseSRWLockShared(GetLock(rwlock)); 23061da546Spatrick return true; 24061da546Spatrick } 25061da546Spatrick WriteLock(lldb::rwlock_t rwlock)26061da546Spatrickstatic bool WriteLock(lldb::rwlock_t rwlock) { 27061da546Spatrick ::AcquireSRWLockExclusive(GetLock(rwlock)); 28061da546Spatrick return true; 29061da546Spatrick } 30061da546Spatrick WriteTryLock(lldb::rwlock_t rwlock)31061da546Spatrickstatic bool WriteTryLock(lldb::rwlock_t rwlock) { 32061da546Spatrick return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); 33061da546Spatrick } 34061da546Spatrick WriteUnlock(lldb::rwlock_t rwlock)35061da546Spatrickstatic bool WriteUnlock(lldb::rwlock_t rwlock) { 36061da546Spatrick ::ReleaseSRWLockExclusive(GetLock(rwlock)); 37061da546Spatrick return true; 38061da546Spatrick } 39061da546Spatrick 40061da546Spatrick using namespace lldb_private; 41061da546Spatrick ProcessRunLock()42061da546SpatrickProcessRunLock::ProcessRunLock() : m_running(false) { 43061da546Spatrick m_rwlock = new SRWLOCK; 44061da546Spatrick InitializeSRWLock(GetLock(m_rwlock)); 45061da546Spatrick } 46061da546Spatrick ~ProcessRunLock()47061da546SpatrickProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); } 48061da546Spatrick ReadTryLock()49061da546Spatrickbool ProcessRunLock::ReadTryLock() { 50061da546Spatrick ::ReadLock(m_rwlock); 51061da546Spatrick if (m_running == false) 52061da546Spatrick return true; 53061da546Spatrick ::ReadUnlock(m_rwlock); 54061da546Spatrick return false; 55061da546Spatrick } 56061da546Spatrick ReadUnlock()57061da546Spatrickbool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); } 58061da546Spatrick SetRunning()59061da546Spatrickbool ProcessRunLock::SetRunning() { 60061da546Spatrick WriteLock(m_rwlock); 61061da546Spatrick m_running = true; 62061da546Spatrick WriteUnlock(m_rwlock); 63061da546Spatrick return true; 64061da546Spatrick } 65061da546Spatrick TrySetRunning()66061da546Spatrickbool ProcessRunLock::TrySetRunning() { 67061da546Spatrick if (WriteTryLock(m_rwlock)) { 68061da546Spatrick bool was_running = m_running; 69061da546Spatrick m_running = true; 70061da546Spatrick WriteUnlock(m_rwlock); 71061da546Spatrick return !was_running; 72061da546Spatrick } 73061da546Spatrick return false; 74061da546Spatrick } 75061da546Spatrick SetStopped()76061da546Spatrickbool ProcessRunLock::SetStopped() { 77061da546Spatrick WriteLock(m_rwlock); 78061da546Spatrick m_running = false; 79061da546Spatrick WriteUnlock(m_rwlock); 80061da546Spatrick return true; 81061da546Spatrick } 82