diff --git a/src/net.cc b/src/net.cc index 1d8d094c84a..889bb40f135 100644 --- a/src/net.cc +++ b/src/net.cc @@ -269,6 +269,30 @@ Connection::v8ForceClose (const Arguments& args) return Undefined(); } +static void +free_buf (oi_buf *b) +{ + V8::AdjustAmountOfExternalAllocatedMemory(-b->len); + free(b); +} + +static oi_buf * +new_buf (size_t size) +{ + size_t total = sizeof(oi_buf) + size; + void *p = malloc(total); + if (p == NULL) return NULL; + + oi_buf *b = static_cast(p); + b->base = static_cast(p) + sizeof(oi_buf); + + b->len = size; + b->release = free_buf; + V8::AdjustAmountOfExternalAllocatedMemory(total); + + return b; +} + Handle Connection::v8Send (const Arguments& args) @@ -291,7 +315,7 @@ Connection::v8Send (const Arguments& args) // utf8 encoding Local s = args[0]->ToString(); size_t length = s->Utf8Length(); - oi_buf *buf = oi_buf_new2(length); + oi_buf *buf = new_buf(length); s->WriteUtf8(buf->base, length); connection->Send(buf); @@ -299,7 +323,7 @@ Connection::v8Send (const Arguments& args) // raw encoding Handle array = Handle::Cast(args[0]); size_t length = array->Length(); - oi_buf *buf = oi_buf_new2(length); + oi_buf *buf = new_buf(length); for (size_t i = 0; i < length; i++) { Local int_value = array->Get(Integer::New(i)); buf->base[i] = int_value->IntegerValue(); diff --git a/test-http_simple.js b/test-http_simple.js index 0e283e73e79..0a3f44b3a6c 100644 --- a/test-http_simple.js +++ b/test-http_simple.js @@ -17,6 +17,11 @@ new node.http.Server(function (msg) { } else if (command == "quit") { msg.connection.server.close(); + body = "quitting"; + + } else if (command == "fixed") { + body = "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; + } else { status = 404; body = "not found\n";