diff options
Diffstat (limited to 'deps/v8/src/sanitizer/lsan-page-allocator.cc')
-rw-r--r-- | deps/v8/src/sanitizer/lsan-page-allocator.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/deps/v8/src/sanitizer/lsan-page-allocator.cc b/deps/v8/src/sanitizer/lsan-page-allocator.cc new file mode 100644 index 0000000000..68b1f130b1 --- /dev/null +++ b/deps/v8/src/sanitizer/lsan-page-allocator.cc @@ -0,0 +1,59 @@ +// Copyright 2018 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/sanitizer/lsan-page-allocator.h" + +#include "src/base/logging.h" + +#if defined(LEAK_SANITIZER) +#include <sanitizer/lsan_interface.h> +#endif + +namespace v8 { +namespace base { + +LsanPageAllocator::LsanPageAllocator(v8::PageAllocator* page_allocator) + : page_allocator_(page_allocator), + allocate_page_size_(page_allocator_->AllocatePageSize()), + commit_page_size_(page_allocator_->CommitPageSize()) { + DCHECK_NOT_NULL(page_allocator); +} + +void* LsanPageAllocator::AllocatePages(void* address, size_t size, + size_t alignment, + PageAllocator::Permission access) { + void* result = + page_allocator_->AllocatePages(address, size, alignment, access); +#if defined(LEAK_SANITIZER) + if (result != nullptr) { + __lsan_register_root_region(result, size); + } +#endif + return result; +} + +bool LsanPageAllocator::FreePages(void* address, size_t size) { + bool result = page_allocator_->FreePages(address, size); +#if defined(LEAK_SANITIZER) + if (result) { + __lsan_unregister_root_region(address, size); + } +#endif + return result; +} + +bool LsanPageAllocator::ReleasePages(void* address, size_t size, + size_t new_size) { + bool result = page_allocator_->ReleasePages(address, size, new_size); +#if defined(LEAK_SANITIZER) + if (result) { + __lsan_unregister_root_region(address, size); + __lsan_register_root_region(address, new_size); + } +#endif + return result; +} + +} // namespace base +} // namespace v8 |