180814287SRaphael 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 #ifndef _WIN32 10b2f1fb29SVirgile Bello #include "lldb/Host/ProcessRunLock.h" 11b2f1fb29SVirgile Bello 12b2f1fb29SVirgile Bello namespace lldb_private { 13b2f1fb29SVirgile Bello ProcessRunLock()14*9494c510SJonas DevlieghereProcessRunLock::ProcessRunLock() { 15248a1305SKonrad Kleine int err = ::pthread_rwlock_init(&m_rwlock, nullptr); 16b9c1b51eSKate Stone (void)err; 17b2f1fb29SVirgile Bello } 18b2f1fb29SVirgile Bello ~ProcessRunLock()19b9c1b51eSKate StoneProcessRunLock::~ProcessRunLock() { 20b9c1b51eSKate Stone int err = ::pthread_rwlock_destroy(&m_rwlock); 21b9c1b51eSKate Stone (void)err; 22b2f1fb29SVirgile Bello } 23b2f1fb29SVirgile Bello ReadTryLock()24b9c1b51eSKate Stonebool ProcessRunLock::ReadTryLock() { 25b2f1fb29SVirgile Bello ::pthread_rwlock_rdlock(&m_rwlock); 26a6682a41SJonas Devlieghere if (!m_running) { 27b2f1fb29SVirgile Bello return true; 28b2f1fb29SVirgile Bello } 29b2f1fb29SVirgile Bello ::pthread_rwlock_unlock(&m_rwlock); 30b2f1fb29SVirgile Bello return false; 31b2f1fb29SVirgile Bello } 32b2f1fb29SVirgile Bello ReadUnlock()33b9c1b51eSKate Stonebool ProcessRunLock::ReadUnlock() { 34b2f1fb29SVirgile Bello return ::pthread_rwlock_unlock(&m_rwlock) == 0; 35b2f1fb29SVirgile Bello } 36b2f1fb29SVirgile Bello SetRunning()37b9c1b51eSKate Stonebool ProcessRunLock::SetRunning() { 38b2f1fb29SVirgile Bello ::pthread_rwlock_wrlock(&m_rwlock); 39b2f1fb29SVirgile Bello m_running = true; 40b2f1fb29SVirgile Bello ::pthread_rwlock_unlock(&m_rwlock); 41b2f1fb29SVirgile Bello return true; 42b2f1fb29SVirgile Bello } 43b2f1fb29SVirgile Bello TrySetRunning()44b9c1b51eSKate Stonebool ProcessRunLock::TrySetRunning() { 45b2f1fb29SVirgile Bello bool r; 46b2f1fb29SVirgile Bello 47b9c1b51eSKate Stone if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) { 48b2f1fb29SVirgile Bello r = !m_running; 49b2f1fb29SVirgile Bello m_running = true; 50b2f1fb29SVirgile Bello ::pthread_rwlock_unlock(&m_rwlock); 51b2f1fb29SVirgile Bello return r; 52b2f1fb29SVirgile Bello } 53b2f1fb29SVirgile Bello return false; 54b2f1fb29SVirgile Bello } 55b2f1fb29SVirgile Bello SetStopped()56b9c1b51eSKate Stonebool ProcessRunLock::SetStopped() { 57b2f1fb29SVirgile Bello ::pthread_rwlock_wrlock(&m_rwlock); 58b2f1fb29SVirgile Bello m_running = false; 59b2f1fb29SVirgile Bello ::pthread_rwlock_unlock(&m_rwlock); 60b2f1fb29SVirgile Bello return true; 61b2f1fb29SVirgile Bello } 62b2f1fb29SVirgile Bello } 63b2f1fb29SVirgile Bello 64b2f1fb29SVirgile Bello #endif 65