diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 04b1df223c..4143720cd2 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -59,14 +59,10 @@ namespace node { return scope.Close(Integer::New(-1)); \ } -#define SLAB_SIZE (1024 * 1024) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - // TODO share with tcp_wrap.cc Persistent address_symbol; Persistent port_symbol; Persistent buffer_sym; -static Persistent udp_slab_sym; void AddressToJS(Handle info, const sockaddr* addr, @@ -75,11 +71,6 @@ void AddressToJS(Handle info, typedef ReqWrap SendWrap; -static size_t slab_used; -size_t slab_offset_; -static uv_handle_t* handle_that_last_alloced; - - class UDPWrap: public HandleWrap { public: static void Initialize(Handle target); @@ -99,8 +90,6 @@ public: static Handle SetTTL(const Arguments& args); private: - static inline char* NewSlab(v8::Handle global, v8::Handle wrap_obj); - UDPWrap(Handle object); virtual ~UDPWrap(); @@ -138,7 +127,6 @@ void UDPWrap::Initialize(Handle target) { HandleScope scope; - udp_slab_sym = Persistent::New(String::NewSymbol("udpslab")); buffer_sym = NODE_PSYMBOL("buffer"); port_symbol = NODE_PSYMBOL("port"); address_symbol = NODE_PSYMBOL("address"); @@ -414,44 +402,7 @@ void UDPWrap::OnSend(uv_udp_send_t* req, int status) { uv_buf_t UDPWrap::OnAlloc(uv_handle_t* handle, size_t suggested_size) { - HandleScope scope; - - UDPWrap* wrap = static_cast(handle->data); - - char* slab = NULL; - - Handle global = Context::GetCurrent()->Global(); - Local slab_v = global->GetHiddenValue(udp_slab_sym); - - if (slab_v.IsEmpty()) { - // No slab currently. Create a new one. - slab = NewSlab(global, wrap->object_); - } else { - // Use existing slab. - Local slab_obj = slab_v->ToObject(); - slab = Buffer::Data(slab_obj); - assert(Buffer::Length(slab_obj) == SLAB_SIZE); - assert(SLAB_SIZE >= slab_used); - - // If less than 64kb is remaining on the slab allocate a new one. - if (SLAB_SIZE - slab_used < 64 * 1024) { - slab = NewSlab(global, wrap->object_); - } else { - wrap->object_->SetHiddenValue(udp_slab_sym, slab_obj); - } - } - - uv_buf_t buf; - buf.base = slab + slab_used; - buf.len = MIN(SLAB_SIZE - slab_used, suggested_size); - - slab_offset_ = slab_used; - slab_used += buf.len; - - handle_that_last_alloced = reinterpret_cast(handle); - - return buf; - + return uv_buf_init(new char[suggested_size], suggested_size); } @@ -460,12 +411,13 @@ void UDPWrap::OnRecv(uv_udp_t* handle, uv_buf_t buf, struct sockaddr* addr, unsigned flags) { + HandleScope scope; + if (nread == 0) { + free(buf.base); return; } - HandleScope scope; - UDPWrap* wrap = reinterpret_cast(handle->data); Handle argv[4] = { @@ -484,19 +436,11 @@ void UDPWrap::OnRecv(uv_udp_t* handle, argv[2] = Buffer::New(buf.base, nread, NULL, NULL)->handle_; argv[3] = rinfo; } + free(buf.base); MakeCallback(wrap->object_, "onmessage", ARRAY_SIZE(argv), argv); } -inline char* UDPWrap::NewSlab(Handle global, - Handle wrap_obj) { - Buffer* b = Buffer::New(SLAB_SIZE); - global->SetHiddenValue(udp_slab_sym, b->handle_); - assert(Buffer::Length(b) == SLAB_SIZE); - slab_used = 0; - wrap_obj->SetHiddenValue(udp_slab_sym, b->handle_); - return Buffer::Data(b); -} void AddressToJS(Handle info, const sockaddr* addr,