1 // Copyright 2017 the V8 project 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 V8_BASE_PAGE_ALLOCATOR_H_
6 #define V8_BASE_PAGE_ALLOCATOR_H_
7 
8 #include <memory>
9 
10 #include "include/v8-platform.h"
11 #include "src/base/base-export.h"
12 #include "src/base/compiler-specific.h"
13 
14 namespace v8 {
15 namespace base {
16 
17 class SharedMemory;
18 
19 class V8_BASE_EXPORT PageAllocator
NON_EXPORTED_BASE(::v8::PageAllocator)20     : public NON_EXPORTED_BASE(::v8::PageAllocator) {
21  public:
22   PageAllocator();
23   ~PageAllocator() override = default;
24 
25   size_t AllocatePageSize() override { return allocate_page_size_; }
26 
27   size_t CommitPageSize() override { return commit_page_size_; }
28 
29   void SetRandomMmapSeed(int64_t seed) override;
30 
31   void* GetRandomMmapAddr() override;
32 
33   void* AllocatePages(void* hint, size_t size, size_t alignment,
34                       PageAllocator::Permission access) override;
35 
36   bool CanAllocateSharedPages() override;
37 
38   std::unique_ptr<v8::PageAllocator::SharedMemory> AllocateSharedPages(
39       size_t size, const void* original_address) override;
40 
41   bool FreePages(void* address, size_t size) override;
42 
43   bool ReleasePages(void* address, size_t size, size_t new_size) override;
44 
45   bool SetPermissions(void* address, size_t size,
46                       PageAllocator::Permission access) override;
47 
48   bool DiscardSystemPages(void* address, size_t size) override;
49 
50   bool DecommitPages(void* address, size_t size) override;
51 
52  private:
53   friend class v8::base::SharedMemory;
54 
55   void* RemapShared(void* old_address, void* new_address, size_t size);
56 
57   const size_t allocate_page_size_;
58   const size_t commit_page_size_;
59 };
60 
61 }  // namespace base
62 }  // namespace v8
63 #endif  // V8_BASE_PAGE_ALLOCATOR_H_
64