Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
smalloc: use malloc instead of new
Browse files Browse the repository at this point in the history
To use realloc the implementation had to be changed to use malloc/free.
  • Loading branch information
trevnorris committed Jul 3, 2013
1 parent ec90e6e commit fa10b75
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 17 deletions.
7 changes: 7 additions & 0 deletions src/node.cc
Expand Up @@ -1872,6 +1872,13 @@ static void OnFatalError(const char* location, const char* message) {
}


NO_RETURN void FatalError(const char* location, const char* message) {
OnFatalError(location, message);
// to supress compiler warning
abort();
}


void FatalException(Handle<Value> error, Handle<Message> message) {
HandleScope scope(node_isolate);

Expand Down
27 changes: 24 additions & 3 deletions src/node_buffer.cc
Expand Up @@ -142,7 +142,18 @@ Local<Object> New(size_t length) {
argv[1] = Uint32::New(length, node_isolate);
Local<Object> obj = p_buffer_fn->NewInstance(2, argv);

smalloc::Alloc(obj, new char[length], length);
// TODO(trevnorris): done like this to handle HasInstance since only checks
// if external array data has been set, but would like to use a better
// approach if v8 provided one.
char* data;
if (length > 0) {
data = static_cast<char*>(malloc(length));
if (data == NULL)
FatalError("node::Buffer::New(size_t)", "Out Of Memory");
} else {
data = NULL;
}
smalloc::Alloc(obj, data, length);

return scope.Close(obj);
}
Expand All @@ -163,8 +174,18 @@ Local<Object> New(const char* data, size_t length) {
argv[1] = Uint32::New(length, node_isolate);
Local<Object> obj = p_buffer_fn->NewInstance(2, argv);

char* new_data = new char[length];
memcpy(new_data, data, length);
// TODO(trevnorris): done like this to handle HasInstance since only checks
// if external array data has been set, but would like to use a better
// approach if v8 provided one.
char* new_data;
if (length > 0) {
new_data = static_cast<char*>(malloc(length));
if (new_data == NULL)
FatalError("node::Buffer::New(const char*, size_t)", "Out Of Memory");
memcpy(new_data, data, length);
} else {
new_data = NULL;
}

smalloc::Alloc(obj, new_data, length);

Expand Down
4 changes: 4 additions & 0 deletions src/node_internals.h
Expand Up @@ -76,8 +76,10 @@ inline static int snprintf(char* buf, unsigned int len, const char* fmt, ...) {

#if defined(__GNUC__) && __GNUC__ >= 4
# define MUST_USE_RESULT __attribute__((warn_unused_result))
# define NO_RETURN __attribute__((noreturn))
#else
# define MUST_USE_RESULT
# define NO_RETURN
#endif

// this would have been a template function were it not for the fact that g++
Expand All @@ -101,6 +103,8 @@ inline static v8::Handle<v8::Value> ThrowRangeError(const char* errmsg) {
THROW_ERROR(v8::Exception::RangeError);
}

NO_RETURN void FatalError(const char* location, const char* message);

#define UNWRAP(type) \
assert(!args.This().IsEmpty()); \
assert(args.This()->InternalFieldCount() > 0); \
Expand Down
13 changes: 8 additions & 5 deletions src/smalloc.cc
Expand Up @@ -142,14 +142,17 @@ Handle<Value> Alloc(const Arguments& args) {
void Alloc(Handle<Object> obj, size_t length) {
assert(length <= kMaxLength);

char* data = new char[length];
if (length == 0)
return Alloc(obj, NULL, length);

char* data = static_cast<char*>(malloc(length));
if (data == NULL)
FatalError("node::smalloc::Alloc(Handle<Object>, size_t)", "Out Of Memory");
Alloc(obj, data, length);
}


void Alloc(Handle<Object> obj, char* data, size_t length) {
assert(data != NULL);

Persistent<Object> p_obj(node_isolate, obj);

node_isolate->AdjustAmountOfExternalAllocatedMemory(length);
Expand All @@ -166,7 +169,7 @@ void TargetCallback(Isolate* isolate, Persistent<Object>* target, char* data) {
int len = (*target)->GetIndexedPropertiesExternalArrayDataLength();
if (data != NULL && len > 0) {
isolate->AdjustAmountOfExternalAllocatedMemory(-len);
delete[] data;
free(data);
}
(*target).Dispose();
(*target).Clear();
Expand All @@ -189,7 +192,7 @@ void AllocDispose(Handle<Object> obj) {
obj->SetIndexedPropertiesToExternalArrayData(NULL,
kExternalUnsignedByteArray,
0);
delete[] data;
free(data);
node_isolate->AdjustAmountOfExternalAllocatedMemory(-length);
}

Expand Down
13 changes: 8 additions & 5 deletions src/stream_wrap.cc
Expand Up @@ -580,7 +580,12 @@ void StreamWrapCallbacks::AfterWrite(WriteWrap* w) {

uv_buf_t StreamWrapCallbacks::DoAlloc(uv_handle_t* handle,
size_t suggested_size) {
return uv_buf_init(new char[suggested_size], suggested_size);
char* data = static_cast<char*>(malloc(suggested_size));
if (data == NULL && suggested_size > 0) {
FatalError("node::StreamWrapCallbacks::DoAlloc(uv_handle_t*, size_t)",
"Out Of Memory");
}
return uv_buf_init(data, suggested_size);
}


Expand All @@ -592,20 +597,18 @@ void StreamWrapCallbacks::DoRead(uv_stream_t* handle,

if (nread < 0) {
if (buf.base != NULL)
delete[] buf.base;

free(buf.base);
SetErrno(uv_last_error(uv_default_loop()));
MakeCallback(Self(), onread_sym, 0, NULL);
return;
}

if (nread == 0) {
if (buf.base != NULL)
delete[] buf.base;
free(buf.base);
return;
}

// TODO(trevnorris): not kosher to use new/delete w/ realloc
buf.base = static_cast<char*>(realloc(buf.base, nread));

assert(static_cast<size_t>(nread) <= buf.len);
Expand Down
12 changes: 8 additions & 4 deletions src/udp_wrap.cc
Expand Up @@ -371,7 +371,12 @@ void UDPWrap::OnSend(uv_udp_send_t* req, int status) {


uv_buf_t UDPWrap::OnAlloc(uv_handle_t* handle, size_t suggested_size) {
return uv_buf_init(new char[suggested_size], suggested_size);
char* data = static_cast<char*>(malloc(suggested_size));
if (data == NULL && suggested_size > 0) {
FatalError("node::UDPWrap::OnAlloc(uv_handle_t*, size_t)",
"Out Of Memory");
}
return uv_buf_init(data, suggested_size);
}


Expand All @@ -386,7 +391,7 @@ void UDPWrap::OnRecv(uv_udp_t* handle,

if (nread < 0) {
if (buf.base != NULL)
delete[] buf.base;
free(buf.base);
Local<Value> argv[] = { Local<Object>::New(node_isolate, wrap->object_) };
SetErrno(uv_last_error(uv_default_loop()));
MakeCallback(wrap->object_, onmessage_sym, ARRAY_SIZE(argv), argv);
Expand All @@ -395,11 +400,10 @@ void UDPWrap::OnRecv(uv_udp_t* handle,

if (nread == 0) {
if (buf.base != NULL)
delete[] buf.base;
free(buf.base);
return;
}

// TODO(trevnorris): not kosher to use new/delete w/ realloc
buf.base = static_cast<char*>(realloc(buf.base, nread));

Local<Value> argv[] = {
Expand Down

0 comments on commit fa10b75

Please sign in to comment.