1 //===- llvm/Support/Mutex.h - Mutex Operating System Concept -----*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
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"
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
>
29 std::recursive_mutex impl
;
30 unsigned acquired
= 0;
34 if (!mt_only
|| llvm_is_multithreaded()) {
38 // Single-threaded debugging code. This would be racy in
39 // multithreaded mode, but provides not sanity checks in single
47 if (!mt_only
|| llvm_is_multithreaded()) {
51 // Single-threaded debugging code. This would be racy in
52 // multithreaded mode, but provides not sanity checks in single
54 assert(acquired
&& "Lock not acquired before release!");
61 if (!mt_only
|| llvm_is_multithreaded())
62 return impl
.try_lock();
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
;