| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/disk_cache/file_lock.h" | |
| #include "base/atomicops.h" | |
| namespace { | |
| void Barrier() { | |
| #if !defined(COMPILER_MSVC) | |
| // VS uses memory barrier semantics for volatiles. | |
| base::subtle::MemoryBarrier(); | |
| #endif | |
| } | |
| } // namespace | |
| namespace disk_cache { | |
| FileLock::FileLock(BlockFileHeader* header) { | |
| updating_ = &header->updating; | |
| (*updating_)++; | |
| Barrier(); | |
| acquired_ = true; | |
| } | |
| FileLock::~FileLock() { | |
| Unlock(); | |
| } | |
| void FileLock::Lock() { | |
| if (acquired_) | |
| return; | |
| (*updating_)++; | |
| Barrier(); | |
| } | |
| void FileLock::Unlock() { | |
| if (!acquired_) | |
| return; | |
| Barrier(); | |
| (*updating_)--; | |
| } | |
| } // namespace disk_cache |