1// Copyright 2013 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#ifndef BASE_MEMORY_DISCARDABLE_MEMORY_EMULATED_H_
6#define BASE_MEMORY_DISCARDABLE_MEMORY_EMULATED_H_
7
8#include "base/memory/discardable_memory.h"
9
10#include "base/memory/discardable_memory_manager.h"
11
12namespace base {
13namespace internal {
14
15class DiscardableMemoryEmulated
16    : public DiscardableMemory,
17      public internal::DiscardableMemoryManagerAllocation {
18 public:
19  explicit DiscardableMemoryEmulated(size_t bytes);
20  virtual ~DiscardableMemoryEmulated();
21
22  static bool ReduceMemoryUsage();
23
24  // TODO(reveman): Remove this as it is breaking the discardable memory design
25  // principle that implementations should not rely on information this is
26  // unavailable in kernel space. crbug.com/400423
27  BASE_EXPORT static void ReduceMemoryUsageUntilWithinLimit(size_t bytes);
28
29  static void PurgeForTesting();
30
31  bool Initialize();
32
33  // Overridden from DiscardableMemory:
34  virtual DiscardableMemoryLockStatus Lock() OVERRIDE;
35  virtual void Unlock() OVERRIDE;
36  virtual void* Memory() const OVERRIDE;
37
38  // Overridden from internal::DiscardableMemoryManagerAllocation:
39  virtual bool AllocateAndAcquireLock() OVERRIDE;
40  virtual void ReleaseLock() OVERRIDE {}
41  virtual void Purge() OVERRIDE;
42
43 private:
44  const size_t bytes_;
45  scoped_ptr<uint8[]> memory_;
46  bool is_locked_;
47
48  DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryEmulated);
49};
50
51}  // namespace internal
52}  // namespace base
53
54#endif  // BASE_MEMORY_DISCARDABLE_MEMORY_EMULATED_H_
55