udp: remove slab allocator
authorBen Noordhuis <info@bnoordhuis.nl>
Mon, 26 Mar 2012 12:45:23 +0000 (05:45 -0700)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 30 Mar 2012 19:24:01 +0000 (21:24 +0200)
src/udp_wrap.cc

index 04b1df2..4143720 100644 (file)
@@ -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<String> address_symbol;
 Persistent<String> port_symbol;
 Persistent<String> buffer_sym;
-static Persistent<String> udp_slab_sym;
 
 void AddressToJS(Handle<Object> info,
                  const sockaddr* addr,
@@ -75,11 +71,6 @@ void AddressToJS(Handle<Object> info,
 typedef ReqWrap<uv_udp_send_t> 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<Object> target);
@@ -99,8 +90,6 @@ public:
   static Handle<Value> SetTTL(const Arguments& args);
 
 private:
-  static inline char* NewSlab(v8::Handle<v8::Object> global, v8::Handle<v8::Object> wrap_obj);
-
   UDPWrap(Handle<Object> object);
   virtual ~UDPWrap();
 
@@ -138,7 +127,6 @@ void UDPWrap::Initialize(Handle<Object> target) {
 
   HandleScope scope;
 
-  udp_slab_sym = Persistent<String>::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<UDPWrap*>(handle->data);
-
-  char* slab = NULL;
-
-  Handle<Object> global = Context::GetCurrent()->Global();
-  Local<Value> 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<Object> 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<uv_handle_t*>(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<UDPWrap*>(handle->data);
 
   Handle<Value> 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<Object> global,
-                                        Handle<Object> 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<Object> info,
                  const sockaddr* addr,