• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- asan_lock.h ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of AddressSanitizer, an address sanity checker.
11 //
12 // A wrapper for a simple lock.
13 //===----------------------------------------------------------------------===//
14 #ifndef ASAN_LOCK_H
15 #define ASAN_LOCK_H
16 
17 #include "asan_internal.h"
18 
19 // The locks in ASan are global objects and they are never destroyed to avoid
20 // at-exit races (that is, a lock is being used by other threads while the main
21 // thread is doing atexit destructors).
22 // We define the class using opaque storage to avoid including system headers.
23 
24 namespace __asan {
25 
26 class AsanLock {
27  public:
28   explicit AsanLock(LinkerInitialized);
29   void Lock();
30   void Unlock();
IsLocked()31   bool IsLocked() { return owner_ != 0; }
32  private:
33   uintptr_t opaque_storage_[10];
34   uintptr_t owner_;  // for debugging and for malloc_introspection_t interface
35 };
36 
37 class ScopedLock {
38  public:
ScopedLock(AsanLock * mu)39   explicit ScopedLock(AsanLock *mu) : mu_(mu) {
40     mu_->Lock();
41   }
~ScopedLock()42   ~ScopedLock() {
43     mu_->Unlock();
44   }
45  private:
46   AsanLock *mu_;
47 };
48 
49 }  // namespace __asan
50 
51 #endif  // ASAN_LOCK_H
52