summaryrefslogtreecommitdiff
path: root/libsanitizer/asan/asan_lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'libsanitizer/asan/asan_lock.h')
-rw-r--r--libsanitizer/asan/asan_lock.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/libsanitizer/asan/asan_lock.h b/libsanitizer/asan/asan_lock.h
new file mode 100644
index 00000000000..2392e3c0e7b
--- /dev/null
+++ b/libsanitizer/asan/asan_lock.h
@@ -0,0 +1,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