Skip to content

Commit

Permalink
udp_wrap: use new slab allocator
Browse files Browse the repository at this point in the history
  • Loading branch information
bnoordhuis committed Mar 30, 2012
1 parent 1e13a2d commit 1ab95a5
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 36 deletions.
13 changes: 4 additions & 9 deletions lib/dgram.js
Original file line number Diff line number Diff line change
Expand Up @@ -343,16 +343,11 @@ Socket.prototype._stopReceiving = function() {
};


function onMessage(handle, nread, buf, rinfo) {
function onMessage(handle, slab, start, len, rinfo) {
var self = handle.socket;

if (nread == -1) {
self.emit('error', errnoException(errno, 'recvmsg'));
}
else {
rinfo.size = buf.length; // compatibility
self.emit('message', buf, rinfo);
}
if (!slab) return self.emit('error', errnoException(errno, 'recvmsg'));
rinfo.size = len; // compatibility
self.emit('message', slab.slice(start, start + len), rinfo);
}


Expand Down
56 changes: 29 additions & 27 deletions src/udp_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@

#include "node.h"
#include "node_buffer.h"

#include "slab_allocator.h"
#include "req_wrap.h"
#include "handle_wrap.h"

#include <stdlib.h>

#define SLAB_SIZE (1024 * 1024)

// Temporary hack: libuv should provide uv_inet_pton and uv_inet_ntop.
// Clean this up in tcp_wrap.cc too.
#if defined(__MINGW32__) || defined(_MSC_VER)
Expand Down Expand Up @@ -59,16 +61,17 @@ namespace node {
return scope.Close(Integer::New(-1)); \
}

// TODO share with tcp_wrap.cc
Persistent<String> address_symbol;
Persistent<String> port_symbol;
Persistent<String> buffer_sym;
typedef ReqWrap<uv_udp_send_t> SendWrap;

void AddressToJS(Handle<Object> info,
const sockaddr* addr,
int addrlen);

typedef ReqWrap<uv_udp_send_t> SendWrap;

static Persistent<String> address_symbol;
static Persistent<String> port_symbol;
static Persistent<String> buffer_sym;
static SlabAllocator slab_allocator(SLAB_SIZE);


class UDPWrap: public HandleWrap {
Expand Down Expand Up @@ -402,7 +405,9 @@ 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);
UDPWrap* wrap = static_cast<UDPWrap*>(handle->data);
char* buf = slab_allocator.Allocate(wrap->object_, suggested_size);
return uv_buf_init(buf, suggested_size);
}


Expand All @@ -413,32 +418,29 @@ void UDPWrap::OnRecv(uv_udp_t* handle,
unsigned flags) {
HandleScope scope;

if (nread == 0) {
free(buf.base);
UDPWrap* wrap = reinterpret_cast<UDPWrap*>(handle->data);
Local<Object> slab = slab_allocator.Shrink(wrap->object_,
buf.base,
nread < 0 ? 0 : nread);
if (nread == 0) return;

if (nread < 0) {
Local<Value> argv[] = { Local<Object>::New(wrap->object_) };
SetErrno(uv_last_error(uv_default_loop()));
MakeCallback(wrap->object_, "onmessage", ARRAY_SIZE(argv), argv);
return;
}

UDPWrap* wrap = reinterpret_cast<UDPWrap*>(handle->data);
Local<Object> rinfo = Object::New();
AddressToJS(rinfo, addr, sizeof(*addr));

Local<Value> argv[4] = {
Local<Value> argv[] = {
Local<Object>::New(wrap->object_),
Integer::New(nread),
Local<Value>::New(Null()),
Local<Value>::New(Null())
slab,
Integer::NewFromUnsigned(buf.base - Buffer::Data(slab)),
Integer::NewFromUnsigned(nread),
rinfo
};

if (nread == -1) {
SetErrno(uv_last_error(uv_default_loop()));
}
else {
Local<Object> rinfo = Object::New();
AddressToJS(rinfo, addr, sizeof *addr);
argv[2] = Local<Object>::New(
Buffer::New(buf.base, nread, NULL, NULL)->handle_);
argv[3] = rinfo;
}
free(buf.base);

MakeCallback(wrap->object_, "onmessage", ARRAY_SIZE(argv), argv);
}

Expand Down

0 comments on commit 1ab95a5

Please sign in to comment.