asan_lock.h   [plain text]


//===-- 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