v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
lsan-page-allocator.cc
Go to the documentation of this file.
1// Copyright 2018 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
6
8#include "src/base/logging.h"
9
10#if defined(LEAK_SANITIZER)
11#include <sanitizer/lsan_interface.h>
12#endif
13
14namespace v8 {
15namespace base {
16
18 : page_allocator_(page_allocator),
19 allocate_page_size_(page_allocator_->AllocatePageSize()),
20 commit_page_size_(page_allocator_->CommitPageSize()) {
21 DCHECK_NOT_NULL(page_allocator);
22}
23
24void* LsanPageAllocator::AllocatePages(void* hint, size_t size,
25 size_t alignment,
27 void* result = page_allocator_->AllocatePages(hint, size, alignment, access);
28#if defined(LEAK_SANITIZER)
29 if (result != nullptr) {
31 __lsan_register_root_region(result, size);
32 } else {
33 // We allocate the JIT cage as RWX from the beginning und use Discard to
34 // mark the memory as unused. This makes tests with LSAN enabled 2-3x
35 // slower since it will always try to scan the area for pointers. So skip
36 // registering the JIT regions with LSAN.
37 base::MutexGuard lock(&not_registered_regions_mutex_);
38 DCHECK_EQ(0, not_registered_regions_.count(result));
39 not_registered_regions_.insert(result);
40 }
41 }
42#endif
43 return result;
44}
45
46std::unique_ptr<v8::PageAllocator::SharedMemory>
48 const void* original_address) {
49 auto result = page_allocator_->AllocateSharedPages(size, original_address);
50#if defined(LEAK_SANITIZER)
51 if (result != nullptr) {
52 __lsan_register_root_region(result->GetMemory(), size);
53 }
54#endif
55 return result;
56}
57
61
62bool LsanPageAllocator::FreePages(void* address, size_t size) {
63#if defined(LEAK_SANITIZER)
64 base::MutexGuard lock(&not_registered_regions_mutex_);
65 if (not_registered_regions_.count(address) == 0) {
66 __lsan_unregister_root_region(address, size);
67 } else {
68 not_registered_regions_.erase(address);
69 }
70#endif
71 CHECK(page_allocator_->FreePages(address, size));
72 return true;
73}
74
75bool LsanPageAllocator::ReleasePages(void* address, size_t size,
76 size_t new_size) {
77#if defined(LEAK_SANITIZER)
78 base::MutexGuard lock(&not_registered_regions_mutex_);
79 if (not_registered_regions_.count(address) == 0) {
80 __lsan_unregister_root_region(address, size);
81 __lsan_register_root_region(address, new_size);
82 }
83#endif
84 CHECK(page_allocator_->ReleasePages(address, size, new_size));
85 return true;
86}
87
88} // namespace base
89} // namespace v8
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
virtual void * AllocatePages(void *address, size_t length, size_t alignment, Permission permissions)=0
virtual bool CanAllocateSharedPages()
virtual bool FreePages(void *address, size_t length)=0
virtual std::unique_ptr< SharedMemory > AllocateSharedPages(size_t length, const void *original_address)
std::unique_ptr< SharedMemory > AllocateSharedPages(size_t size, const void *original_address) override
v8::PageAllocator *const page_allocator_
void * AllocatePages(void *address, size_t size, size_t alignment, PageAllocator::Permission access) override
bool FreePages(void *address, size_t size) override
LsanPageAllocator(v8::PageAllocator *page_allocator)
bool ReleasePages(void *address, size_t size, size_t new_size) override
cppgc::PageAllocator * page_allocator_
Definition cpp-heap.cc:194
ZoneVector< RpoNumber > & result
#define CHECK(condition)
Definition logging.h:124
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK_EQ(v1, v2)
Definition logging.h:485