Coverage Report

Created: 2022-01-25 06:29

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Host/ProcessRunLock.h
Line
Count
Source (jump to first uncovered line)
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.
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
392k
    ProcessRunLocker() = default;
39
40
392k
    ~ProcessRunLocker() { Unlock(); }
41
42
    // Try to lock the read lock, but only do so if there are no writers.
43
391k
    bool TryLock(ProcessRunLock *lock) {
44
391k
      if (m_lock) {
45
0
        if (m_lock == lock)
46
0
          return true; // We already have this lock locked
47
0
        else
48
0
          Unlock();
49
0
      }
50
391k
      if (lock) {
51
391k
        if (lock->ReadTryLock()) {
52
390k
          m_lock = lock;
53
390k
          return true;
54
390k
        }
55
391k
      }
56
8
      return false;
57
391k
    }
58
59
  protected:
60
392k
    void Unlock() {
61
392k
      if (m_lock) {
62
390k
        m_lock->ReadUnlock();
63
390k
        m_lock = nullptr;
64
390k
      }
65
392k
    }
66
67
    ProcessRunLock *m_lock = nullptr;
68
69
  private:
70
    ProcessRunLocker(const ProcessRunLocker &) = delete;
71
    const ProcessRunLocker &operator=(const ProcessRunLocker &) = delete;
72
  };
73
74
protected:
75
  lldb::rwlock_t m_rwlock;
76
  bool m_running = false;
77
78
private:
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