76215bc099f65ccd6cd36299f09ea531b29b1a4a
[platform/framework/web/crosswalk-tizen.git] /
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.
4
5 #ifndef COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_
6 #define COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_
7
8 #include <stddef.h>
9
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"
19
20 namespace discardable_memory {
21
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 {
27  public:
28   class Delegate {
29    public:
30     virtual void AllocateLockedDiscardableSharedMemory(
31         size_t size,
32         DiscardableSharedMemoryId id,
33         base::SharedMemoryHandle* handle) = 0;
34     virtual void DeletedDiscardableSharedMemory(
35         DiscardableSharedMemoryId id) = 0;
36
37    protected:
38     virtual ~Delegate() {}
39   };
40
41   explicit ClientDiscardableSharedMemoryManager(Delegate* delegate);
42   ~ClientDiscardableSharedMemoryManager() override;
43
44   // Overridden from base::DiscardableMemoryAllocator:
45   std::unique_ptr<base::DiscardableMemory> AllocateLockedDiscardableMemory(
46       size_t size) override;
47
48   // Overridden from base::trace_event::MemoryDumpProvider:
49   bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
50                     base::trace_event::ProcessMemoryDump* pmd) override;
51
52   // Release memory and associated resources that have been purged.
53   void ReleaseFreeMemory();
54
55   bool LockSpan(DiscardableSharedMemoryHeap::Span* span);
56   void UnlockSpan(DiscardableSharedMemoryHeap::Span* span);
57   void ReleaseSpan(std::unique_ptr<DiscardableSharedMemoryHeap::Span> span);
58
59   base::trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
60       DiscardableSharedMemoryHeap::Span* span,
61       const char* name,
62       base::trace_event::ProcessMemoryDump* pmd) const;
63
64   struct Statistics {
65     size_t total_size;
66     size_t freelist_size;
67   };
68
69   Statistics GetStatistics() const;
70
71  private:
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;
77
78   mutable base::Lock lock_;
79   DiscardableSharedMemoryHeap heap_;
80   Delegate* const delegate_;
81
82   DISALLOW_COPY_AND_ASSIGN(ClientDiscardableSharedMemoryManager);
83 };
84
85 }  // namespace discardable_memory
86
87 #endif  // COMPONENTS_DISCARDABLE_MEMORY_CLIENT_CLIENT_DISCARDABLE_SHARED_MEMORY_MANAGER_H_