1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <errno.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/mman.h>
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid* MappedFile::Init(const FilePath& name, size_t size) {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(!init_);
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (init_ || !File::Init(name))
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return NULL;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!size)
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    size = GetLength();
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  buffer_ = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 platform_file(), 0);
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  init_ = true;
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(reinterpret_cast<intptr_t>(buffer_) != -1);
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (reinterpret_cast<intptr_t>(buffer_) == -1)
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    buffer_ = 0;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  view_size_ = size;
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return buffer_;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool MappedFile::Load(const FileBlock* block) {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t offset = block->offset() + view_size_;
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Read(block->buffer(), block->size(), offset);
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool MappedFile::Store(const FileBlock* block) {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t offset = block->offset() + view_size_;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Write(block->buffer(), block->size(), offset);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMappedFile::~MappedFile() {
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!init_)
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (buffer_) {
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int ret = munmap(buffer_, view_size_);
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(0 == ret);
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace disk_cache
56