| Index: net/disk_cache/flash/log_structured_store.cc
|
| diff --git a/net/disk_cache/flash/log_structured_store.cc b/net/disk_cache/flash/log_structured_store.cc
|
| deleted file mode 100644
|
| index f372de0369582b58de306f4e2ca1e420a2ca686e..0000000000000000000000000000000000000000
|
| --- a/net/disk_cache/flash/log_structured_store.cc
|
| +++ /dev/null
|
| @@ -1,175 +0,0 @@
|
| -// 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 "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/stl_util.h"
|
| -#include "net/disk_cache/flash/format.h"
|
| -#include "net/disk_cache/flash/log_structured_store.h"
|
| -#include "net/disk_cache/flash/segment.h"
|
| -#include "net/disk_cache/flash/storage.h"
|
| -
|
| -namespace disk_cache {
|
| -
|
| -LogStructuredStore::LogStructuredStore(Storage* storage)
|
| - : storage_(storage),
|
| - num_segments_(storage->size() / kFlashSegmentSize),
|
| - open_segments_(num_segments_),
|
| - write_index_(0),
|
| - current_entry_id_(-1),
|
| - current_entry_num_bytes_left_to_write_(0),
|
| - init_(false),
|
| - closed_(false) {
|
| - DCHECK(storage->size() % kFlashSegmentSize == 0);
|
| -}
|
| -
|
| -LogStructuredStore::~LogStructuredStore() {
|
| - DCHECK(!init_ || closed_);
|
| - STLDeleteElements(&open_segments_);
|
| -}
|
| -
|
| -bool LogStructuredStore::Init() {
|
| - DCHECK(!init_);
|
| - // TODO(agayev): Once we start persisting segment metadata to disk, we will
|
| - // start from where we left off during the last shutdown.
|
| - scoped_ptr<Segment> segment(new Segment(write_index_, false, storage_));
|
| - if (!segment->Init())
|
| - return false;
|
| -
|
| - segment->AddUser();
|
| - open_segments_[write_index_] = segment.release();
|
| - init_ = true;
|
| - return true;
|
| -}
|
| -
|
| -bool LogStructuredStore::Close() {
|
| - DCHECK(init_ && !closed_);
|
| - open_segments_[write_index_]->ReleaseUser();
|
| - if (!open_segments_[write_index_]->Close())
|
| - return false;
|
| - closed_ = true;
|
| - return true;
|
| - // TODO(agayev): persist metadata to disk.
|
| -}
|
| -
|
| -bool LogStructuredStore::CreateEntry(int32 size, int32* id) {
|
| - DCHECK(init_ && !closed_);
|
| - DCHECK(current_entry_id_ == -1 && size <= disk_cache::kFlashSegmentFreeSpace);
|
| -
|
| - // TODO(agayev): Avoid large entries from leaving the segments almost empty.
|
| - if (!open_segments_[write_index_]->CanHold(size)) {
|
| - if (!open_segments_[write_index_]->Close())
|
| - return false;
|
| -
|
| - open_segments_[write_index_]->ReleaseUser();
|
| - if (open_segments_[write_index_]->HasNoUsers()) {
|
| - delete open_segments_[write_index_];
|
| - open_segments_[write_index_] = NULL;
|
| - }
|
| -
|
| - write_index_ = GetNextSegmentIndex();
|
| - scoped_ptr<Segment> segment(new Segment(write_index_, false, storage_));
|
| - if (!segment->Init())
|
| - return false;
|
| -
|
| - segment->AddUser();
|
| - open_segments_[write_index_] = segment.release();
|
| - }
|
| -
|
| - *id = open_segments_[write_index_]->write_offset();
|
| - open_segments_[write_index_]->StoreOffset(*id);
|
| - current_entry_id_ = *id;
|
| - current_entry_num_bytes_left_to_write_ = size;
|
| - open_entries_.insert(current_entry_id_);
|
| - return true;
|
| -}
|
| -
|
| -bool LogStructuredStore::WriteData(const void* buffer, int32 size) {
|
| - DCHECK(init_ && !closed_);
|
| - DCHECK(current_entry_id_ != -1 &&
|
| - size <= current_entry_num_bytes_left_to_write_);
|
| - if (open_segments_[write_index_]->WriteData(buffer, size)) {
|
| - current_entry_num_bytes_left_to_write_ -= size;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool LogStructuredStore::OpenEntry(int32 id) {
|
| - DCHECK(init_ && !closed_);
|
| - if (open_entries_.find(id) != open_entries_.end())
|
| - return false;
|
| -
|
| - // Segment is already open.
|
| - int32 index = id / disk_cache::kFlashSegmentSize;
|
| - if (open_segments_[index]) {
|
| - if (!open_segments_[index]->HaveOffset(id))
|
| - return false;
|
| - open_segments_[index]->AddUser();
|
| - open_entries_.insert(id);
|
| - return true;
|
| - }
|
| -
|
| - // Segment is not open.
|
| - scoped_ptr<Segment> segment(new Segment(index, true, storage_));
|
| - if (!segment->Init() || !segment->HaveOffset(id))
|
| - return false;
|
| -
|
| - segment->AddUser();
|
| - open_segments_[index] = segment.release();
|
| - open_entries_.insert(id);
|
| - return true;
|
| -}
|
| -
|
| -bool LogStructuredStore::ReadData(int32 id, void* buffer, int32 size,
|
| - int32 offset) const {
|
| - DCHECK(init_ && !closed_);
|
| - DCHECK(open_entries_.find(id) != open_entries_.end());
|
| -
|
| - int32 index = id / disk_cache::kFlashSegmentSize;
|
| - DCHECK(open_segments_[index] && open_segments_[index]->HaveOffset(id));
|
| - return open_segments_[index]->ReadData(buffer, size, id + offset);
|
| -}
|
| -
|
| -void LogStructuredStore::CloseEntry(int32 id) {
|
| - DCHECK(init_ && !closed_);
|
| - std::set<int32>::iterator entry_iter = open_entries_.find(id);
|
| - DCHECK(entry_iter != open_entries_.end());
|
| -
|
| - if (current_entry_id_ != -1) {
|
| - DCHECK(id == current_entry_id_ && !current_entry_num_bytes_left_to_write_);
|
| - open_entries_.erase(entry_iter);
|
| - current_entry_id_ = -1;
|
| - return;
|
| - }
|
| -
|
| - int32 index = id / disk_cache::kFlashSegmentSize;
|
| - DCHECK(open_segments_[index]);
|
| - open_entries_.erase(entry_iter);
|
| -
|
| - open_segments_[index]->ReleaseUser();
|
| - if (open_segments_[index]->HasNoUsers()) {
|
| - delete open_segments_[index];
|
| - open_segments_[index] = NULL;
|
| - }
|
| -}
|
| -
|
| -int32 LogStructuredStore::GetNextSegmentIndex() {
|
| - DCHECK(init_ && !closed_);
|
| - int32 next_index = (write_index_ + 1) % num_segments_;
|
| -
|
| - while (InUse(next_index)) {
|
| - next_index = (next_index + 1) % num_segments_;
|
| - DCHECK_NE(next_index, write_index_);
|
| - }
|
| - return next_index;
|
| -}
|
| -
|
| -bool LogStructuredStore::InUse(int32 index) const {
|
| - DCHECK(init_ && !closed_);
|
| - DCHECK(index >= 0 && index < num_segments_);
|
| - return open_segments_[index] != NULL;
|
| -}
|
| -
|
| -} // namespace disk_cache
|
|
|