1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 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 "base/test/test_file_util.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/mman.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <errno.h>
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace file_util {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool EvictFileFromSystemCache(const FilePath& file) {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // There aren't any really direct ways to purge a file from the UBC.  From
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // talking with Amit Singh, the safest is to mmap the file with MAP_FILE (the
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // default) + MAP_SHARED, then do an msync to invalidate the memory.  The next
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // open should then have to load the file from disk.
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::MemoryMappedFile mapped_file;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!mapped_file.Initialize(file)) {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DLOG(WARNING) << "failed to memory map " << file.value();
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (msync(const_cast<uint8*>(mapped_file.data()), mapped_file.length(),
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            MS_INVALIDATE) != 0) {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DLOG(WARNING) << "failed to invalidate memory map of " << file.value()
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        << ", errno: " << errno;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace file_util
37