Move hot routine out of mutex.cc.
Change-Id: I06c48481f0072e93dc2c23d4fd5e562f13003673
diff --git a/src/base/mutex-inl.h b/src/base/mutex-inl.h
index 03ec6f8..122fad5 100644
--- a/src/base/mutex-inl.h
+++ b/src/base/mutex-inl.h
@@ -77,6 +77,34 @@
}
}
+inline void BaseMutex::RegisterAsLocked(Thread* self) {
+ if (UNLIKELY(self == NULL)) {
+ CheckUnattachedThread(level_);
+ return;
+ }
+ if (kDebugLocking) {
+ // Check if a bad Mutex of this level or lower is held.
+ bool bad_mutexes_held = false;
+ for (int i = level_; i >= 0; --i) {
+ BaseMutex* held_mutex = self->GetHeldMutex(static_cast<LockLevel>(i));
+ if (UNLIKELY(held_mutex != NULL)) {
+ LOG(ERROR) << "Lock level violation: holding \"" << held_mutex->name_ << "\" (level " << i
+ << ") while locking \"" << name_ << "\" (level " << static_cast<int>(level_) << ")";
+ if (i > kAbortLock) {
+ // Only abort in the check below if this is more than abort level lock.
+ bad_mutexes_held = true;
+ }
+ }
+ }
+ CHECK(!bad_mutexes_held);
+ }
+ // Don't record monitors as they are outside the scope of analysis. They may be inspected off of
+ // the monitor list.
+ if (level_ != kMonitorLock) {
+ self->SetHeldMutex(level_, this);
+ }
+}
+
inline void BaseMutex::RegisterAsUnlocked(Thread* self) {
if (UNLIKELY(self == NULL)) {
CheckUnattachedThread(level_);