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)20void DiscardableMemoryAllocator::SetInstance( 21 DiscardableMemoryAllocator* allocator) { 22 DCHECK(!allocator || !g_discardable_allocator); 23 g_discardable_allocator = allocator; 24 } 25 26 // static GetInstance()27DiscardableMemoryAllocator* 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)33DiscardableMemoryAllocator::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