// Copyright 2016 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 "components/filesystem/lock_table.h" #include "components/filesystem/file_impl.h" namespace filesystem { LockTable::LockTable() {} LockTable::~LockTable() {} base::File::Error LockTable::LockFile(FileImpl* file) { DCHECK(file->IsValid()); DCHECK(file->path().IsAbsolute()); auto it = locked_files_.find(file->path()); if (it != locked_files_.end()) { // We're already locked; that's an error condition on Windows. return base::File::FILE_ERROR_FAILED; } base::File::Error lock_err = file->RawLockFile(); if (lock_err != base::File::FILE_OK) { // Locking failed for some reason. return lock_err; } locked_files_.insert(file->path()); return base::File::FILE_OK; } base::File::Error LockTable::UnlockFile(FileImpl* file) { auto it = locked_files_.find(file->path()); if (it != locked_files_.end()) { base::File::Error lock_err = file->RawUnlockFile(); if (lock_err != base::File::FILE_OK) { // TODO(erg): When can we fail to release a lock? NOTREACHED(); return lock_err; } locked_files_.erase(it); } return base::File::FILE_OK; } void LockTable::RemoveFromLockTable(const base::FilePath& path) { auto it = locked_files_.find(path); if (it != locked_files_.end()) locked_files_.erase(it); } } // namespace filesystem