1 // Copyright 2014 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.
5 #ifndef COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_
6 #define COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_
10 #include "base/macros.h"
11 #include "base/memory/discardable_memory_allocator.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/shared_memory_handle.h"
14 #include "base/synchronization/lock.h"
15 #include "base/trace_event/memory_dump_provider.h"
16 #include "components/discardable_memory/common/discardable_memory_export.h"
17 #include "components/discardable_memory/common/discardable_shared_memory_heap.h"
18 #include "components/discardable_memory/common/discardable_shared_memory_id.h"
20 namespace discardable_memory {
22 // Implementation of DiscardableMemoryAllocator that allocates
23 // discardable memory segments through the browser process.
24 class DISCARDABLE_MEMORY_EXPORT ClientDiscardableSharedMemoryManager
25 : public base::DiscardableMemoryAllocator,
26 public base::trace_event::MemoryDumpProvider {
30 virtual void AllocateLockedDiscardableSharedMemory(
32 DiscardableSharedMemoryId id,
33 base::SharedMemoryHandle* handle) = 0;
34 virtual void DeletedDiscardableSharedMemory(
35 DiscardableSharedMemoryId id) = 0;
38 virtual ~Delegate() {}
41 explicit ClientDiscardableSharedMemoryManager(Delegate* delegate);
42 ~ClientDiscardableSharedMemoryManager() override;
44 // Overridden from base::DiscardableMemoryAllocator:
45 std::unique_ptr<base::DiscardableMemory> AllocateLockedDiscardableMemory(
46 size_t size) override;
48 // Overridden from base::trace_event::MemoryDumpProvider:
49 bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
50 base::trace_event::ProcessMemoryDump* pmd) override;
52 // Release memory and associated resources that have been purged.
53 void ReleaseFreeMemory();
55 bool LockSpan(DiscardableSharedMemoryHeap::Span* span);
56 void UnlockSpan(DiscardableSharedMemoryHeap::Span* span);
57 void ReleaseSpan(std::unique_ptr<DiscardableSharedMemoryHeap::Span> span);
59 base::trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
60 DiscardableSharedMemoryHeap::Span* span,
62 base::trace_event::ProcessMemoryDump* pmd) const;
69 Statistics GetStatistics() const;
72 std::unique_ptr<base::DiscardableSharedMemory>
73 AllocateLockedDiscardableSharedMemory(size_t size,
74 DiscardableSharedMemoryId id);
75 void MemoryUsageChanged(size_t new_bytes_allocated,
76 size_t new_bytes_free) const;
78 mutable base::Lock lock_;
79 DiscardableSharedMemoryHeap heap_;
80 Delegate* const delegate_;
82 DISALLOW_COPY_AND_ASSIGN(ClientDiscardableSharedMemoryManager);
85 } // namespace discardable_memory
87 #endif // COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_