15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is used for debugging assertion support.  The Lock class
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is functionally a wrapper around the LockImpl class, so the only
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// real intelligence in the class is in the debugging logic.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Lock::Lock() : lock_() {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Lock::~Lock() {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(owning_thread_ref_.is_null());
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Lock::AssertAcquired() const {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(owning_thread_ref_ == PlatformThread::CurrentRef());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Lock::CheckHeldAndUnmark() {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(owning_thread_ref_ == PlatformThread::CurrentRef());
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  owning_thread_ref_ = PlatformThreadRef();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Lock::CheckUnheldAndMark() {
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(owning_thread_ref_.is_null());
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  owning_thread_ref_ = PlatformThread::CurrentRef();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // !NDEBUG || DCHECK_ALWAYS_ON
40