LLVM  10.0.0svn
Mutex.h
Go to the documentation of this file.
1 //===- llvm/Support/Mutex.h - Mutex Operating System Concept -----*- 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 // This file declares the llvm::sys::Mutex class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_SUPPORT_MUTEX_H
14 #define LLVM_SUPPORT_MUTEX_H
15 
16 #include "llvm/Support/Threading.h"
17 #include <cassert>
18 #include <mutex>
19 
20 namespace llvm
21 {
22  namespace sys
23  {
24  /// SmartMutex - A mutex with a compile time constant parameter that
25  /// indicates whether this mutex should become a no-op when we're not
26  /// running in multithreaded mode.
27  template<bool mt_only>
28  class SmartMutex {
29  std::recursive_mutex impl;
30  unsigned acquired = 0;
31 
32  public:
33  bool lock() {
34  if (!mt_only || llvm_is_multithreaded()) {
35  impl.lock();
36  return true;
37  } else {
38  // Single-threaded debugging code. This would be racy in
39  // multithreaded mode, but provides not sanity checks in single
40  // threaded mode.
41  ++acquired;
42  return true;
43  }
44  }
45 
46  bool unlock() {
47  if (!mt_only || llvm_is_multithreaded()) {
48  impl.unlock();
49  return true;
50  } else {
51  // Single-threaded debugging code. This would be racy in
52  // multithreaded mode, but provides not sanity checks in single
53  // threaded mode.
54  assert(acquired && "Lock not acquired before release!");
55  --acquired;
56  return true;
57  }
58  }
59 
60  bool try_lock() {
61  if (!mt_only || llvm_is_multithreaded())
62  return impl.try_lock();
63  else return true;
64  }
65  };
66 
67  /// Mutex - A standard, always enforced mutex.
69 
70  template <bool mt_only>
71  using SmartScopedLock = std::lock_guard<SmartMutex<mt_only>>;
72 
74  }
75 }
76 
77 #endif
This class represents lattice values for constants.
Definition: AllocatorList.h:23
SmartMutex - A mutex with a compile time constant parameter that indicates whether this mutex should ...
Definition: Mutex.h:28
SmartMutex< false > Mutex
Mutex - A standard, always enforced mutex.
Definition: Mutex.h:68
bool llvm_is_multithreaded()
Returns true if LLVM is compiled with support for multi-threading, and false otherwise.
Definition: Threading.cpp:30
SmartScopedLock< false > ScopedLock
Definition: Mutex.h:73
std::lock_guard< SmartMutex< mt_only > > SmartScopedLock
Definition: Mutex.h:71
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())