[llvm] [cmake] Add possibility to use ChooseMSVCCRT.cmake when include LLVM library
[llvm-core.git] / include / llvm / Support / Mutex.h
blob1d8a0d3c87cb602e78fc83dd4f2598b67e8ef136
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.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_SUPPORT_MUTEX_H
14 #define LLVM_SUPPORT_MUTEX_H
16 #include "llvm/Support/Threading.h"
17 #include <cassert>
18 #include <mutex>
20 namespace llvm
22 namespace sys
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;
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;
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;
60 bool try_lock() {
61 if (!mt_only || llvm_is_multithreaded())
62 return impl.try_lock();
63 else return true;
67 /// Mutex - A standard, always enforced mutex.
68 typedef SmartMutex<false> Mutex;
70 template <bool mt_only>
71 using SmartScopedLock = std::lock_guard<SmartMutex<mt_only>>;
73 typedef SmartScopedLock<false> ScopedLock;
77 #endif