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