blob: 70df8f4a89dbd5ef9d53814c2abb51368157faa3 [file] [log] [blame]
// Copyright 2024 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 INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_
#define INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_
#include <stdint.h>
#include "v8-isolate.h"
namespace v8 {
/**
* This class is used to give V8 an indication of the amount of externally
* allocated memory that is kept alive by JavaScript objects. V8 uses this to
* decide when to perform garbage collections. Registering externally allocated
* memory will trigger garbage collections more often than it would otherwise in
* an attempt to garbage collect the JavaScript objects that keep the externally
* allocated memory alive. Instances of ExternalMemoryAccounter check that the
* reported external memory is back to 0 on destruction.
*/
class V8_EXPORT ExternalMemoryAccounter {
public:
/**
* Returns the amount of external memory registered for `isolate`.
*/
static int64_t GetTotalAmountOfExternalAllocatedMemoryForTesting(
const Isolate* isolate);
ExternalMemoryAccounter() = default;
~ExternalMemoryAccounter();
ExternalMemoryAccounter(ExternalMemoryAccounter&&);
ExternalMemoryAccounter& operator=(ExternalMemoryAccounter&&);
ExternalMemoryAccounter(const ExternalMemoryAccounter&) = delete;
ExternalMemoryAccounter& operator=(const ExternalMemoryAccounter&) = delete;
/**
* Reports an increase of `size` bytes of external memory.
*/
void Increase(Isolate* isolate, size_t size);
/**
* Reports an update of `delta` bytes of external memory.
*/
void Update(Isolate* isolate, int64_t delta);
/**
* Reports an decrease of `size` bytes of external memory.
*/
void Decrease(Isolate* isolate, size_t size);
private:
#ifdef V8_ENABLE_MEMORY_ACCOUNTING_CHECKS
size_t amount_of_external_memory_ = 0;
v8::Isolate* isolate_ = nullptr;
#endif
};
} // namespace v8
#endif // INCLUDE_EXTERNAL_MEMORY_ACCOUNTER_H_