Browse Source

buffer: report proper retained size in profiler

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.
v0.8.12-release
Ben Noordhuis 12 years ago
parent
commit
6a128e037e
  1. 62
      src/node_buffer.cc

62
src/node_buffer.cc

@ -24,6 +24,7 @@
#include "node_buffer.h" #include "node_buffer.h"
#include "v8.h" #include "v8.h"
#include "v8-profiler.h"
#include <assert.h> #include <assert.h>
#include <stdlib.h> // malloc, free #include <stdlib.h> // malloc, free
@ -33,9 +34,10 @@
# include <arpa/inet.h> // htons, htonl # include <arpa/inet.h> // htons, htonl
#endif #endif
#define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b))
#define BUFFER_CLASS_ID (0xBABE)
namespace node { namespace node {
using namespace v8; using namespace v8;
@ -188,6 +190,7 @@ Buffer::Buffer(Handle<Object> wrapper, size_t length) : ObjectWrap() {
length_ = 0; length_ = 0;
callback_ = NULL; callback_ = NULL;
handle_.SetWrapperClassId(BUFFER_CLASS_ID);
Replace(NULL, length, NULL, NULL); Replace(NULL, length, NULL, NULL);
} }
@ -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) { void Buffer::Initialize(Handle<Object> target) {
HandleScope scope; HandleScope scope;
@ -775,6 +833,8 @@ void Buffer::Initialize(Handle<Object> target) {
Buffer::MakeFastBuffer); Buffer::MakeFastBuffer);
target->Set(String::NewSymbol("SlowBuffer"), constructor_template->GetFunction()); target->Set(String::NewSymbol("SlowBuffer"), constructor_template->GetFunction());
HeapProfiler::DefineWrapperClass(BUFFER_CLASS_ID, WrapperInfo);
} }

Loading…
Cancel
Save