1//===-- mutex.h -------------------------------------------------*- 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#ifndef GWP_ASAN_MUTEX_H_ 10#define GWP_ASAN_MUTEX_H_ 11 12#ifdef __unix__ 13#include <pthread.h> 14#else 15#error "GWP-ASan is not supported on this platform." 16#endif 17 18namespace gwp_asan { 19class Mutex { 20public: 21 constexpr Mutex() = default; 22 ~Mutex() = default; 23 Mutex(const Mutex &) = delete; 24 Mutex &operator=(const Mutex &) = delete; 25 // Lock the mutex. 26 void lock(); 27 // Nonblocking trylock of the mutex. Returns true if the lock was acquired. 28 bool tryLock(); 29 // Unlock the mutex. 30 void unlock(); 31 32private: 33#ifdef __unix__ 34 pthread_mutex_t Mu = PTHREAD_MUTEX_INITIALIZER; 35#endif // defined(__unix__) 36}; 37 38class ScopedLock { 39public: 40 explicit ScopedLock(Mutex &Mx) : Mu(Mx) { Mu.lock(); } 41 ~ScopedLock() { Mu.unlock(); } 42 ScopedLock(const ScopedLock &) = delete; 43 ScopedLock &operator=(const ScopedLock &) = delete; 44 45private: 46 Mutex Μ 47}; 48} // namespace gwp_asan 49 50#endif // GWP_ASAN_MUTEX_H_ 51