aboutsummaryrefslogtreecommitdiff
path: root/libsanitizer/asan/asan_lock.h
blob: 2392e3c0e7b5a18275c5ff81d713d35ce9c71501 (plain)
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
//===-- asan_lock.h ---------------------------------------------*- C++ -*-===//
//
// 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