1 //===-- ProcessRunLock.cpp ------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef _WIN32
10 #include "lldb/Host/ProcessRunLock.h"
11 
12 namespace lldb_private {
13 
14 ProcessRunLock::ProcessRunLock() : m_running(false) {
15   int err = ::pthread_rwlock_init(&m_rwlock, nullptr);
16   (void)err;
17 }
18 
19 ProcessRunLock::~ProcessRunLock() {
20   int err = ::pthread_rwlock_destroy(&m_rwlock);
21   (void)err;
22 }
23 
24 bool ProcessRunLock::ReadTryLock() {
25   ::pthread_rwlock_rdlock(&m_rwlock);
26   if (!m_running) {
27     return true;
28   }
29   ::pthread_rwlock_unlock(&m_rwlock);
30   return false;
31 }
32 
33 bool ProcessRunLock::ReadUnlock() {
34   return ::pthread_rwlock_unlock(&m_rwlock) == 0;
35 }
36 
37 bool ProcessRunLock::SetRunning() {
38   ::pthread_rwlock_wrlock(&m_rwlock);
39   m_running = true;
40   ::pthread_rwlock_unlock(&m_rwlock);
41   return true;
42 }
43 
44 bool ProcessRunLock::TrySetRunning() {
45   bool r;
46 
47   if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) {
48     r = !m_running;
49     m_running = true;
50     ::pthread_rwlock_unlock(&m_rwlock);
51     return r;
52   }
53   return false;
54 }
55 
56 bool ProcessRunLock::SetStopped() {
57   ::pthread_rwlock_wrlock(&m_rwlock);
58   m_running = false;
59   ::pthread_rwlock_unlock(&m_rwlock);
60   return true;
61 }
62 }
63 
64 #endif
65