diff options
-rw-r--r-- | lib/_http_common.js | 3 | ||||
-rw-r--r-- | lib/freelist.js | 2 | ||||
-rw-r--r-- | src/node_http_parser.cc | 12 |
3 files changed, 15 insertions, 2 deletions
diff --git a/lib/_http_common.js b/lib/_http_common.js index b5995476e5..f3d9d4a2eb 100644 --- a/lib/_http_common.js +++ b/lib/_http_common.js @@ -200,7 +200,8 @@ function freeParser(parser, req) { parser.socket.parser = null; parser.socket = null; parser.incoming = null; - parsers.free(parser); + if (parsers.free(parser) === false) + parser.close(); parser = null; } if (req) { diff --git a/lib/freelist.js b/lib/freelist.js index 61a3f78f64..588facd25b 100644 --- a/lib/freelist.js +++ b/lib/freelist.js @@ -39,5 +39,7 @@ exports.FreeList.prototype.free = function(obj) { //debug("free " + this.name + " " + this.list.length); if (this.list.length < this.max) { this.list.push(obj); + return true; } + return false; }; diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index 04b86097ef..8d9b66ed06 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -169,12 +169,14 @@ class Parser : public BaseObject { : BaseObject(env, wrap), current_buffer_len_(0), current_buffer_data_(NULL) { - MakeWeak<Parser>(this); + Wrap(object(), this); Init(type); } ~Parser() { + ClearWrap(object()); + persistent().Reset(); } @@ -357,6 +359,13 @@ class Parser : public BaseObject { } + static void Close(const FunctionCallbackInfo<Value>& args) { + HandleScope handle_scope(args.GetIsolate()); + Parser* parser = Unwrap<Parser>(args.Holder()); + delete parser; + } + + void Save() { url_.Save(); status_message_.Save(); @@ -591,6 +600,7 @@ void InitHttpParser(Handle<Object> target, #undef V t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "methods"), methods); + NODE_SET_PROTOTYPE_METHOD(t, "close", Parser::Close); NODE_SET_PROTOTYPE_METHOD(t, "execute", Parser::Execute); NODE_SET_PROTOTYPE_METHOD(t, "finish", Parser::Finish); NODE_SET_PROTOTYPE_METHOD(t, "reinitialize", Parser::Reinitialize); |