Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 9 | #ifndef LLDB_HOST_PROCESSRUNLOCK_H |
| 10 | #define LLDB_HOST_PROCESSRUNLOCK_H |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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: |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 70 | ProcessRunLocker(const ProcessRunLocker &) = delete; |
| 71 | const ProcessRunLocker &operator=(const ProcessRunLocker &) = delete; |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 72 | }; |
| 73 | |
| 74 | protected: |
| 75 | lldb::rwlock_t m_rwlock; |
| 76 | bool m_running; |
| 77 | |
| 78 | private: |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 79 | ProcessRunLock(const ProcessRunLock &) = delete; |
| 80 | const ProcessRunLock &operator=(const ProcessRunLock &) = delete; |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 81 | }; |
| 82 | |
| 83 | } // namespace lldb_private |
| 84 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 85 | #endif // LLDB_HOST_PROCESSRUNLOCK_H |