mirror of
https://github.com/nodejs/node.git
synced 2026-10-29 10:45:11 +08:00
The binding data holds references to the AliasedBuffers directly from their wrappers which already ensures that the AliasedBuffers won't be accessed when the wrappers are GC'ed. So we can just make the global references to the AliasedBuffers weak. This way we can simply deserialize the typed arrays when deserialize the binding data and avoid the extra Object::Set() calls. It also eliminates the caveat in the JS land where aliased buffers must be dynamically read from the binding. PR-URL: https://github.com/nodejs/node/pull/47354 Refs: https://github.com/nodejs/node/issues/47353 Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
78 lines
2.0 KiB
C++
78 lines
2.0 KiB
C++
#ifndef SRC_NODE_V8_H_
|
|
#define SRC_NODE_V8_H_
|
|
|
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#include <sstream>
|
|
#include "aliased_buffer.h"
|
|
#include "base_object.h"
|
|
#include "json_utils.h"
|
|
#include "node_snapshotable.h"
|
|
#include "util.h"
|
|
#include "v8.h"
|
|
|
|
namespace node {
|
|
class Environment;
|
|
struct InternalFieldInfoBase;
|
|
|
|
namespace v8_utils {
|
|
class BindingData : public SnapshotableObject {
|
|
public:
|
|
struct InternalFieldInfo : public node::InternalFieldInfoBase {
|
|
AliasedBufferIndex heap_statistics_buffer;
|
|
AliasedBufferIndex heap_space_statistics_buffer;
|
|
AliasedBufferIndex heap_code_statistics_buffer;
|
|
};
|
|
BindingData(Realm* realm,
|
|
v8::Local<v8::Object> obj,
|
|
InternalFieldInfo* info = nullptr);
|
|
|
|
SERIALIZABLE_OBJECT_METHODS()
|
|
SET_BINDING_ID(v8_binding_data)
|
|
|
|
AliasedFloat64Array heap_statistics_buffer;
|
|
AliasedFloat64Array heap_space_statistics_buffer;
|
|
AliasedFloat64Array heap_code_statistics_buffer;
|
|
|
|
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
SET_SELF_SIZE(BindingData)
|
|
SET_MEMORY_INFO_NAME(BindingData)
|
|
|
|
private:
|
|
InternalFieldInfo* internal_field_info_ = nullptr;
|
|
};
|
|
|
|
class GCProfiler : public BaseObject {
|
|
public:
|
|
enum class GCProfilerState { kInitialized, kStarted, kStopped };
|
|
GCProfiler(Environment* env, v8::Local<v8::Object> object);
|
|
inline ~GCProfiler() override;
|
|
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Start(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
static void Stop(const v8::FunctionCallbackInfo<v8::Value>& args);
|
|
|
|
JSONWriter* writer();
|
|
|
|
std::ostringstream* out_stream();
|
|
|
|
SET_NO_MEMORY_INFO()
|
|
SET_MEMORY_INFO_NAME(GCProfiler)
|
|
SET_SELF_SIZE(GCProfiler)
|
|
|
|
uint64_t start_time;
|
|
uint8_t current_gc_type;
|
|
GCProfilerState state;
|
|
|
|
private:
|
|
std::ostringstream out_stream_;
|
|
JSONWriter writer_;
|
|
};
|
|
|
|
} // namespace v8_utils
|
|
|
|
} // namespace node
|
|
|
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
|
|
#endif // SRC_NODE_V8_H_
|