OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/discardable_memory_emulated.h" | 5 #include "base/memory/discardable_memory_emulated.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/memory/discardable_memory_manager.h" | 8 #include "base/memory/discardable_memory_manager.h" |
9 | 9 |
10 namespace base { | 10 namespace base { |
11 namespace { | 11 namespace { |
12 | 12 |
13 // This is admittedly pretty magical. | 13 // This is admittedly pretty magical. |
14 const size_t kEmulatedMemoryLimit = 512 * 1024 * 1024; | 14 const size_t kEmulatedMemoryLimit = 512 * 1024 * 1024; |
15 const size_t kEmulatedSoftMemoryLimit = 32 * 1024 * 1024; | 15 const size_t kEmulatedSoftMemoryLimit = 32 * 1024 * 1024; |
| 16 const size_t kEmulatedBytesToKeepUnderModeratePressure = 4 * 1024 * 1024; |
16 const size_t kEmulatedHardMemoryLimitExpirationTimeMs = 1000; | 17 const size_t kEmulatedHardMemoryLimitExpirationTimeMs = 1000; |
17 | 18 |
18 struct SharedState { | 19 struct SharedState { |
19 SharedState() | 20 SharedState() |
20 : manager(kEmulatedMemoryLimit, | 21 : manager(kEmulatedMemoryLimit, |
21 kEmulatedSoftMemoryLimit, | 22 kEmulatedSoftMemoryLimit, |
| 23 kEmulatedBytesToKeepUnderModeratePressure, |
22 TimeDelta::FromMilliseconds( | 24 TimeDelta::FromMilliseconds( |
23 kEmulatedHardMemoryLimitExpirationTimeMs)) {} | 25 kEmulatedHardMemoryLimitExpirationTimeMs)) {} |
24 | 26 |
25 internal::DiscardableMemoryManager manager; | 27 internal::DiscardableMemoryManager manager; |
26 }; | 28 }; |
27 LazyInstance<SharedState>::Leaky g_shared_state = LAZY_INSTANCE_INITIALIZER; | 29 LazyInstance<SharedState>::Leaky g_shared_state = LAZY_INSTANCE_INITIALIZER; |
28 | 30 |
29 } // namespace | 31 } // namespace |
30 | 32 |
31 namespace internal { | 33 namespace internal { |
32 | 34 |
33 DiscardableMemoryEmulated::DiscardableMemoryEmulated(size_t bytes) | 35 DiscardableMemoryEmulated::DiscardableMemoryEmulated(size_t bytes) |
34 : bytes_(bytes), | 36 : bytes_(bytes), |
35 is_locked_(false) { | 37 is_locked_(false) { |
36 g_shared_state.Pointer()->manager.Register(this, bytes); | 38 g_shared_state.Pointer()->manager.Register(this, bytes); |
37 } | 39 } |
38 | 40 |
39 DiscardableMemoryEmulated::~DiscardableMemoryEmulated() { | 41 DiscardableMemoryEmulated::~DiscardableMemoryEmulated() { |
40 if (is_locked_) | 42 if (is_locked_) |
41 Unlock(); | 43 Unlock(); |
42 g_shared_state.Pointer()->manager.Unregister(this); | 44 g_shared_state.Pointer()->manager.Unregister(this); |
43 } | 45 } |
44 | 46 |
45 // static | 47 // static |
| 48 void DiscardableMemoryEmulated::RegisterMemoryPressureListeners() { |
| 49 g_shared_state.Pointer()->manager.RegisterMemoryPressureListener(); |
| 50 } |
| 51 |
| 52 // static |
| 53 void DiscardableMemoryEmulated::UnregisterMemoryPressureListeners() { |
| 54 g_shared_state.Pointer()->manager.UnregisterMemoryPressureListener(); |
| 55 } |
| 56 |
| 57 // static |
46 bool DiscardableMemoryEmulated::ReduceMemoryUsage() { | 58 bool DiscardableMemoryEmulated::ReduceMemoryUsage() { |
47 return g_shared_state.Pointer()->manager.ReduceMemoryUsage(); | 59 return g_shared_state.Pointer()->manager.ReduceMemoryUsage(); |
48 } | 60 } |
49 | 61 |
50 // static | 62 // static |
51 void DiscardableMemoryEmulated::ReduceMemoryUsageUntilWithinLimit( | |
52 size_t bytes) { | |
53 g_shared_state.Pointer()->manager.ReduceMemoryUsageUntilWithinLimit(bytes); | |
54 } | |
55 | |
56 // static | |
57 void DiscardableMemoryEmulated::PurgeForTesting() { | 63 void DiscardableMemoryEmulated::PurgeForTesting() { |
58 g_shared_state.Pointer()->manager.PurgeAll(); | 64 g_shared_state.Pointer()->manager.PurgeAll(); |
59 } | 65 } |
60 | 66 |
61 bool DiscardableMemoryEmulated::Initialize() { | 67 bool DiscardableMemoryEmulated::Initialize() { |
62 return Lock() != DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; | 68 return Lock() != DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; |
63 } | 69 } |
64 | 70 |
65 DiscardableMemoryLockStatus DiscardableMemoryEmulated::Lock() { | 71 DiscardableMemoryLockStatus DiscardableMemoryEmulated::Lock() { |
66 DCHECK(!is_locked_); | 72 DCHECK(!is_locked_); |
(...skipping 26 matching lines...) Expand all Loading... |
93 memory_.reset(new uint8[bytes_]); | 99 memory_.reset(new uint8[bytes_]); |
94 return false; | 100 return false; |
95 } | 101 } |
96 | 102 |
97 void DiscardableMemoryEmulated::Purge() { | 103 void DiscardableMemoryEmulated::Purge() { |
98 memory_.reset(); | 104 memory_.reset(); |
99 } | 105 } |
100 | 106 |
101 } // namespace internal | 107 } // namespace internal |
102 } // namespace base | 108 } // namespace base |
OLD | NEW |