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 Stonestatic PSRWLOCK GetLock(lldb::rwlock_t lock) { 13275806f9SZachary Turner return static_cast<PSRWLOCK>(lock); 14b2f1fb29SVirgile Bello } 15275806f9SZachary Turner ReadLock(lldb::rwlock_t rwlock)16b9c1b51eSKate Stonestatic 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 Stonestatic 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 Stonestatic 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 Stonestatic bool WriteTryLock(lldb::rwlock_t rwlock) { 32275806f9SZachary Turner return !!::TryAcquireSRWLockExclusive(GetLock(rwlock)); 33275806f9SZachary Turner } 34275806f9SZachary Turner WriteUnlock(lldb::rwlock_t rwlock)35b9c1b51eSKate Stonestatic 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 StoneProcessRunLock::ProcessRunLock() : m_running(false) { 43275806f9SZachary Turner m_rwlock = new SRWLOCK; 44275806f9SZachary Turner InitializeSRWLock(GetLock(m_rwlock)); 45b2f1fb29SVirgile Bello } 46b2f1fb29SVirgile Bello ~ProcessRunLock()475a8ad459SZachary TurnerProcessRunLock::~ProcessRunLock() { delete static_cast<SRWLOCK *>(m_rwlock); } 48b2f1fb29SVirgile Bello ReadTryLock()49b9c1b51eSKate Stonebool 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 Stonebool ProcessRunLock::ReadUnlock() { return ::ReadUnlock(m_rwlock); } 58b2f1fb29SVirgile Bello SetRunning()59b9c1b51eSKate Stonebool 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 Stonebool 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 Stonebool ProcessRunLock::SetStopped() { 77b2f1fb29SVirgile Bello WriteLock(m_rwlock); 78b2f1fb29SVirgile Bello m_running = false; 79b2f1fb29SVirgile Bello WriteUnlock(m_rwlock); 80b2f1fb29SVirgile Bello return true; 81b2f1fb29SVirgile Bello } 82