1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/disk_cache/blockfile/file_lock.h"
6
7#include "base/atomicops.h"
8
9namespace {
10
11void Barrier() {
12#if !defined(COMPILER_MSVC)
13  // VS uses memory barrier semantics for volatiles.
14  base::subtle::MemoryBarrier();
15#endif
16}
17
18}  // namespace
19
20namespace disk_cache {
21
22FileLock::FileLock(BlockFileHeader* header) {
23  updating_ = &header->updating;
24  (*updating_)++;
25  Barrier();
26  acquired_ = true;
27}
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