13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/lock_impl.h"
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace base {
83f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace internal {
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottLockImpl::LockImpl() {
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The second parameter is the spin count, for short-held locks it avoid the
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // contending thread from going to sleep which helps performance greatly.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::InitializeCriticalSectionAndSpinCount(&os_lock_, 2000);
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottLockImpl::~LockImpl() {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::DeleteCriticalSection(&os_lock_);
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool LockImpl::Try() {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (::TryEnterCriticalSection(&os_lock_) != FALSE) {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return true;
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return false;
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid LockImpl::Lock() {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::EnterCriticalSection(&os_lock_);
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid LockImpl::Unlock() {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::LeaveCriticalSection(&os_lock_);
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace internal
363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace base
37