13cab2bb3Spatrick //===-- mutex.h -------------------------------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick 93cab2bb3Spatrick #ifndef GWP_ASAN_MUTEX_H_ 103cab2bb3Spatrick #define GWP_ASAN_MUTEX_H_ 113cab2bb3Spatrick 12*d89ec533Spatrick #include "gwp_asan/platform_specific/mutex_fuchsia.h" // IWYU pragma: keep 13*d89ec533Spatrick #include "gwp_asan/platform_specific/mutex_posix.h" // IWYU pragma: keep 143cab2bb3Spatrick 153cab2bb3Spatrick namespace gwp_asan { 16*d89ec533Spatrick class Mutex final : PlatformMutex { 173cab2bb3Spatrick public: 183cab2bb3Spatrick constexpr Mutex() = default; 193cab2bb3Spatrick ~Mutex() = default; 203cab2bb3Spatrick Mutex(const Mutex &) = delete; 213cab2bb3Spatrick Mutex &operator=(const Mutex &) = delete; 223cab2bb3Spatrick // Lock the mutex. 233cab2bb3Spatrick void lock(); 243cab2bb3Spatrick // Nonblocking trylock of the mutex. Returns true if the lock was acquired. 253cab2bb3Spatrick bool tryLock(); 263cab2bb3Spatrick // Unlock the mutex. 273cab2bb3Spatrick void unlock(); 283cab2bb3Spatrick }; 293cab2bb3Spatrick 303cab2bb3Spatrick class ScopedLock { 313cab2bb3Spatrick public: ScopedLock(Mutex & Mx)323cab2bb3Spatrick explicit ScopedLock(Mutex &Mx) : Mu(Mx) { Mu.lock(); } ~ScopedLock()333cab2bb3Spatrick ~ScopedLock() { Mu.unlock(); } 343cab2bb3Spatrick ScopedLock(const ScopedLock &) = delete; 353cab2bb3Spatrick ScopedLock &operator=(const ScopedLock &) = delete; 363cab2bb3Spatrick 373cab2bb3Spatrick private: 383cab2bb3Spatrick Mutex Μ 393cab2bb3Spatrick }; 403cab2bb3Spatrick } // namespace gwp_asan 413cab2bb3Spatrick 423cab2bb3Spatrick #endif // GWP_ASAN_MUTEX_H_ 43