Skip to content

Commit

Permalink
buffer: report proper retained size in profiler
Browse files Browse the repository at this point in the history
Make buffers report the proper retained size in heap snapshots.

Before this commit, Buffer objects would show up in the heap profiler as being
only a few hundred bytes large, even if the actual buffer was many megabytes.
  • Loading branch information
bnoordhuis committed Oct 10, 2012
1 parent 87518f1 commit 6a128e0
Showing 1 changed file with 61 additions and 1 deletion.
62 changes: 61 additions & 1 deletion src/node_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "node_buffer.h"

#include "v8.h"
#include "v8-profiler.h"

#include <assert.h>
#include <stdlib.h> // malloc, free
Expand All @@ -33,9 +34,10 @@
# include <arpa/inet.h> // htons, htonl
#endif


#define MIN(a,b) ((a) < (b) ? (a) : (b))

#define BUFFER_CLASS_ID (0xBABE)

namespace node {

using namespace v8;
Expand Down Expand Up @@ -188,6 +190,7 @@ Buffer::Buffer(Handle<Object> wrapper, size_t length) : ObjectWrap() {

length_ = 0;
callback_ = NULL;
handle_.SetWrapperClassId(BUFFER_CLASS_ID);

Replace(NULL, length, NULL, NULL);
}
Expand Down Expand Up @@ -728,6 +731,61 @@ bool Buffer::HasInstance(v8::Handle<v8::Value> val) {
}


class RetainedBufferInfo: public v8::RetainedObjectInfo {
public:
RetainedBufferInfo(Buffer* buffer);
virtual void Dispose();
virtual bool IsEquivalent(RetainedObjectInfo* other);
virtual intptr_t GetHash();
virtual const char* GetLabel();
virtual intptr_t GetSizeInBytes();
private:
Buffer* buffer_;
static const char label[];
};

const char RetainedBufferInfo::label[] = "Buffer";


RetainedBufferInfo::RetainedBufferInfo(Buffer* buffer): buffer_(buffer) {
}


void RetainedBufferInfo::Dispose() {
buffer_ = NULL;
delete this;
}


bool RetainedBufferInfo::IsEquivalent(RetainedObjectInfo* other) {
return label == other->GetLabel() &&
buffer_ == static_cast<RetainedBufferInfo*>(other)->buffer_;
}


intptr_t RetainedBufferInfo::GetHash() {
return reinterpret_cast<intptr_t>(buffer_);
}


const char* RetainedBufferInfo::GetLabel() {
return label;
}


intptr_t RetainedBufferInfo::GetSizeInBytes() {
return Buffer::Length(buffer_);
}


RetainedObjectInfo* WrapperInfo(uint16_t class_id, Handle<Value> wrapper) {
assert(class_id == BUFFER_CLASS_ID);
assert(Buffer::HasInstance(wrapper));
Buffer* buffer = Buffer::Unwrap<Buffer>(wrapper.As<Object>());
return new RetainedBufferInfo(buffer);
}


void Buffer::Initialize(Handle<Object> target) {
HandleScope scope;

Expand Down Expand Up @@ -775,6 +833,8 @@ void Buffer::Initialize(Handle<Object> target) {
Buffer::MakeFastBuffer);

target->Set(String::NewSymbol("SlowBuffer"), constructor_template->GetFunction());

HeapProfiler::DefineWrapperClass(BUFFER_CLASS_ID, WrapperInfo);
}


Expand Down

0 comments on commit 6a128e0

Please sign in to comment.