aboutsummaryrefslogtreecommitdiff
path: root/lib/asan/asan_lock.h
blob: edee49adf6a7e523bca319f381c9d6d9b0af8548 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//===-- asan_lock.h ---------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of AddressSanitizer, an address sanity checker.
//
// A wrapper for a simple lock.
//===----------------------------------------------------------------------===//
#ifndef ASAN_LOCK_H
#define ASAN_LOCK_H

#include "sanitizer_common/sanitizer_mutex.h"
#include "asan_internal.h"

// The locks in ASan are global objects and they are never destroyed to avoid
// at-exit races (that is, a lock is being used by other threads while the main
// thread is doing atexit destructors).
// We define the class using opaque storage to avoid including system headers.

namespace __asan {

class AsanLock {
 public:
  explicit AsanLock(LinkerInitialized);
  void Lock();
  void Unlock();
  bool IsLocked() { return owner_ != 0; }
 private:
  uptr opaque_storage_[10];
  uptr owner_;  // for debugging and for malloc_introspection_t interface
};

typedef GenericScopedLock<AsanLock> ScopedLock;

}  // namespace __asan

#endif  // ASAN_LOCK_H