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 LLDB_HOST_PROCESSRUNLOCK_H 10#define LLDB_HOST_PROCESSRUNLOCK_H 11 12#include <cstdint> 13#include <ctime> 14 15#include "lldb/lldb-defines.h" 16 17/// Enumerations for broadcasting. 18namespace 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 25class ProcessRunLock { 26public: 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() = default; 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 = nullptr; 68 69 private: 70 ProcessRunLocker(const ProcessRunLocker &) = delete; 71 const ProcessRunLocker &operator=(const ProcessRunLocker &) = delete; 72 }; 73 74protected: 75 lldb::rwlock_t m_rwlock; 76 bool m_running = false; 77 78private: 79 ProcessRunLock(const ProcessRunLock &) = delete; 80 const ProcessRunLock &operator=(const ProcessRunLock &) = delete; 81}; 82 83} // namespace lldb_private 84 85#endif // LLDB_HOST_PROCESSRUNLOCK_H 86