1 //===-- ProcessRunLock.h ----------------------------------------*- C++ -*-===// 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 liblldb_ProcessRunLock_h_ 10 #define liblldb_ProcessRunLock_h_ 11 12 #include <stdint.h> 13 #include <time.h> 14 15 #include "lldb/lldb-defines.h" 16 17 /// Enumerations for broadcasting. 18 namespace lldb_private { 19 20 /// \class ProcessRunLock ProcessRunLock.h "lldb/Host/ProcessRunLock.h" 21 /// A class used to prevent the process from starting while other 22 /// threads are accessing its data, and prevent access to its data while it is 23 /// running. 24 25 class ProcessRunLock { 26 public: 27 ProcessRunLock(); 28 ~ProcessRunLock(); 29 30 bool ReadTryLock(); 31 bool ReadUnlock(); 32 bool SetRunning(); 33 bool TrySetRunning(); 34 bool SetStopped(); 35 36 class ProcessRunLocker { 37 public: 38 ProcessRunLocker() : m_lock(nullptr) {} 39 40 ~ProcessRunLocker() { Unlock(); } 41 42 // Try to lock the read lock, but only do so if there are no writers. 43 bool TryLock(ProcessRunLock *lock) { 44 if (m_lock) { 45 if (m_lock == lock) 46 return true; // We already have this lock locked 47 else 48 Unlock(); 49 } 50 if (lock) { 51 if (lock->ReadTryLock()) { 52 m_lock = lock; 53 return true; 54 } 55 } 56 return false; 57 } 58 59 protected: 60 void Unlock() { 61 if (m_lock) { 62 m_lock->ReadUnlock(); 63 m_lock = nullptr; 64 } 65 } 66 67 ProcessRunLock *m_lock; 68 69 private: 70 DISALLOW_COPY_AND_ASSIGN(ProcessRunLocker); 71 }; 72 73 protected: 74 lldb::rwlock_t m_rwlock; 75 bool m_running; 76 77 private: 78 DISALLOW_COPY_AND_ASSIGN(ProcessRunLock); 79 }; 80 81 } // namespace lldb_private 82 83 #endif // liblldb_ProcessRunLock_h_ 84