123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //===-- tsan_mutex.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 ThreadSanitizer (TSan), a race detector.
- //
- //===----------------------------------------------------------------------===//
- #ifndef TSAN_MUTEX_H
- #define TSAN_MUTEX_H
- #include "sanitizer_common/sanitizer_atomic.h"
- #include "sanitizer_common/sanitizer_mutex.h"
- #include "tsan_defs.h"
- namespace __tsan {
- enum MutexType {
- MutexTypeInvalid,
- MutexTypeTrace,
- MutexTypeThreads,
- MutexTypeReport,
- MutexTypeSyncVar,
- MutexTypeSyncTab,
- MutexTypeSlab,
- MutexTypeAnnotations,
- MutexTypeAtExit,
- MutexTypeMBlock,
- MutexTypeJavaMBlock,
- MutexTypeDDetector,
- // This must be the last.
- MutexTypeCount
- };
- class Mutex {
- public:
- explicit Mutex(MutexType type, StatType stat_type);
- ~Mutex();
- void Lock();
- void Unlock();
- void ReadLock();
- void ReadUnlock();
- void CheckLocked();
- private:
- atomic_uintptr_t state_;
- #if TSAN_DEBUG
- MutexType type_;
- #endif
- #if TSAN_COLLECT_STATS
- StatType stat_type_;
- #endif
- Mutex(const Mutex&);
- void operator = (const Mutex&);
- };
- typedef GenericScopedLock<Mutex> Lock;
- typedef GenericScopedReadLock<Mutex> ReadLock;
- class InternalDeadlockDetector {
- public:
- InternalDeadlockDetector();
- void Lock(MutexType t);
- void Unlock(MutexType t);
- void CheckNoLocks();
- private:
- u64 seq_;
- u64 locked_[MutexTypeCount];
- };
- void InitializeMutex();
- // Checks that the current thread does not hold any runtime locks
- // (e.g. when returning from an interceptor).
- void CheckNoLocks(ThreadState *thr);
- } // namespace __tsan
- #endif // TSAN_MUTEX_H
|