1dda28197Spatrick //===-- 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 #ifndef _WIN32 10061da546Spatrick #include "lldb/Host/ProcessRunLock.h" 11061da546Spatrick 12061da546Spatrick namespace lldb_private { 13061da546Spatrick ProcessRunLock()14be691f3bSpatrickProcessRunLock::ProcessRunLock() { 15061da546Spatrick int err = ::pthread_rwlock_init(&m_rwlock, nullptr); 16061da546Spatrick (void)err; 17061da546Spatrick } 18061da546Spatrick ~ProcessRunLock()19061da546SpatrickProcessRunLock::~ProcessRunLock() { 20061da546Spatrick int err = ::pthread_rwlock_destroy(&m_rwlock); 21061da546Spatrick (void)err; 22061da546Spatrick } 23061da546Spatrick ReadTryLock()24061da546Spatrickbool ProcessRunLock::ReadTryLock() { 25061da546Spatrick ::pthread_rwlock_rdlock(&m_rwlock); 26061da546Spatrick if (!m_running) { 27*f6aab3d8Srobert // coverity[missing_unlock] 28061da546Spatrick return true; 29061da546Spatrick } 30061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 31061da546Spatrick return false; 32061da546Spatrick } 33061da546Spatrick ReadUnlock()34061da546Spatrickbool ProcessRunLock::ReadUnlock() { 35061da546Spatrick return ::pthread_rwlock_unlock(&m_rwlock) == 0; 36061da546Spatrick } 37061da546Spatrick SetRunning()38061da546Spatrickbool ProcessRunLock::SetRunning() { 39061da546Spatrick ::pthread_rwlock_wrlock(&m_rwlock); 40061da546Spatrick m_running = true; 41061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 42061da546Spatrick return true; 43061da546Spatrick } 44061da546Spatrick TrySetRunning()45061da546Spatrickbool ProcessRunLock::TrySetRunning() { 46061da546Spatrick bool r; 47061da546Spatrick 48061da546Spatrick if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) { 49061da546Spatrick r = !m_running; 50061da546Spatrick m_running = true; 51061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 52061da546Spatrick return r; 53061da546Spatrick } 54061da546Spatrick return false; 55061da546Spatrick } 56061da546Spatrick SetStopped()57061da546Spatrickbool ProcessRunLock::SetStopped() { 58061da546Spatrick ::pthread_rwlock_wrlock(&m_rwlock); 59061da546Spatrick m_running = false; 60061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 61061da546Spatrick return true; 62061da546Spatrick } 63061da546Spatrick } 64061da546Spatrick 65061da546Spatrick #endif 66