%PDF- %PDF-
| Direktori : /home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/cppgc/ |
| Current File : //home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/cppgc/caged-heap.h |
// Copyright 2020 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.
#ifndef V8_HEAP_CPPGC_CAGED_HEAP_H_
#define V8_HEAP_CPPGC_CAGED_HEAP_H_
#include <limits>
#include <memory>
#include "include/cppgc/internal/caged-heap.h"
#include "include/cppgc/platform.h"
#include "src/base/bounded-page-allocator.h"
#include "src/base/lazy-instance.h"
#include "src/base/platform/mutex.h"
#include "src/heap/cppgc/globals.h"
#include "src/heap/cppgc/virtual-memory.h"
namespace cppgc {
namespace internal {
namespace testing {
class TestWithHeap;
}
class V8_EXPORT_PRIVATE CagedHeap final {
public:
using AllocatorType = v8::base::BoundedPageAllocator;
template <typename RetType = uintptr_t>
static RetType OffsetFromAddress(const void* address) {
static_assert(std::numeric_limits<RetType>::max() >=
(api_constants::kCagedHeapMaxReservationSize - 1),
"The return type should be large enough");
return reinterpret_cast<uintptr_t>(address) &
(api_constants::kCagedHeapReservationAlignment - 1);
}
static uintptr_t BaseFromAddress(const void* address) {
return reinterpret_cast<uintptr_t>(address) &
~(api_constants::kCagedHeapReservationAlignment - 1);
}
static void InitializeIfNeeded(PageAllocator& platform_allocator,
size_t desired_heap_size);
static CagedHeap& Instance();
CagedHeap(const CagedHeap&) = delete;
CagedHeap& operator=(const CagedHeap&) = delete;
AllocatorType& page_allocator() { return *page_bounded_allocator_; }
const AllocatorType& page_allocator() const {
return *page_bounded_allocator_;
}
bool IsOnHeap(const void* address) const {
DCHECK_EQ(reserved_area_.address(),
reinterpret_cast<void*>(CagedHeapBase::GetBase()));
return reinterpret_cast<void*>(BaseFromAddress(address)) ==
reserved_area_.address();
}
void* base() const { return reserved_area_.address(); }
private:
friend class v8::base::LeakyObject<CagedHeap>;
friend class testing::TestWithHeap;
explicit CagedHeap(PageAllocator& platform_allocator,
size_t desired_heap_size);
static CagedHeap* instance_;
const VirtualMemory reserved_area_;
// BoundedPageAllocator is thread-safe, no need to use external
// synchronization.
std::unique_ptr<AllocatorType> page_bounded_allocator_;
};
} // namespace internal
} // namespace cppgc
#endif // V8_HEAP_CPPGC_CAGED_HEAP_H_