Index: base/synchronization/lock_impl_posix.cc |
=================================================================== |
--- base/synchronization/lock_impl_posix.cc (revision 107048) |
+++ base/synchronization/lock_impl_posix.cc (working copy) |
@@ -12,6 +12,10 @@ |
namespace internal { |
LockImpl::LockImpl() { |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+ liveness_token_ = LT_ALIVE; |
+#endif |
+ |
#ifndef NDEBUG |
// In debug, setup attributes for lock error checking. |
pthread_mutexattr_t mta; |
@@ -30,25 +34,45 @@ |
} |
LockImpl::~LockImpl() { |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+ CheckIsAlive(); |
+ liveness_token_ = LT_DELETED; |
+#endif |
int rv = pthread_mutex_destroy(&os_lock_); |
DCHECK_EQ(rv, 0); |
} |
bool LockImpl::Try() { |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+ CheckIsAlive(); |
+#endif |
int rv = pthread_mutex_trylock(&os_lock_); |
DCHECK(rv == 0 || rv == EBUSY); |
return rv == 0; |
} |
void LockImpl::Lock() { |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+ CheckIsAlive(); |
+#endif |
int rv = pthread_mutex_lock(&os_lock_); |
DCHECK_EQ(rv, 0); |
} |
void LockImpl::Unlock() { |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+ CheckIsAlive(); |
+#endif |
int rv = pthread_mutex_unlock(&os_lock_); |
DCHECK_EQ(rv, 0); |
} |
+#ifdef LOCK_IMPL_CHECK_LIVENESS |
+void LockImpl::CheckIsAlive() { |
+ CHECK_EQ(LT_ALIVE, liveness_token_) |
+ << "Lock was invalid. Please see: http://crbug.com/102161"; |
+} |
+#endif |
+ |
} // namespace internal |
} // namespace base |