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 Devlieghere ProcessRunLock::ProcessRunLock() {
15248a1305SKonrad Kleine   int err = ::pthread_rwlock_init(&m_rwlock, nullptr);
16b9c1b51eSKate Stone   (void)err;
17b2f1fb29SVirgile Bello }
18b2f1fb29SVirgile Bello 
~ProcessRunLock()19b9c1b51eSKate Stone ProcessRunLock::~ProcessRunLock() {
20b9c1b51eSKate Stone   int err = ::pthread_rwlock_destroy(&m_rwlock);
21b9c1b51eSKate Stone   (void)err;
22b2f1fb29SVirgile Bello }
23b2f1fb29SVirgile Bello 
ReadTryLock()24b9c1b51eSKate Stone bool 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 Stone bool ProcessRunLock::ReadUnlock() {
34b2f1fb29SVirgile Bello   return ::pthread_rwlock_unlock(&m_rwlock) == 0;
35b2f1fb29SVirgile Bello }
36b2f1fb29SVirgile Bello 
SetRunning()37b9c1b51eSKate Stone bool 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 Stone bool 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 Stone bool 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