]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/include/lldb/Host/ProcessRunLock.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / include / lldb / Host / ProcessRunLock.h
1 //===-- ProcessRunLock.h ----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_ProcessRunLock_h_
11 #define liblldb_ProcessRunLock_h_
12
13 #include <stdint.h>
14 #include <time.h>
15
16 #include "lldb/lldb-defines.h"
17
18 //----------------------------------------------------------------------
19 /// Enumerations for broadcasting.
20 //----------------------------------------------------------------------
21 namespace lldb_private {
22
23 //----------------------------------------------------------------------
24 /// @class ProcessRunLock ProcessRunLock.h "lldb/Host/ProcessRunLock.h"
25 /// A class used to prevent the process from starting while other
26 /// threads are accessing its data, and prevent access to its data while it is
27 /// running.
28 //----------------------------------------------------------------------
29
30 class ProcessRunLock {
31 public:
32   ProcessRunLock();
33   ~ProcessRunLock();
34
35   bool ReadTryLock();
36   bool ReadUnlock();
37   bool SetRunning();
38   bool TrySetRunning();
39   bool SetStopped();
40
41   class ProcessRunLocker {
42   public:
43     ProcessRunLocker() : m_lock(nullptr) {}
44
45     ~ProcessRunLocker() { Unlock(); }
46
47     // Try to lock the read lock, but only do so if there are no writers.
48     bool TryLock(ProcessRunLock *lock) {
49       if (m_lock) {
50         if (m_lock == lock)
51           return true; // We already have this lock locked
52         else
53           Unlock();
54       }
55       if (lock) {
56         if (lock->ReadTryLock()) {
57           m_lock = lock;
58           return true;
59         }
60       }
61       return false;
62     }
63
64   protected:
65     void Unlock() {
66       if (m_lock) {
67         m_lock->ReadUnlock();
68         m_lock = nullptr;
69       }
70     }
71
72     ProcessRunLock *m_lock;
73
74   private:
75     DISALLOW_COPY_AND_ASSIGN(ProcessRunLocker);
76   };
77
78 protected:
79   lldb::rwlock_t m_rwlock;
80   bool m_running;
81
82 private:
83   DISALLOW_COPY_AND_ASSIGN(ProcessRunLock);
84 };
85
86 } // namespace lldb_private
87
88 #endif // liblldb_ProcessRunLock_h_