file_lock.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/disk_cache/blockfile/file_lock.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/atomicops.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Barrier() {
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(COMPILER_MSVC)
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // VS uses memory barrier semantics for volatiles.
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::subtle::MemoryBarrier();
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace disk_cache {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben MurdochFileLock::FileLock(BlockFileHeader* header) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  updating_ = &header->updating;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  (*updating_)++;
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Barrier();
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  acquired_ = true;
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
28
29FileLock::~FileLock() {
30  Unlock();
31}
32
33void FileLock::Lock() {
34  if (acquired_)
35    return;
36  (*updating_)++;
37  Barrier();
38}
39
40void FileLock::Unlock() {
41  if (!acquired_)
42    return;
43  Barrier();
44  (*updating_)--;
45}
46
47}  // namespace disk_cache
48