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