• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium Authors
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_allocator.h"
6 
7 #include <utility>
8 
9 #include "base/check.h"
10 #include "base/process/memory.h"
11 
12 namespace base {
13 namespace {
14 
15 DiscardableMemoryAllocator* g_discardable_allocator = nullptr;
16 
17 }  // namespace
18 
19 // static
SetInstance(DiscardableMemoryAllocator * allocator)20 void DiscardableMemoryAllocator::SetInstance(
21     DiscardableMemoryAllocator* allocator) {
22   DCHECK(!allocator || !g_discardable_allocator);
23   g_discardable_allocator = allocator;
24 }
25 
26 // static
GetInstance()27 DiscardableMemoryAllocator* DiscardableMemoryAllocator::GetInstance() {
28   DCHECK(g_discardable_allocator);
29   return g_discardable_allocator;
30 }
31 
32 std::unique_ptr<base::DiscardableMemory>
AllocateLockedDiscardableMemoryWithRetryOrDie(size_t size,OnceClosure on_no_memory)33 DiscardableMemoryAllocator::AllocateLockedDiscardableMemoryWithRetryOrDie(
34     size_t size,
35     OnceClosure on_no_memory) {
36   auto* allocator = GetInstance();
37   auto memory = allocator->AllocateLockedDiscardableMemory(size);
38   if (memory)
39     return memory;
40 
41   std::move(on_no_memory).Run();
42   // The call above will likely have freed some memory, which will end up in the
43   // freelist. To actually reduce memory footprint, need to empty the freelist
44   // as well.
45   ReleaseFreeMemory();
46 
47   memory = allocator->AllocateLockedDiscardableMemory(size);
48   if (!memory)
49     TerminateBecauseOutOfMemory(size);
50 
51   return memory;
52 }
53 
54 }  // namespace base
55