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.
68     typedef SmartMutex<false> Mutex;
69 
70     template <bool mt_only>
71     using SmartScopedLock = std::lock_guard<SmartMutex<mt_only>>;
72 
73     typedef SmartScopedLock<false> ScopedLock;
74   }
75 }
76 
77 #endif
78