1 // Copyright 2019 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 BASE_MEMORY_MADV_FREE_DISCARDABLE_MEMORY_ALLOCATOR_POSIX_H_
6 #define BASE_MEMORY_MADV_FREE_DISCARDABLE_MEMORY_ALLOCATOR_POSIX_H_
7 
8 #include <stddef.h>
9 
10 #include <atomic>
11 #include <memory>
12 
13 #include "base/base_export.h"
14 #include "base/bind.h"
15 #include "base/callback.h"
16 #include "base/macros.h"
17 #include "base/memory/discardable_memory.h"
18 #include "base/memory/discardable_memory_allocator.h"
19 #include "base/memory/madv_free_discardable_memory_posix.h"
20 #include "base/trace_event/base_tracing.h"
21 #include "build/build_config.h"
22 
23 namespace base {
24 class BASE_EXPORT MadvFreeDiscardableMemoryAllocatorPosix
25     : public DiscardableMemoryAllocator,
26       public base::trace_event::MemoryDumpProvider {
27  public:
28   MadvFreeDiscardableMemoryAllocatorPosix();
29   ~MadvFreeDiscardableMemoryAllocatorPosix() override;
30 
31   std::unique_ptr<DiscardableMemory> AllocateLockedDiscardableMemory(
32       size_t size) override;
33 
34   size_t GetBytesAllocated() const override;
35 
ReleaseFreeMemory()36   void ReleaseFreeMemory() override {
37     // Do nothing, since MADV_FREE discardable memory does not keep any memory
38     // overhead that can be released.
39   }
40 
41   bool OnMemoryDump(const trace_event::MemoryDumpArgs& args,
42                     trace_event::ProcessMemoryDump* pmd) override;
43 
44  private:
45   std::atomic<size_t> bytes_allocated_{0};
46 
47   DISALLOW_COPY_AND_ASSIGN(MadvFreeDiscardableMemoryAllocatorPosix);
48 };
49 }  // namespace base
50 
51 #endif  // BASE_MEMORY_MADV_FREE_DISCARDABLE_MEMORY_ALLOCATOR_POSIX_H_
52