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#include "base/memory/discardable_memory.h"
6
7#include "base/logging.h"
8#include "base/memory/discardable_memory_emulated.h"
9#include "base/memory/discardable_memory_malloc.h"
10
11namespace base {
12
13// static
14void DiscardableMemory::RegisterMemoryPressureListeners() {
15  internal::DiscardableMemoryEmulated::RegisterMemoryPressureListeners();
16}
17
18// static
19void DiscardableMemory::UnregisterMemoryPressureListeners() {
20  internal::DiscardableMemoryEmulated::UnregisterMemoryPressureListeners();
21}
22
23// static
24bool DiscardableMemory::ReduceMemoryUsage() {
25  return internal::DiscardableMemoryEmulated::ReduceMemoryUsage();
26}
27
28// static
29void DiscardableMemory::GetSupportedTypes(
30    std::vector<DiscardableMemoryType>* types) {
31  const DiscardableMemoryType supported_types[] = {
32    DISCARDABLE_MEMORY_TYPE_EMULATED,
33    DISCARDABLE_MEMORY_TYPE_MALLOC
34  };
35  types->assign(supported_types, supported_types + arraysize(supported_types));
36}
37
38// static
39scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemoryWithType(
40    DiscardableMemoryType type, size_t size) {
41  switch (type) {
42    case DISCARDABLE_MEMORY_TYPE_NONE:
43    case DISCARDABLE_MEMORY_TYPE_ASHMEM:
44    case DISCARDABLE_MEMORY_TYPE_MAC:
45      return scoped_ptr<DiscardableMemory>();
46    case DISCARDABLE_MEMORY_TYPE_EMULATED: {
47      scoped_ptr<internal::DiscardableMemoryEmulated> memory(
48          new internal::DiscardableMemoryEmulated(size));
49      if (!memory->Initialize())
50        return scoped_ptr<DiscardableMemory>();
51
52      return memory.PassAs<DiscardableMemory>();
53    }
54    case DISCARDABLE_MEMORY_TYPE_MALLOC: {
55      scoped_ptr<internal::DiscardableMemoryMalloc> memory(
56          new internal::DiscardableMemoryMalloc(size));
57      if (!memory->Initialize())
58        return scoped_ptr<DiscardableMemory>();
59
60      return memory.PassAs<DiscardableMemory>();
61    }
62  }
63
64  NOTREACHED();
65  return scoped_ptr<DiscardableMemory>();
66}
67
68// static
69void DiscardableMemory::PurgeForTesting() {
70  internal::DiscardableMemoryEmulated::PurgeForTesting();
71}
72
73}  // namespace base
74