1// Copyright 2020 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_HEAP_CPPGC_PROCESS_HEAP_H_ 6#define V8_HEAP_CPPGC_PROCESS_HEAP_H_ 7 8#include <vector> 9 10#include "src/base/macros.h" 11#include "src/base/platform/mutex.h" 12 13namespace cppgc { 14namespace internal { 15 16class HeapBase; 17 18extern v8::base::LazyMutex g_process_mutex; 19 20class V8_EXPORT_PRIVATE HeapRegistry final { 21 public: 22 using Storage = std::vector<HeapBase*>; 23 24 class Subscription final { 25 public: 26 inline explicit Subscription(HeapBase&); 27 inline ~Subscription(); 28 29 private: 30 HeapBase& heap_; 31 }; 32 33 static HeapBase* TryFromManagedPointer(const void* needle); 34 35 // Does not take the registry mutex and is thus only useful for testing. 36 static const Storage& GetRegisteredHeapsForTesting(); 37 38 private: 39 static void RegisterHeap(HeapBase&); 40 static void UnregisterHeap(HeapBase&); 41}; 42 43HeapRegistry::Subscription::Subscription(HeapBase& heap) : heap_(heap) { 44 HeapRegistry::RegisterHeap(heap_); 45} 46 47HeapRegistry::Subscription::~Subscription() { 48 HeapRegistry::UnregisterHeap(heap_); 49} 50 51} // namespace internal 52} // namespace cppgc 53 54#endif // V8_HEAP_CPPGC_PROCESS_HEAP_H_ 55