#ifndef V8_HEAP_CPPGC_PREFINALIZER_HANDLER_H_
#define V8_HEAP_CPPGC_PREFINALIZER_HANDLER_H_
#include <utility>
#include <vector>
#include "include/cppgc/prefinalizer.h"
namespace cppgc {
namespace internal {
class HeapBase;
struct PreFinalizer final {
using Callback = PrefinalizerRegistration::Callback;
void* object;
Callback callback;
bool operator==(const PreFinalizer& other) const;
};
class PreFinalizerHandler final {
public:
explicit PreFinalizerHandler(HeapBase& heap);
void RegisterPrefinalizer(PreFinalizer pre_finalizer);
void InvokePreFinalizers();
bool IsInvokingPreFinalizers() const { return is_invoking_; }
void NotifyAllocationInPrefinalizer(size_t);
size_t ExtractBytesAllocatedInPrefinalizers() {
return std::exchange(bytes_allocated_in_prefinalizers, 0);
}
private:
bool CurrentThreadIsCreationThread();
std::vector<PreFinalizer> ordered_pre_finalizers_;
std::vector<PreFinalizer>* current_ordered_pre_finalizers_;
HeapBase& heap_;
bool is_invoking_ = false;
size_t bytes_allocated_in_prefinalizers = 0u;
};
}
}
#endif