mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
wasi: use memory-tracking allocator
This:
- Protects against memory leaks in uvwasi.
- Allows tracking the allocated memory in heap dumps.
PR-URL: https://github.com/nodejs/node/pull/30745
Refs: 34ee0bc96f/src/node_mem.h
Refs: https://github.com/nodejs/quic/pull/126
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
0a7c874e9c
commit
a9abc17153
@ -1,6 +1,8 @@
|
||||
#include "env-inl.h"
|
||||
#include "base_object-inl.h"
|
||||
#include "debug_utils.h"
|
||||
#include "memory_tracker-inl.h"
|
||||
#include "node_mem-inl.h"
|
||||
#include "util-inl.h"
|
||||
#include "node.h"
|
||||
#include "uv.h"
|
||||
@ -85,14 +87,33 @@ WASI::WASI(Environment* env,
|
||||
Local<Object> object,
|
||||
uvwasi_options_t* options) : BaseObject(env, object) {
|
||||
MakeWeak();
|
||||
alloc_info_ = MakeAllocator();
|
||||
options->allocator = &alloc_info_;
|
||||
CHECK_EQ(uvwasi_init(&uvw_, options), UVWASI_ESUCCESS);
|
||||
}
|
||||
|
||||
|
||||
WASI::~WASI() {
|
||||
uvwasi_destroy(&uvw_);
|
||||
CHECK_EQ(current_uvwasi_memory_, 0);
|
||||
}
|
||||
|
||||
void WASI::MemoryInfo(MemoryTracker* tracker) const {
|
||||
tracker->TrackField("memory", memory_);
|
||||
tracker->TrackFieldWithSize("uvwasi_memory", current_uvwasi_memory_);
|
||||
}
|
||||
|
||||
void WASI::CheckAllocatedSize(size_t previous_size) const {
|
||||
CHECK_GE(current_uvwasi_memory_, previous_size);
|
||||
}
|
||||
|
||||
void WASI::IncreaseAllocatedSize(size_t size) {
|
||||
current_uvwasi_memory_ += size;
|
||||
}
|
||||
|
||||
void WASI::DecreaseAllocatedSize(size_t size) {
|
||||
current_uvwasi_memory_ -= size;
|
||||
}
|
||||
|
||||
void WASI::New(const FunctionCallbackInfo<Value>& args) {
|
||||
CHECK(args.IsConstructCall());
|
||||
|
@ -4,24 +4,22 @@
|
||||
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
||||
|
||||
#include "base_object.h"
|
||||
#include "memory_tracker-inl.h"
|
||||
#include "node_mem.h"
|
||||
#include "uvwasi.h"
|
||||
|
||||
namespace node {
|
||||
namespace wasi {
|
||||
|
||||
|
||||
class WASI : public BaseObject {
|
||||
class WASI : public BaseObject,
|
||||
public mem::NgLibMemoryManager<WASI, uvwasi_mem_t> {
|
||||
public:
|
||||
WASI(Environment* env,
|
||||
v8::Local<v8::Object> object,
|
||||
uvwasi_options_t* options);
|
||||
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
|
||||
void MemoryInfo(MemoryTracker* tracker) const override {
|
||||
/* TODO(cjihrig): Get memory consumption from uvwasi. */
|
||||
tracker->TrackField("memory", memory_);
|
||||
}
|
||||
|
||||
void MemoryInfo(MemoryTracker* tracker) const override;
|
||||
SET_MEMORY_INFO_NAME(WASI)
|
||||
SET_SELF_SIZE(WASI)
|
||||
|
||||
@ -79,6 +77,11 @@ class WASI : public BaseObject {
|
||||
|
||||
static void _SetMemory(const v8::FunctionCallbackInfo<v8::Value>& args);
|
||||
|
||||
// Implementation for mem::NgLibMemoryManager
|
||||
void CheckAllocatedSize(size_t previous_size) const;
|
||||
void IncreaseAllocatedSize(size_t size);
|
||||
void DecreaseAllocatedSize(size_t size);
|
||||
|
||||
private:
|
||||
~WASI() override;
|
||||
inline void readUInt8(char* memory, uint8_t* value, uint32_t offset);
|
||||
@ -92,6 +95,8 @@ class WASI : public BaseObject {
|
||||
uvwasi_errno_t backingStore(char** store, size_t* byte_length);
|
||||
uvwasi_t uvw_;
|
||||
v8::Global<v8::Object> memory_;
|
||||
uvwasi_mem_t alloc_info_;
|
||||
size_t current_uvwasi_memory_ = 0;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user