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 14*be691f3bSpatrick ProcessRunLock::ProcessRunLock() { 15061da546Spatrick int err = ::pthread_rwlock_init(&m_rwlock, nullptr); 16061da546Spatrick (void)err; 17061da546Spatrick } 18061da546Spatrick 19061da546Spatrick ProcessRunLock::~ProcessRunLock() { 20061da546Spatrick int err = ::pthread_rwlock_destroy(&m_rwlock); 21061da546Spatrick (void)err; 22061da546Spatrick } 23061da546Spatrick 24061da546Spatrick bool ProcessRunLock::ReadTryLock() { 25061da546Spatrick ::pthread_rwlock_rdlock(&m_rwlock); 26061da546Spatrick if (!m_running) { 27061da546Spatrick return true; 28061da546Spatrick } 29061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 30061da546Spatrick return false; 31061da546Spatrick } 32061da546Spatrick 33061da546Spatrick bool ProcessRunLock::ReadUnlock() { 34061da546Spatrick return ::pthread_rwlock_unlock(&m_rwlock) == 0; 35061da546Spatrick } 36061da546Spatrick 37061da546Spatrick bool ProcessRunLock::SetRunning() { 38061da546Spatrick ::pthread_rwlock_wrlock(&m_rwlock); 39061da546Spatrick m_running = true; 40061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 41061da546Spatrick return true; 42061da546Spatrick } 43061da546Spatrick 44061da546Spatrick bool ProcessRunLock::TrySetRunning() { 45061da546Spatrick bool r; 46061da546Spatrick 47061da546Spatrick if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) { 48061da546Spatrick r = !m_running; 49061da546Spatrick m_running = true; 50061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 51061da546Spatrick return r; 52061da546Spatrick } 53061da546Spatrick return false; 54061da546Spatrick } 55061da546Spatrick 56061da546Spatrick bool ProcessRunLock::SetStopped() { 57061da546Spatrick ::pthread_rwlock_wrlock(&m_rwlock); 58061da546Spatrick m_running = false; 59061da546Spatrick ::pthread_rwlock_unlock(&m_rwlock); 60061da546Spatrick return true; 61061da546Spatrick } 62061da546Spatrick } 63061da546Spatrick 64061da546Spatrick #endif 65